#ansible #ansible-inventory
#ansible #ansible-инвентаризация
Вопрос:
Я хотел бы получить список имен групп хостов (только) из ansible-inventory, однако мне приходится использовать grep для сокращения списка на основе известных шаблонов имен групп — например
- Чистый вывод, но грязная командная строка и необходимо заранее знать шаблон имени группы:
ansible-inventory -i inventory/production --list --yaml | grep webserver_.*:$
- Очистите командную строку и не нужно знать шаблон имени группы, но беспорядочный вывод:
ansible-playbook my-playbook.yml -i inventory/production --list-hosts
Есть ли простой способ извлечь только имена групп из инвентаря?
Пример hosts.yml:
# NGINX
webserver_1:
hosts:
ws1.public.example.com
webserver_2:
hosts:
ws2.public.example.com
webserver_2:
hosts:
ws2.public.example.com
# EC2 back-ends
backend_ec2_1:
hosts:
be1.internal.example.com
backend_ec2_2:
hosts:
be2.internal.example.com
backend_ec2_3:
hosts:
be3.internal.example.com
[Ansible v2.9.7]
Комментарии:
1. пожалуйста, добавьте образец инвентаризации
Ответ №1:
Вы можете использовать jq
команду для анализа выходных данных json ansible-inventory --list
, например:
$ ansible-inventory -i hosts --list | jq .all.children
[
"backend_ec2_1",
"backend_ec2_2",
"backend_ec2_3",
"ungrouped",
"webserver_1",
"webserver_2"
]
Или, если вам нужны только голые имена:
$ ansible-inventory -i hosts --list | jq -r '.all.children[]'
backend_ec2_1
backend_ec2_2
backend_ec2_3
ungrouped
webserver_1
webserver_2
Комментарии:
1. Хорошо, я собирался предложить использовать
yq
вчера, но ждал исправления этой ошибки 😊2. У меня это не работает (с Ansible 2.10). Кажется, что они работают только для довольно плоских структур инвентаря.
Ответ №2:
В этой команде перечислены группы, определенные в инвентаре
ansible localhost -m debug -a 'var=groups.keys()' -i inventory/production/
Комментарии:
1. Это действительно хорошо работает, даже для сильно вложенных групп.