覆盖Ansible模块选项默认值

时间:2015-03-19 09:07:55

标签: module default default-value 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环境变量或其他内容来控制。那么一般来说,我想覆盖一些主机的任何类型的模块选项怎么样,但是否则会回到模块默认值?

由于在这种环境中存在更多这样的基本差异,所以在整个地方使用变量进行这种默认查找是相当繁琐的,以防它在非主机上运行 - 默认设置。有没有办法更好地做到这一点?

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

在这个特定情况git.executable中,只要它在PATH或'/ sbin','/ usr / sbin','/ usr / local / sbin'git模块就会找到它,因为它使用basic.get_bin_path()

在更大的话题上,我个人会说你已经做过的事情。但是,如果您对此另有攻击,另一个可能的黑客就是[错误]使用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   

$