Ansible - запустить несколько пользовательских процессов с переопределением переменных (с одинаковым именем) на одном хосте (в другой группе)? - PullRequest
0 голосов
/ 06 августа 2020

S o, У нас есть сценарий, в котором нам нужна возможность выполнить пользовательскую команду на одном или нескольких хостах из группы с различными возможными значениями одной и той же переменной.

Например -

#Inventory:
[ServerGroup_1]
abc0001 node=node1
abc0002 node=node2

[ServerGroup_2]
abc0001 node=node3
abc0002 node=node4

[ServersGroups: children]
ServerGroup_1
ServerGroup_2

group_vars/ServerGroup_1
JAVA_HOME: /home/java
PORT: 9998

group_vars/ServerGroup_2
JAVA_HOME: /home/java
PORT: 9999

Цель состоит в том, чтобы выполнить команду оболочки ниже на хосте abc0001 с портами как 9998 и 9999 в рамках одного запуска playbook.

shell: {{ JAVA_HOME }} -Dprocess.port={{ PORT }}

В настоящее время каждый раз согласно Ansible поведение переменной по умолчанию, она выполняется только для порта 9999. Теперь, в качестве альтернативы, мы могли бы вручную разделить задачи и вызвать их дважды в нашей playbook, как описано здесь.

Но, если у нас есть 50 разных портов, которые было бы утомительно писать, а также нам нужна была бы конфигурация таким образом, чтобы она динамически выбиралась из файла инвентаризации или файлов переменных, поэтому для добавления любого нового экземпляра или запуска команды на другой порт, нам просто нужно добавить его в наши файлы инвентаря / переменных, а не писать отдельную задачу, охватывающую порт. Конечная конфигурация должна работать для всех возможных сценариев ios выполнения этой команды на одном хосте группы или на всех хостах из группы или в конкретной комбинации хоста и узла ....

ansible-playbook -i staging test_multinode.yml --limit=ServersGroups -l abc0001

Выше Запуск playbook должен выполнять команду оболочки для портов 9998 и 9999 на abc0001, а playbook должен быть достаточно гибким, если просто нужно сказать, что запускать процесс только для порта 9998 на abc0001.

Примечание: мы пробовали блок with_items путем установки переменной порта в файле инвентаризации для хоста, но эта настройка очень жесткая и не будет работать для других сценариев ios. Мы также пробовали hash_behavior = merge и hash_behavior = replace settings в ansible .cfg, не заметили никаких изменений.

Надеюсь, это имеет смысл, и у нас нет слишком сложных вещей! Пожалуйста, предложите несколько вариантов !!!

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Q: "Выполнить настраиваемую команду на одном или нескольких хостах из группы с различными возможными значениями одной и той же переменной. Выполнить команду оболочки на хосте abc0001 с портами как 9998 и 9999 в рамках одного сценария воспроизведения. run."

A: Вместо замены стандартного поведения можно объединить только словари. См. DEFAULT_HASH_BEHAVIOUR . Измените данные group_vars на словари. Например,

shell> cat group_vars/ServerGroup_1
my_sets:
  set1:
    JAVA_HOME: /home/java
    PORT: 9998

shell> cat group_vars/ServerGroup_2
my_sets:
  set2:
    JAVA_HOME: /home/java
    PORT: 9999

Тогда playbook

shell> cat test.yml
- hosts: ServersGroups
  tasks:
    - debug:
        msg: "{{ item.value.JAVA_HOME }} -Dprocess.port={{ item.value.PORT }}"
      loop: "{{ my_sets|dict2items }}"
      loop_control:
        label: "{{ item.key }}"

дает (сокращенно)

shell> ANSIBLE_HASH_BEHAVIOUR=merge ansible-playbook -l abc0001 test.yml

ok: [abc0001] => (item=set1) => 
  msg: /home/java -Dprocess.port=9998
ok: [abc0001] => (item=set2) => 
  msg: /home/java -Dprocess.port=9999

Q: "Мы также пробовали hash_behavior = merge и hash_behavior = replace settings в ansible .cfg, не заметили никаких изменений. "

A: Параметр replace работает должным образом. Тот же сценарий дает

shell> ANSIBLE_HASH_BEHAVIOUR=replace ansible-playbook -l abc0001 test.yml

ok: [abc0001] => (item=set2) => 
  msg: /home/java -Dprocess.port=9999
0 голосов
/ 14 августа 2020

Подробное разрешение

Короткий ответ - перепишите файл инвентаризации, используя псевдонимы

 #Inventory:
[ServerGroup_1]
#variable with name PORT on host abc0001 from group1
group1_node1 ansible_host=abc0001 PORT=9998
group1_node2 ansible_host=abc0002 PORT=9999

[ServerGroup_2]
#same variable name Port on the same host abc0001 present in a different group
group2_node1 ansible_host=abc0001 PORT=9998
group2_node2 ansible_host=abc0002 PORT=9999

[ServersGroups: children]
ServerGroup_1
ServerGroup_2

Мы используем group1_node1 в качестве псевдонима, поэтому при этом Ansible зарегистрирует group1_node1 и group2_node1 как два разных хоста, даже если это один и тот же хост abc0001.

Теперь мы сможем запустить два процесса на одном хосте abc0001, используя разные параметры для одного и того же имя переменной PORT.

ansible-playbook -i staging test_multinode.yml --limit=ServersGroups -l group1_node1:group2_node1

Надеюсь, это понятно.

...