Ansible:将命令参数作为列表传递

时间:2018-04-12 14:47:23

标签: ansible

我想将多个参数作为列表存储在变量中。

join

然后将列表作为引用参数传递给命令。最明显的tasks: - command: printf '%s\n' "{{ my_args | join(' ') }}" ... changed: [localhost] => { "changed": true, "cmd": [ "printf", "%s\\n", " --quiet --verbose --verify " ], STDOUT: --quiet --verbose --verify 过滤器不能像我预期的那样工作。它生成一个包含所有列表元素的单词,而不是每个列表元素一个单词:

map('quote') | join(' ')

如何将它们传递给命令?

1 个答案:

答案 0 :(得分:2)

要将列表元素作为参数传递给模块,请使用for过滤器或tasks: - name: Pass a list as arguments to a command using filters command: executable {{ my_args | map('quote') | join(' ') }} - name: Pass a list as arguments to a command using for loop command: executable {% for arg in my_args %} "{{ arg }}" {% endfor %} 循环:

for

不要在过滤器中使用引号,但使用循环使用。虽然稍微长一点,但"prefix {{ item }} suffix"循环提供了更多塑造输出的可能性。例如,为loop.*等列表项添加前缀或后缀,或者对项目应用过滤器,甚至使用tasks: - command: printf '%s\n' {{ my_args | map('quote') | join(' ') }} - command: printf '%s\n' {% for arg in my_args %} "{{ arg }}" {% endfor %} ... changed: [localhost] => { "changed": true, "cmd": [ "printf", "%s\\n", "--quiet", "--verbose", "--verify" ], STDOUT: --quiet --verbose --verify variables选择性地处理项目。

有问题的例子是:

vars:
  my_args:
    - --dir={{ my_dir }}
    - {% if my_option is defined %} --option={{ my_option }} {% endif %}

列表元素不仅限于简单的字符串,还可以包含一些逻辑:

{{1}}