只有在ansible-playbook中的所有主机中,有没有办法获得前5名服务器的输出

问题描述 投票:0回答:1

我遇到一个问题,并循环:

我只想获取前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}
loops ansible conditional-statements
1个回答
0
投票

我认为您可能不完全了解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)将为[[always

为真,因此它没有任何作用。并且您不在任务中使用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   
© www.soinside.com 2019 - 2024. All rights reserved.