Как эффективно использовать группы хостов в Ansible

#ansible #ansible-inventory

#ansible #ansible-инвентаризация

Вопрос:

Я пишу скрипт ansible для своего развертывания и застрял в одной проблеме. У меня есть 6 узлов tomcat, где я должен выполнить непрерывное развертывание, т. Е. Сначала развернуть на 3 узлах и протестировать его. Если тест прошел успешно, перейдите к оставшимся 3 узлам. Мой текущий инвентарь выглядит так —

 [prod]
prod-1-myapp
prod-2-myapp
prod-3-myapp
prod-4-myapp
prod-5-myapp
prod-6-myapp

[preprod]
preprod-cn-p1
  

И я использую group_vars, где я должен prod.yml/preprod.yml загружать конфигурацию во время выполнения.
Возможно ли разделить эту группу хостов на 2 и развернуть на каждом из них соответственно.
Если я создам 2 группы хостов, как показано ниже, как мне использовать мою prod.yml во время выполнения. Как это будет работать?

 [prod-1]
prod-1-myapp
prod-2-myapp
prod-3-myapp

[prod-2]
prod-4-myapp
prod-5-myapp
prod-6-myapp

[preprod]
preprod-cn-p1
  

Мой текущий запрос —

 ansible-playbook myapp-main.yml -e myapp_release_version=5.0.0 -e target_env=prod
  

myapp-main.yml

 ---
 - name: Starting with  Myapp Application deployment to tomcat nodes
   hosts: '{{ target_env }}'
   gather_facts: True
   any_errors_fatal: true
   roles:
     - role: deploy
       tags:
         - deploy
       become: yes
       become_user: tomcat
       become_method: sudo
  

Пожалуйста, если кто-то может посоветовать. Любая помощь приветствуется

Комментарии:

1. Вы уже ответили на свой собственный вопрос. Вы можете разделить инвентарь, запустить с -e target_env=prod-1 , проверить, работает ли он, а затем запустить то же самое, но с -e target_env=prod-2 .

2. @toydarian Я думал об этом, но я не думаю, что это сработает, потому что я использую, group_vars где у меня есть имя файла prod.yml , которое содержит все конфигурации для производственной среды. Если я использую подобное -e target_env=prod-1 , то как он будет подбирать эти конфигурации?

3. Легко, создайте prod-1 и prod-2 дочерние элементы группы prod и назначьте группе переменные группы, prod чтобы все хосты в prod-1 и prod-2 могли их использовать.

4. @toydarian хорошо, это сработает? `[prod-1] prod-1-myapp prod-2-myapp prod-3-myapp [prod-2] prod-4-myapp prod-5-myapp prod-6-myapp [prod: дети] prod-1 prod-2 «

5. да, ознакомьтесь с моим ответом и продолжайте, если в какой-то момент это неясно

Ответ №1:

Вопрос: «Разверните на 3 узлах и протестируйте его. Если тест прошел успешно, перейдите к оставшимся 3 узлам.» (используя group_vars prod.yml / preprod.yml)

A: Make prod_1 и prod_2 дочерние элементы prod . Например

 shell> cat hosts
[prod_1]
prod-1-myapp
prod-2-myapp
prod-3-myapp

[prod_2]
prod-4-myapp
prod-5-myapp
prod-6-myapp

[prod:children]
prod_1
prod_2

[preprod]
preprod-cn-p1
  

Затем разверните группу prod_1 . Если все правильно, разверните prod_2 . Например, приведенный ниже сборник задач

 shell> cat playbook.yml
- import_playbook: myapp-main.yml
  vars:
    target_env: prod_1

- hosts: localhost
  gather_facts: false
  tasks:
    - fail:
        msg: Test prod_1 failed
      when: prod_1_failed|default(false)|bool

- import_playbook: myapp-main.yml
  vars:
    target_env: prod_2

shell> cat myapp-main.yml
- hosts: '{{ target_env }}'
  gather_facts: false
  tasks:
    - debug:
        msg: "Deploy {{ inventory_hostname }}"
  

дает

 PLAY [prod_1] ****

TASK [debug] ****
ok: [prod-2-myapp] => {
    "msg": "Deploy prod-2-myapp"
}
ok: [prod-1-myapp] => {
    "msg": "Deploy prod-1-myapp"
}
ok: [prod-3-myapp] => {
    "msg": "Deploy prod-3-myapp"
}

PLAY [localhost] ****

TASK [fail] ****
skipping: [localhost]

PLAY [prod_2] ****

TASK [debug] ****
ok: [prod-4-myapp] => {
    "msg": "Deploy prod-4-myapp"
}
ok: [prod-5-myapp] => {
    "msg": "Deploy prod-5-myapp"
}
ok: [prod-6-myapp] => {
    "msg": "Deploy prod-6-myapp"
}
  

Группа prod_2 не должна развертываться при prod_1 сбое. Протестируйте это. Например

 shell> ansible-playbook -i hosts playbook.yml -e "prod_1_failed=True"
  

дает

 PLAY [prod_1] ****

  ...

PLAY [localhost] ****

TASK [fail] ****
fatal: [localhost]: FAILED! => {"changed": false, "msg": "Test prod_1 failed"}

  ...

  

Ответ №2:

В принципе, вы почти на месте.
Разделите инвентарь, запустите с -e target_env=prod-1 , проверьте, работает ли он, а затем запустите то же самое, но с -e target_env=prod-2 .

Для совместного использования переменных вашей группы ваш инвентарь должен выглядеть следующим образом:

 [prod_1]
prod-1-myapp
prod-2-myapp
prod-3-myapp

[prod_2]
prod-4-myapp
prod-5-myapp
prod-6-myapp

[preprod]
preprod-cn-p1

[prod:children]
prod_1
prod_2
  

Все групповые переменные, которые должны использоваться совместно на всех шести серверах prod, должны быть назначены группе prod .

Комментарии:

1. Исправьте синтаксис. prod-1 и prod-2 не являются допустимыми именами.

2. @VladimirBotka это верно, да. Я должен использовать символы подчеркивания. Я изменил его на prod_one и prod_two