2015-03-19 112 views
3

我很努力地找出如何覆盖Ansible模块选项默认值,而无需用变量手动滚动它。更好的是,如果有一种方法可以覆盖仅适用于一部分主机的模块选项默认值。覆盖Ansible模块选项默认值

在情侣主机上说,Git可以在/bin/git处得到,如预期的那样。在其他几台主机上,Git的地址是/usr/local/bin/git。如何覆盖git模块executable选项默认的后一组主机?

目前我设置一个主机组变量,如:

git_executable=/usr/local/bin/git 

,并使用它与default(omit)过滤到处git使用像这样:

- git: "executable={{git_executable|default(omit)}} ..." 

所以它得到正确的覆写主机在哪里定义,并在其他方面被忽略。

executable可能不是最好的例子,因为这可能是由PATH环境变量或其他东西控制。那么一般情况下,我想为一些主机重写任何类型的模块选项,但是否则会回到模块默认值?

既然有对夫妇更多的在这样的环境这样的基本差异,这是相当繁琐洒这种默认的使用查找变量遍布以防万一它被使用非默认安装在主机上运行的地方。有没有办法做得更好?

回答

1

我不认为有更好的选择。模块只知道你传给他们的东西。除非您明确地将其作为模块参数传递,否则他们无法访问全局变量,服务器事实或其他任何内容。

如果这真的很重要,你想投入一些时间,你可以创建自己的动作插件。 Action插件是本地动作,因此可以访问Ansible runnerc类及其所有属性,包括事实等。因此,您可以根据服务器事实处理默认参数或可执行检测,然后以编程方式调用git或任何其他模块。在我看来巨大的开销,但这取决于观点,并可能在你的目的是可行的。

虽然保重,行动插件是100%无证。 Ansible 2.0将在未来几天发布。他们声称100%向后兼容,但我不会感到惊讶,如果只有记录的功能。

1

在这种特定的情况下,只要它在PATH或 '/ sbin目录', '/ usr/sbin目录',git.executable '在/ usr/local/sbin中',因为它使用了basic.get_bin_path()

git模块会发现它在更大的话题上,我个人会选择你已经做过的事情。但是,如果你愿意的话,另一个可能的破解就是[错误]使用include语句为每个模块创建一个包装器,该包装器提供某个变量所需的默认值。 很显然,你必须在group_vars或host/role/... vars中自己指定路径。或者在剧本的vars部分中定义的变量。

$ cat my_echo.yml 

- shell: "{{echo_exec}} '{{text}}'" 

$ cat playbook.yml 
- hosts: localhost 
    tags: so 
    gather_facts: False 
    vars: 
    echo_exec: echo 
    tasks: 
    - include: my_echo.yml text='some text' 
    changed_when: False 

- hosts: localhost 
    tags: so 
    gather_facts: False 
    vars: 
    echo_exec: printf 
    tasks: 
    - include: my_echo.yml text='some text' 
    changed_when: False 

$ ansible-playbook playbook.yml -t so -v 

PLAY [localhost] ************************************************************** 

TASK: [shell {{echo_exec}} '{{text}}'] **************************************** 
changed: [localhost] => {"changed": true, "cmd": "echo 'some text'", "delta": "0:00:00.003782", "end": "2015-03-20 17:45:58.352069", "rc": 0, "start": "2015-03-20 17:45:58.348287", "stderr": "", "stdout": "some text", "warnings": []} 

PLAY [localhost] ************************************************************** 

TASK: [shell {{echo_exec}} '{{text}}'] **************************************** 
changed: [localhost] => {"changed": true, "cmd": "printf 'some text'", "delta": "0:00:00.003705", "end": "2015-03-20 17:45:58.690657", "rc": 0, "start": "2015-03-20 17:45:58.686952", "stderr": "", "stdout": "some text", "warnings": []} 

PLAY RECAP ******************************************************************** 
localhost     : ok=2 changed=2 unreachable=0 failed=0 

$