Теперь я ожидаю, что в первой машине я буду иметь file1 и во второй машине я буду иметь file2, но в обеих машинах я есть file1
Вы должны иметь в виду, что переменные в Ansible не являются глобальными. Переменные (иначе называемые «факты») применяются однозначно для каждого хоста, поэтому file_number
для хоста 1 отличается от file_number
для хоста2. Вот пример, основанный на свободно, что вы писали:
роли/тест/вары/main.yml:
---
file_number: 0
роли/тест/задачи/main.yml:
---
- name: Increment variable
set_fact: file_number={{ file_number | int + 1 }}
- name: debug
debug: msg="file_number is {{ file_number }} on host {{ inventory_hostname }}"
Теперь предположим, что у вас определено только два узла, и вы запускаете эту роль несколько раз в книжке, которая выглядит следующим образом:
---
- hosts: all
roles:
- { role: test }
- hosts: host1
roles:
- { role: test }
- hosts: all
roles:
- { role: test }
Итак, в первом играть роль применяется как к host1 & host2. Во второй пьесе он запускается только против host1, а в третьем исполнении он снова запускается как с host1 & host2. Выход этого сборника пьес является:
PLAY [all] ********************************************************************
TASK: [test | Increment variable] *********************************************
ok: [host1]
ok: [host2]
TASK: [test | debug] **********************************************************
ok: [host1] => {
"msg": "file_number is 1 on host host1"
}
ok: [host2] => {
"msg": "file_number is 1 on host host2"
}
PLAY [host1] **************************************************
TASK: [test | Increment variable] *********************************************
ok: [host1]
TASK: [test | debug] **********************************************************
ok: [host1] => {
"msg": "file_number is 2 on host host1"
}
PLAY [all] ********************************************************************
TASK: [test | Increment variable] *********************************************
ok: [host1]
ok: [host2]
TASK: [test | debug] **********************************************************
ok: [host1] => {
"msg": "file_number is 3 on host host1"
}
ok: [host2] => {
"msg": "file_number is 2 on host host2"
}
Так как вы можете видеть, значение file_number
отличается для host1 и host2 после той роли, которую увеличивает значение бежало против host1 больше раз, чем это было host2.
К сожалению, на самом деле нет чистого способа сделать переменную global
в пределах Ansible. Вся природа способности Ansible запускать задачи параллельно с большим количеством хостов делает что-то вроде этого очень сложным. Если вы не будете очень осторожны с глобальными переменными в параллельной среде, вы можете легко вызвать race condition, что, вероятно, приведет к непредсказуемым (непоследовательным) результатам.
Это глобальная переменная, но анзибль только оценки 'file_number' один раз задание 'set_fact', и поэтому оно становится равным' 1', независимо от того, сколько узлов оно запускает. Можете ли вы объяснить свой прецедент немного шире? Может быть, есть лучший способ сделать то, что вы пытаетесь сделать (кажется, вам нужно уникальное имя файла для всех хостов)? – ydaetskcoR
@ydaetskcoR, что я точно делаю, меняет конфигурационную строку в файле, которая на первом компьютере будет иметь «username = client1», а на втором компьютере - «username = client2» и т. Д. Для всех хостов. поэтому мне нужно увеличивать переменную для каждой машины. – Nasr
Но вы не представляете, какой порядок хостов будет выполняться. Каждый запуск, скорее всего, будет иметь другой порядок хостов. Возможно, вам лучше назначить это как host var вместо этого, если я не упустил что-то в вашем случае использования – ydaetskcoR