Думаю, вы не совсем понимаете, как работает 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