Module 覆盖Ansible模块选项默认值

Module 覆盖Ansible模块选项默认值,module,default,default-value,ansible,Module,Default,Default Value,Ansible,我正在努力找出如何在不使用变量手动滚动的情况下覆盖Ansible模块选项默认值。如果有一种方法只覆盖一部分主机的模块选项默认值,那就更好了 如预期的那样,在成对主机上可以使用Git,网址为/bin/Git。在其他几台主机上,Git位于/usr/local/bin/Git。如何覆盖后一组主机的git模块executable选项默认值 目前,我正在设置一个hosts组变量,如: git_executable=/usr/local/bin/git 将其与default(省略)filter every

我正在努力找出如何在不使用变量手动滚动的情况下覆盖Ansible模块选项默认值。如果有一种方法只覆盖一部分主机的模块选项默认值,那就更好了

如预期的那样,在成对主机上可以使用Git,网址为
/bin/Git
。在其他几台主机上,Git位于
/usr/local/bin/Git
。如何覆盖后一组主机的
git
模块
executable
选项默认值

目前,我正在设置一个hosts组变量,如:

git_executable=/usr/local/bin/git
将其与
default(省略)
filter everywhere
git
一起使用,如下所示:

- git: "executable={{git_executable|default(omit)}} ..."
因此,它在定义它的主机上被正确覆盖,而在其他主机上被忽略

可执行文件
可能不是这里的最佳示例,因为它可能由
路径
环境变量或其他东西控制。那么,一般来说,我只想为某些主机覆盖任何类型的模块选项,但在其他情况下返回到模块默认值呢


由于在这个环境中有更多这样的基本差异,因此在所有地方使用变量来散布这种默认查找是非常繁琐的,以防它在具有非默认设置的主机上运行。有没有更好的方法呢?

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

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


尽管要小心,操作插件是100%没有文档的。Ansible 2.0将在未来几天发布。他们声称100%向后兼容,但如果这只包括文档化的特性,我也不会感到惊讶。

在这种特定情况下,
git.executable
只要它位于路径或'/sbin'、'/usr/sbin'、'/usr/local/sbin'
git
模块就会找到它,因为它使用

在更大的问题上,我个人同意你已经做过的。但是,如果您执意于此,另一个可能的攻击就是[mis]使用
include
语句为每个模块创建一个包装器,该包装器提供您希望从某个变量获得的默认值。 显然,您必须在group_vars或host/role/中自己指定路径。。。瓦尔斯。或在游戏的
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   

$