首页 > 解决方案 > 有没有办法只在 ansible-playbook 中的所有主机中获得前 5 台服务器的输出

问题描述

我有一个问题 ansible 条件和循环:

我只想获得前 5 台服务器的输出,但下面的剧本给出了所有主机而不是 2 台主机的输出。

---
- name:
  hosts: all
  tasks:
    - name:
      command: hostname -i
      register: out

    - set_fact: my_ip = "{{out.stdout_lines}}"
      with_items: [1,2]
      when: item <= 2

输出:

TASK [set_fact] *********************************************************************************************************************************************
task path: /home/ec2-user/ansible/mm.yml:9
ok: [s1] => (item=1) => {"ansible_facts": {"_raw_params": "my_ip = \"[u'172.31.45.164']\""}, "ansible_loop_var": "item", "changed": false, "item": 1}
ok: [s1] => (item=2) => {"ansible_facts": {"_raw_params": "my_ip = \"[u'172.31.45.164']\""}, "ansible_loop_var": "item", "changed": false, "item": 2}
ok: [ansible] => (item=1) => {"ansible_facts": {"_raw_params": "my_ip = \"[u'172.31.39.107']\""}, "ansible_loop_var": "item", "changed": false, "item": 1}
ok: [ansible] => (item=2) => {"ansible_facts": {"_raw_params": "my_ip = \"[u'172.31.39.107']\""}, "ansible_loop_var": "item", "changed": false, "item": 2}
ok: [s2] => (item=1) => {"ansible_facts": {"_raw_params": "my_ip = \"[u'172.31.37.172']\""}, "ansible_loop_var": "item", "changed": false, "item": 1}
ok: [s2] => (item=2) => {"ansible_facts": {"_raw_params": "my_ip = \"[u'172.31.37.172']\""}, "ansible_loop_var": "item", "changed": false, "item": 2}

标签: loopsansibleconditional-statements

解决方案


我想你可能不完全理解 Ansible 的工作原理。当您的游戏以此开始时:

- hosts: all

这意味着 Ansible 将在您库存中的每个主机上运行您游戏中的任务。因此,如果您的库存中有五台主机,那么您正在运行这些任务......

    - name:
      command: hostname -i
      register: out

    - set_fact: my_ip = "{{out.stdout_lines}}"
      with_items: [1,2]
      when: item <= 2

...五次(因此第二个任务实际上将执行 10 次...五个主机,每个主机都有一个包含两个项目的循环)。

此外,尚不清楚您要通过第二项任务完成什么。给定您的循环 ( with_items: [1,2]),您的条件 ( when: item <= 2) 将始终为真,因此它没有任何用途。而且您没有item在任务中使用 的值。

如果您想要清单中前两个主机的主机名,您可以编写:

- hosts: all[0:1]
  gather_facts: false
  tasks:
    - command: echo {{ inventory_hostname }}
      register: out

    - debug:
        msg: "{{ out.stdout }}"

这将在清单中的前两个主机上运行这两个任务。给定一个如下所示的库存:

host1 ansible_host=localhost
host2 ansible_host=localhost
host3 ansible_host=localhost
host4 ansible_host=localhost

上面的剧本将产生:


PLAY [all[0:1]] ******************************************************************************

TASK [command] *******************************************************************************
changed: [host1]
changed: [host2]

TASK [debug] *********************************************************************************
ok: [host1] => {
    "msg": "host1"
}
ok: [host2] => {
    "msg": "host2"
}

PLAY RECAP ***********************************************************************************
host1                      : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
host2                      : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

推荐阅读