Ansible shell和with_items

时间:2016-09-30 09:00:32

标签: shell ansible

我想知道是否

  - 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

3 个答案:

答案 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将指向确切的失败任务(命令),而不是整个链。

https://docs.ansible.com/ansible/2.4/playbooks_loops.html

答案 2 :(得分:0)

只需将命令列表添加到变量中,然后在需要执行命令的位置替换该变量即可。

vars:
  shell_cmd:
    - "hostname &&"
    - whoami
tasks:
  - shell: "{{shell_cmd}}"

享受!