Ansible инвентарь: классифицируйте хосты по нескольким критериям - PullRequest
0 голосов
/ 14 января 2020

Я совершенно новичок в Ansible, поэтому я все еще борюсь с его способом работы ... У меня есть файл инвентаря с несколькими хостами, отсортированными по среде и функциям:

[PRO-OSB]
host-1
host-2
[PRO-WL]
host-3
host-4
[PRO:children]
PRO-OSB
PRO-WL

Но Я думаю, что иногда мне может понадобиться запустить playbooks, указав еще больше, то есть обслуживание среды, ее функции, кластер хостов и приложение, работающее на хосте. Таким образом, в резюме каждый хост должен иметь 4 «категории»: окружение, функция, кластер и приложение. Как я могу добиться этого без необходимости постоянно повторять записи ??

Ответы [ 2 ]

0 голосов
/ 14 января 2020

Q: «У каждого хоста должно быть 4« категории »: среда, функция, кластер и приложение. Как я могу добиться этого без необходимости постоянно повторять записи?"

A: Можно объявить параметры по умолчанию в разделе [*: vars] и переопределить его параметрами, указанными для c хоста. См. Как объединяются переменные . Например, инвентарь

$ cat hosts
[PRO_OSB]
test_01 my_cluster='cluster_A'
test_02
[PRO_WL]
test_03 my_cluster='cluster_A'
test_04
[PRO:children]
PRO_OSB
PRO_WL
[PRO:vars]
my_environment='default_env'
my_function='default_fnc
my_cluster='default_cluster'
my_app='default_app'

с книгой воспроизведения

- hosts: PRO
  gather_facts: false
  tasks:
    - debug:
        msg: "{{ inventory_hostname }}
              {{ my_environment }}
              {{ my_function }}
              {{ my_cluster }}
              {{ my_app }}"

дает (переменная my_cluster test_01 и test_03 была переопределена значением хоста)

"msg": "test_01 default_env 'default_fnc cluster_A default_app"
"msg": "test_02 default_env 'default_fnc default_cluster default_app"
"msg": "test_04 default_env 'default_fnc default_cluster default_app"
"msg": "test_03 default_env 'default_fnc cluster_A default_app"

Q: "Запустите playbooks, указав еще больше, то есть заботясь о среде, ее функциях, кластере хостов и приложении."

Возможно создание динами c группируется с модулем add_host и выбирает хосты по мере необходимости. Например, создайте новую группу cluster_A в первой игре и используйте ее в следующей.

- hosts: all
  tasks:
    - add_host:
        name: "{{ item }}"
        group: cluster_A
      loop: "{{ hostvars|
                dict2items|
                json_query('[?value.my_cluster == `cluster_A`].key') }}"
      delegate_to: localhost
      run_once: true

- hosts: cluster_A
  tasks:
    - debug:
        var: inventory_hostname

дает

ok: [test_01] => {
    "inventory_hostname": "test_01"
}
ok: [test_03] => {
    "inventory_hostname": "test_03"
}
0 голосов
/ 14 января 2020

Как я могу добиться этого без необходимости постоянно повторять записи?

Вы не можете. Вы должны объявить в каждой необходимой группе машины, которые принадлежат ей. Поэтому, если машина принадлежит к 4 отдельным группам (без учета родительских групп), вам придется объявить этот хост в 4 соответствующих группах.

Ansible мог бы выбрать другой путь (т. Е. перечислите для каждого хоста группы, к которым он принадлежит), но это не сохраненное решение, и оно будет столь же многословным.

Чтобы упростить задачу и сделать IMO более безопасным, вы можете разделить свой инвентарь на несколько инвентарных списков среды. (Prod, Dev ....), так что вы можете удалить один уровень сложности внутри каждого инвентаря. Недостатком является то, что вы не можете настроить таргетинг на все ваши envs сразу с такой настройкой.

Если ваш инвентарь большой и нацелен на некую кластерную / облачную среду (vsphere, aws ...), Dynami c Запасы может помочь.

...