首页 > 解决方案 > 为什么基本的 Ansible 循环似乎会为每个项目和主机建立多个 ssh 连接?

问题描述

非常初学者的问题,但试图了解循环与不使用循环发生了什么。(ansible 2.9.9)

这是我的设置

# setup_servers.yml
- hosts: all
  gather_facts: false
  roles:
    - baseline

# staging.yml
---
all:
  children:
    hosts:
      host1:
      host2:
      host3:

# baseline/tasks/main.yml
---
- name: Create Users Task
  user:
    name: "{{ item }}"
    state: present
  loop: "{{ developers }}"

# baseline/vars/main.yml
---
developers:
  - bob
  - jane
  - sally

当我运行它时:ansible-playbook -i staging.yml setup_servers.yml我得到以下信息:

TASK [baseline : Create Users Task] *************************************************************************************************************************************************************************************************
ok: [host1] => (item=bob)
ok: [host2] => (item=bob)
ok: [host3] => (item=bob)
ok: [host1] => (item=jane)
ok: [host2] => (item=jane)
ok: [host3] => (item=jane)
ok: [host1] => (item=sally)
ok: [host2] => (item=sally)
ok: [host3] => (item=sally)

但是,如果我不在任务中使用循环:

---
- name: Create Users Task
  user:
    name: "bob"
    state: present
  user:
    name: "jane"
    state: present
  user:
    name: "sally"
    state: present

我得到这个不同的输出:

TASK [baseline : Create Users Task] *************************************************************************************************************************************************************************************************
ok: [host1]
ok: [host2]
ok: [host3]

显示输出的方式似乎是在上面的循环案例中,它为循环中的每个项目分别连接到每个主机。而对于非循环任务,它表明它只连接到每个主机一次。此外,循环案例需要更长的时间才能完成(8 倍长 - 基本检查time,每个运行几次)。

输出是否不代表实际的 ssh 行为?对这里发生的事情的任何见解都会有所帮助。如果循环场景为每个主机和项目连接一次,有没有办法设置它,以便它连接到每个主机一次,然后循环创建用户?

在重新阅读了所有关于循环的文档和许多谷歌搜索之后,我还没有找到答案。

谢谢。

标签: loopsansible

解决方案


您的非循环任务无效。您有三个user调用,但实际上只执行了最后一个。YAML不是一种编程语言。YAML 处理会覆盖列表中具有相同键的较早项目。


推荐阅读