База: загрузка данных
База ansible функций, необходимых для следующих примеров:
-
file
поисковый плагин для загрузите содержимое файла, присутствующего на контроллере. - Фильтр
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