【问题标题】:Is there any way to get output of top 5 servers only among all hosts in ansible-playbook有没有办法只在 ansible-playbook 中的所有主机中获得前 5 台服务器的输出
【发布时间】:2020-08-14 07:25:08
【问题描述】:

我遇到了问题 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}

【问题讨论】:

  • 发布问题时,请花一点时间阅读格式化帮助,以便正确格式化代码示例、程序输出等。我已经为你编辑了这个问题。
  • 好的,谢谢

标签: loops ansible conditional-statements


【解决方案1】:

我认为您可能不完全了解 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 &lt;= 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   

【讨论】:

  • 谢谢 :) 得到了所需的输出(我使用条件和循环来获取前 5 个主机名,这就是为什么在剧本中使用 when 和 with_items)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-05
  • 1970-01-01
  • 2020-05-27
  • 2020-10-16
  • 1970-01-01
  • 2021-08-27
  • 2017-09-24
相关资源
最近更新 更多