Запускайте задачи на хостах, определенных в файле yaml вместо инвентаря, используя ansible - PullRequest
1 голос
/ 01 марта 2020

Я новичок в Ansible и пытаюсь получить хосты из файла config.yaml, расположенного ниже, а не из инвентаря, для запуска задач на этих хостах. Как я могу сделать это в основной книге игр?

service:
  web-app:
    common:
     tomcat:
      port: 80
  hosts:
      all:
         - abc.com
         - pqr.com

Есть ли способ получить доступ к ab c .com и pqr.com в моей книге игр, если мне нужно выполнить определенные задачи на этих серверах?

1 Ответ

2 голосов
/ 01 марта 2020

База: загрузка данных

База ansible функций, необходимых для следующих примеров:

  1. file поисковый плагин для загрузите содержимое файла, присутствующего на контроллере.
  2. Фильтр from_yaml для чтения содержимого файла в виде данных в формате yaml

Для обоих приведенных ниже примеров Я добавил ваш пример yaml (после исправления проблем с отступами) в files/service_config.yml. Просто измените имя файла, если он находится в подкаталоге files, или используйте полный путь к файлу, если он находится за пределами вашего проекта.

Комбинируя вышеперечисленное, вы можете получить свой список хостов. со следующим выражением jinja2.

{{ (lookup('file', 'service_config.yml') | from_yaml).service.hosts.all }}

Примечание: если ваш пользовательский файл yaml отсутствует на вашем контроллере, вам сначала нужно будет получить данные локально, используя slurp или fetch модулей

Использование в инвентаризации памяти

В этом примере я создаю динамическую c группу custom_group под управлением add_host Задача в пьесе, нацеленная на localhost и более поздние, нацеливается на эту группу в следующей игре. Это, вероятно, лучший вариант, если у вас есть большой набор задач для запуска на этих хостах.

---
- name: Prepare environment
  hosts: localhost
  gather_facts: false

  vars:
    # Replace with full path to actual file
    # if this one is not in your 'files' subdir
    my_config_file: service_config.yml
    my_custom_hosts: "{{ (lookup('file', my_config_file) | from_yaml).service.hosts.all }}"

  tasks:
    - name: Create dynamic group from custom yaml file
      add_host:
        name: "{{ item }}"
        group: custom_group
      loop: "{{ my_custom_hosts }}"

- name: Play on new custom group
  hosts: custom_group
  gather_facts: false

  tasks:
    - name: Show we can actually contact the group
      debug:
        var: inventory_hostname

, что дает:

PLAY [Prepare environment] **********************************************************************************************************************************************************************************************************************************************

TASK [Create dynamic group from custom yaml file] ***********************************************************************************************************************************************************************************************************************
changed: [localhost] => (item=abc.com)
changed: [localhost] => (item=pqr.com)

PLAY [Play on new custom group] *****************************************************************************************************************************************************************************************************************************************

TASK [Show we can actually contact the group] ***************************************************************************************************************************************************************************************************************************
ok: [abc.com] => {
    "inventory_hostname": "abc.com"
}
ok: [pqr.com] => {
    "inventory_hostname": "pqr.com"
}

PLAY RECAP **************************************************************************************************************************************************************************************************************************************************************
abc.com                    : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
localhost                  : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
pqr.com                    : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  

Использовать делегирование

В В следующем примере я использую делегирование задачи для изменения целевого хоста в игре, предназначенной для других хостов.

Это больше подходит, если у вас есть несколько задач для запуска на пользовательских хостах и ​​/ или вам нужны факты с текущих игровых хостов для выполнения этих задач. См. Пример с балансировщиком нагрузки в вышеупомянутом do c для более подробного объяснения.

---
- name: Delegation example
  hosts: localhost
  gather_facts: false

  vars:
    # Replace with full path to actual file
    # if this one is not in your 'files' subdir
    my_config_file: service_config.yml
    my_custom_hosts: "{{ (lookup('file', my_config_file) | from_yaml).service.hosts.all }}"

  tasks:
    - name: Task played on our current target host list
      debug:
        var: inventory_hostname

    - name: Fake task delegated to our list of custom host
      # Note: we play it only once so it does not repeat
      # if the play `hosts` param is a group of several targets
      # This is for example only and is not really delegating
      # anything in this case. Replace with your real life task
      debug:
        msg: "I would run on {{ item }} with facts from {{ inventory_hostname }}"
      delegate_to: "{{ item }}"
      run_once: true
      loop: "{{ my_custom_hosts }}"

Что дает:

PLAY [Delegation example] ***********************************************************************************************************************************************************************************************************************************************

TASK [Task played on our current target host list] **********************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "inventory_hostname": "localhost"
}

TASK [Fake task delegated to our list of custom host] *******************************************************************************************************************************************************************************************************************
ok: [localhost -> abc.com] => (item=abc.com) => {
    "msg": "I would run on abc.com with facts from localhost"
}
ok: [localhost -> pqr.com] => (item=pqr.com) => {
    "msg": "I would run on pqr.com with facts from localhost"
}

PLAY RECAP **************************************************************************************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
...