Ansible 2.9.9在W2K16 Server环境下实现win_shell命令一次性传入列表所有元素值的方法问询
解决Ansible中win_shell一次性传入多列表值的问题
嗨,我懂你的需求——你不想通过循环多次执行win_shell命令,而是要把列表里的多个值合并成一个参数,一次性完成命令执行。这里有个通用且简单的方法,完全符合你的要求:
使用Ansible的join过滤器拼接列表
Ansible的join过滤器可以把列表中的元素用指定的分隔符拼接成一个字符串,正好能满足你把多个NTP服务器IP合并成命令所需格式的需求。
示例代码1:提前定义变量
- name: "Configure NTP peers in one go" win_shell: | w32tm /config /manualpeerlist:"{{ ntp_servers | join(' ') }}" /syncfromflags:MANUAL vars: ntp_servers: - 192.168.0.1 - 192.168.0.10 - 192.168.0.100
示例代码2:直接在模板中写列表
如果你不想单独定义变量,也可以直接把列表写在模板里:
- name: "Configure NTP peers in one go" win_shell: | w32tm /config /manualpeerlist:"{{ ['192.168.0.1', '192.168.0.10', '192.168.0.100'] | join(' ') }}" /syncfromflags:MANUAL
原理说明
join(' ')会把列表里的每个IP用空格分隔开,最终生成的命令就是你期望的:
w32tm /config /manualpeerlist:"192.168.0.1 192.168.0.10 192.168.0.100" /syncfromflags:MANUAL
而且这个任务只会执行一次,完全避免了循环带来的多次命令调用。
如果后续你遇到需要用其他分隔符的场景(比如逗号),只需要把join(' ')改成join(',')就行,这个方法适用于所有需要将列表转成字符串参数的命令场景。
内容的提问来源于stack exchange,提问作者CH06
相关产品推荐
相关产品推荐

