ansible meta: refresh_inventory не включает ранее отсутствующие хосты при выполнении задачи - PullRequest
0 голосов
/ 07 июля 2019

Некоторое время назад кто-то предложил использовать динамические инвентаризации для генерации другого файла хостов в зависимости от местоположения и других переменных из шаблона, но я столкнулся с довольно большой проблемой:

После того, как я создал инвентарь из шаблонаМне нужно обновить его (я делаю это, используя 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, который уже добавлен в файл инвентаря до обновления.

Итак, есть идеи?

1 Ответ

0 голосов
/ 08 июля 2019

Цитирование из Основы

Для каждой игры в сборнике пьес вы можете выбрать, какие машины в вашей инфраструктуре будут нацеливаться ... Строка hosts - это список из одногоили более групп или шаблонов хостов ...

Например, можно создать инвентарь в 1-й игре и использовать его во 2-й игре.Плейбук ниже

- hosts: localhost
  tasks:
    - template:
        src: hosts.j2
        dest: "{{ playbook_dir }}/hosts"
    - meta: refresh_inventory

- hosts: test
  tasks:
    - debug:
        var: inventory_hostname

с шаблоном (в соответствии с вашими потребностями)

$ cat hosts.j2
[test]
test_01
test_02
test_03

[test:vars]
ansible_connection=ssh
ansible_user=admin
ansible_become=yes
ansible_become_user=root
ansible_become_method=sudo
ansible_python_interpreter=/usr/local/bin/python3.6
ansible_perl_interpreter=/usr/local/bin/perl

дай

PLAY [localhost] ****************************************************************************

TASK [Gathering Facts] **********************************************************************
ok: [localhost]

TASK [template] *****************************************************************************
changed: [localhost]

PLAY [test] *********************************************************************************

TASK [Gathering Facts] **********************************************************************
ok: [test_02]
ok: [test_01]
ok: [test_03]

TASK [debug] ********************************************************************************
ok: [test_01] => {
    "inventory_hostname": "test_01"
}
ok: [test_02] => {
    "inventory_hostname": "test_02"
}
ok: [test_03] => {
    "inventory_hostname": "test_03"
}

PLAY RECAP **********************************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0   
test_01                    : ok=2    changed=0    unreachable=0    failed=0   
test_02                    : ok=2    changed=0    unreachable=0    failed=0   
test_03                    : ok=2    changed=0    unreachable=0    failed=0
...