我想知道是否
- shell: >
hostname;
whoami;
和
- shell: "{{item}}"
with_items: ['hostname', 'whoami']
相同吗?在第二个示例中,Ansible将始终为两个命令(hostname,whoami)使用相同的SSH连接?
在我看来,这是错误的......
- shell: "{{item}}"
with_items: ['export miavar=PIPPO', 'echo $miavar']
(item=export miavar=PIPPO) => {"changed": true, "cmd": "export miavar=PIPPO", "stdout": ""}
(item=echo $miavar) => {"changed": true, "cmd": "echo $miavar", "stdout": ""}
- ansible 2.1.1.0
的Riccardo
答案 0 :(得分:5)
Ansible将每个循环迭代作为单独的运行运行,因此您最终会得到不同的ssh会话。
ANSIBLE_SQUASH_ACTIONS变量中描述了一些例外情况:
"apk, apt, dnf, package, pacman, pkgng, yum, zypper"
这些模块非常智能,可以将所有项目压缩成一个任务调用。
答案 1 :(得分:0)
如前一个答案所述,with_items使ansible运行单独的循环迭代。此功能的另一个好处是可调试性esp。如果在一个shell任务下链接了许多命令。例如:对于以上情况,ansible会在内部将其运行为:
- shell: "{{item}}"
with_items: ['hostname', 'whoami']
等效于:
- shell: 'hostname:
- shell: 'whoami'
由于它分为两个单独的任务,因此如果其中一个失败,则ansible将指向确切的失败任务(命令),而不是整个链。
答案 2 :(得分:0)
只需将命令列表添加到变量中,然后在需要执行命令的位置替换该变量即可。
vars:
shell_cmd:
- "hostname &&"
- whoami
tasks:
- shell: "{{shell_cmd}}"
享受!