python 在自定义执行模块中未更新支柱数据

o8x7eapl  于 2023-02-18  发布在  Python
关注(0)|答案(1)|浏览(105)

我正在编写一个自定义Salt执行模块,该模块针对状态文件运行一些基本测试,这些状态文件包含一个具有不同测试和参数的YAML文件。该模块将读取这些YAML文件,并根据测试要求设置粒度,然后使用提供的粒度数据针对状态运行state.show_sls。在我需要从pillar获取一些内容之前,该模块一直运行良好。然而柱子的数据从来没有根据新的颗粒集得到更新。我们也运行了一个无主设置,所以奴才做了所有的工作。

# pillar/top.sls
base:
  'G@roles:bind and G@location:MyTown':
    - match: compound
    - bind.MyTown

在我的执行模块中,我设置:

#_/modules/my_execution_module.py
def all():
    tests = _get_tests()
    for test in tests:
        __grains__.update(test['grains'])
        __pillar__.update(__grains__)
        print(__salt__['grains.get']('roles'))      # Comes back with expected data.
        print(__salt__['grains.get']('location'))   # Comes back with expected data.
        print(__salt__['pillar.get']('bind_conf'))  # This comes back as blank.
        __salt__['state.show_sls'](test['state'])

运行相同的测试,但单独运行所有salt命令来设置颗粒并打印颗粒/支柱信息,这与预期的一样。只有在这个自定义模块中,当它设置颗粒时,不会更新支柱信息。

salt-call.bat --versions
Salt Version:
          Salt: 3004.1

Dependency Versions:
          cffi: 1.14.6
      cherrypy: 18.6.1
      dateutil: 2.8.1
     docker-py: Not Installed
         gitdb: 4.0.7
     gitpython: 3.1.18
        Jinja2: 2.10.1
       libgit2: Not Installed
      M2Crypto: Not Installed
          Mako: 1.1.4
       msgpack: 0.6.2
  msgpack-pure: Not Installed
  mysql-python: Not Installed
     pycparser: 2.20
      pycrypto: Not Installed
  pycryptodome: 3.10.1
        pygit2: Not Installed
        Python: 3.8.8 (tags/v3.8.8:024d805, Feb 19 2021, 13:18:16) [MSC v.1928 64 bit (AMD64)]
  python-gnupg: 0.4.7
        PyYAML: 5.4.1
         PyZMQ: 19.0.0
         smmap: 4.0.0
       timelib: 0.2.4
       Tornado: 4.5.3
           ZMQ: 4.3.2

System Versions:
          dist:
        locale: cp1252
       machine: AMD64
       release: 10
        system: Windows
       version: 10 10.0.22621 SP0 Multiprocessor Free
2hh7jdfx

2hh7jdfx1#

颗粒和柱状物都被高速缓存,并且刷新是异步的。
在更改颗粒后运行该命令应该会有效:

__salt__["saltutil.refresh_grains"](refresh_pillar=False)
__salt__["saltutil.refresh_pillar"](wait=True)

尝试将颗粒添加到柱子(__pillar__.update(__grains__))中是行不通的。它总是被最新编译的柱子替换。
更多信息:www.example.comhttps://docs.saltproject.io/en/3005/topics/pillar/#in-memory-pillar-data-vs-on-demand-pillar-data
事实证明,在无主机设置中,刷新永远不会完成,因为没有主机来完成刷新。
像这样的黑客工程,但你需要多一点的情况下,新的支柱有一些关键删除。

__pillar__.update(__salt__["pillar.items"]())

考虑一下在无主设置中是否确实需要pillar,或者它是否可以是一个runner或orchestration,而不是一个执行模块。

相关问题