我正在使用以编程方式生成的 Ansible 剧本。一般来说,因为 playbook 只是 YAML,所以这很简单。但是,当使用“简单”key=value
表单时,剧本不是纯shlex
YAML——它们包含嵌入可解析表单的内容。
为了避免这种形式的歧义(是key=value
对命令的参数还是 ansible 的参数?),并且只有一种格式可以解析和生成,我无条件地使用ansible中示例演示的复杂 args 机制-示例存储库。
这使用以下类型的语法:
action: module-name
args:
key1: value1
key2: value2
...这很好。但是,当尝试将这种形式用于shell
orcommand
模块时(其文档将实际命令描述为在名为 的参数中传递free_form
),这效果不佳:
action: shell
args:
free_form: echo hello_world >/tmp/something
creates: /tmp/something
调用时,它将运行以下内容:
/bin/sh -c " free_form='echo hello_world >/tmp/something' "
...这不是我想要完成的。
使用纯 YAML 语法采用“自由格式”命令的 Ansible 模块的正确方法是什么?
简短回答:不要使用
command
、raw
、script
或shell
模块。编写您自己的模块,将命令作为“正常”参数接受。长答案:
在大多数情况下,您可以这样做:
但是,这在某些极端情况下会失败:
我不知道处理此问题的一般方法,但特定于 bash 的解决方案是:
现在在Ansible 文档中解决了这个问题。
请注意,没有名为“free_form”的参数。