Некоторое время назад кто-то предложил использовать динамические инвентаризации для генерации другого файла хостов в зависимости от местоположения и других переменных из шаблона, но я столкнулся с довольно большой проблемой:
После того, как я создал инвентарь из шаблонаМне нужно обновить его (я делаю это, используя meta: refresh_inventory), чтобы Ansible мог выполнять задачи на вновь добавленных хостах, однако, если хост изначально не был в файле hosts, ansible не выполняет задачи на нем.С другой стороны, если после изменения файла хоста хост отсутствует во вновь сформированном файле, то Ansible опускает хост, как и должен, поэтому refresh_inventory выполняет половину работы.Есть ли способ обойти эту проблему?
Например, у меня есть 1 задача, чтобы сгенерировать файл хостов из шаблона, затем обновить инвентаризацию, а затем выполнить простую задачу на всех хостах, например, show message:
tasks:
- name: Creating inventory template
local_action:
module: template
src: hosts.j2
dest: "/opt/ansible/inventories/{{location}}/hosts"
mode: 0777
force: yes
backup: yes
ignore_errors: yes
run_once: true
- name: "Refreshing hosts file for {{location}} location"
meta: refresh_inventory
- name: Force refresh of host errors
meta: clear_host_errors
- name: Show message
debug: msg="This works for this host"
Если исходный файл хостов имеет хосты A, B, C, D, а недавно созданный инвентарь имеет B, C, D, то все в порядке:
ok: [B] => {
"msg": "This works for this host"
}
ok: [C] => {
"msg": "This works for this host"
}
ok: [D] => {
"msg": "This works for this host"
}
Однако, если вновь сформированные хостыфайл имеет хосты B, C, D, E (E не присутствует в исходном файле хостов), затем снова получается:
ok: [B] => {
"msg": "This works for this host"
}
ok: [C] => {
"msg": "This works for this host"
}
ok: [D] => {
"msg": "This works for this host"
}
С задачей для E отсутствует.Теперь, если я воспроизведу пьесу только для добавления другого хоста, скажем, F, то результат будет выглядеть так:
ok: [B] => {
"msg": "This works for this host"
}
ok: [C] => {
"msg": "This works for this host"
}
ok: [D] => {
"msg": "This works for this host"
}
ok: [E] => {
"msg": "This works for this host"
}
Но нет F, который уже добавлен в файл инвентаря до обновления.
Итак, есть идеи?