Есть ли способ получить вывод из топ-5 серверов только среди всех хостов в ansible -playbook - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть проблема 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}

1 Ответ

0 голосов
/ 30 апреля 2020

Думаю, вы не совсем понимаете, как работает 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 раз ... пять хостов, и для каждого хоста oop с двумя элементами).

Кроме того, неясно, что вы пытаетесь выполнить sh с помощью этой второй задачи. Учитывая ваш l oop (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 }}"

This будет запускать эти две задачи на первых двух хостах в вашем инвентаре. Учитывая инвентарь, который похож на это:

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

Приведенный выше playboook даст:


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   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...