2017-07-15 21 views
1

我希望执行Salt状态的时候并不总是在另一个状态发生更改时发生,但仅适用于特定的更改。这看起来像我必须使onchanges/onchanges_in取决于具体的变化。根据已更改的内容制作salt'onchanges`必需条件

The respective bug report已关闭,称“现在状态已完全解决,州可以访问正在运行的运行字典和低状态”。但是,我没有找到任何文件,也没有任何关于“运行字典”的解释。

所以我想这个问题也可以改写为“我如何访问onchanges必要条件中的'运行字典'?”,但我愿意接受针对原始问题的任何解决方案。谢谢你的帮助!


更新:注释问一个具体的例子,所以这里是我的使用情况:由于大多数国家的模块,user.present既可以现有的(用户)对象的更新域或创建一个新的。然后,我想运行第二个状态模块,当且仅当特定字段已更改和/或刚创建对象时。在Ansible中,为了比较,我想register a variable并通过它访问模块的结果。

那么,我为什么要这样做呢?

本质上,我想在Linux上创建用户帐户,并让他们能够设置自己的密码(通过SSH密钥登录时)。 user.present支持empty_password为此目的,但它不与enforce_password很好地发挥。这意味着在手动设置密码后,重复的状态运行将再次清除该密码。有人甚至可以认为这是Salt中的一个错误,但不同的user.present字段之间的相互作用是错综复杂且有争议的。

我的解决方案是先创建帐户,然后运行module.run状态,然后执行shadow.del_password。这是通过onchanges_in必要条件实现的。但是,不应该为任何更改而触发删除密码,但只有在创建用户帐户时才会触发,这也是我的状态仅触摸密码的唯一情况。否则,将用户添加到组中将会清除密码。为此,我想我将不得不查看user.present更改的详细信息。

Create user account for dummy: 
    user.present: 
    - name: dummy 
    - gid_from_name: True 
    - remove_groups: False 
    # TODO: This should be made more specific 
    - onchanges_in: 
     - module: Allow dummy to set a password 

Allow dummy to set a password: 
    module.run: 
    - name: shadow.del_password 
    - m_name: dummy 
    # Make sure that this is not executed accidentally if no `onchanges_in` is present 
    - onchanges: [] 
    - require: 
     - user: Create user account for dummy 
+0

请你把这个问题更具体的写你想要解决(什么样的变化的问题,什么样的行动?) – ahus1

+0

@ ahus1我已经添加了一个详细的用例示例。 – F30

回答

2

我不知道具体的onchanges或“跑字典”,但是,对于您的特定用途的情况下,可以使用条件,以使您的密码,结算状态,仅在需要时,如:

Create user account for dummy: 
    user.present: 
    - name: dummy 
    - gid_from_name: True 
    - remove_groups: False 

{% if salt['user.info']('dummy') == {} %} 
# Only clear the password if the account didn't exist before 
Allow dummy to set a password: 
    module.run: 
    - name: shadow.del_password 
    - m_name: dummy 
    - require: 
     - user: Create user account for dummy 
{% endif %} 
+1

这感觉有点不好,不能完全泛化,但我想这是针对特定问题的最好的已知解决方案。 – F30

0

我想你在这种情况下要使用的是module.wait而不是module.run。默认情况下,module.wait不会做任何事情,除非有其他问题。另外,onchanges_in出于某种原因(我认为this issue)对我而言不适合module.wait。我试过watch_in,它完成了这项工作。

我试过下面的代码,它似乎工作得很好。它创建一个密码为空的用户时,如果用户已经在那里没有任何改变:

Create user account for dummy: 
    user.present: 
    - name: dummy 
    - gid_from_name: True 
    - remove_groups: False 
    # TODO: This should be made more specific 
    - watch_in: 
     - module: Allow dummy to set a password 

Allow dummy to set a password: 
    module.wait: 
    - name: shadow.del_password 
    - m_name: dummy 
    - require: 
     - user: Create user account for dummy 
+0

这仍然存在每次用户帐号发生变化时都执行'shadow.del_password'的问题,例如,将它添加到一个组(确实不是我最小的例子,但在实际的代码中)。 – F30

+0

关于'onchanges'和'run'与'watch'和'wait',有一个[盐开发者的声明](https://github.com/saltstack/salt/issues/29492#issuecomment-162967147)从2015年宣布'等待'状态将被弃用。 (在[此邮件列表主题]之前(http://grokbase.com/t/gg/salt-users/152q47sx85/should-wait-sates-be-deprecated-in-favor-of-onchanges)。) – F30

+1

对不起,你说得对,我误解了你的问题。在这种情况下,我认为它不是@ christophe-drevet-droguet建议的就是写一个python状态。 – alexK