Простой bash-скрипт
#!/bin/bash
hosts_file=$1
sections=$(cat $hosts_file | grep "\[" | tr -d "[]" | sort)
for i in $sections; do
sed -n -e "/\[$i\]/,/\[/p" $hosts_file | sed '${/\[.*/d}'
done
с вводом larsks дает
[database]
db_server_1
local_db_server
[ExampleGroup]
Server05
Myserver01
[webservers]
examplehostserver ansible_host=10.0.0.1
hostname3
[webservers:vars]
apache_package_name=httpd
Собственное Решение Ansible ограничено группами и хостами.Игра ниже с примером инвентаря из вопроса
tasks:
- debug:
msg: "{{ item }}:{{ groups[item] }}"
loop: "{{ groups.keys()|difference(['all', 'ungrouped'])|sort }}"
дает (сокращенно):
"msg": "database:[u'db_server_1', u'local_db_server']"
"msg": "ExampleGroup:[u'Server05', u'Myserver01']"
"msg": "webservers:[u'examplehostserver', u'hostname3']"
и тот же цикл с blockinfile
tasks:
- blockinfile:
create: yes
path: "{{ playbook_dir }}/my_hosts"
block: |
[{{ item }}]
{% for host in groups[item] %}
{{ host }}
{% endfor %}
marker: "# {mark} group:{{ item }}"
loop: "{{ groups.keys()|difference(['all', 'ungrouped'])|sort }}"
создает файл:
> cat my_hosts
# BEGIN group:database
[database]
db_server_1
local_db_server
# END group:database
# BEGIN group:ExampleGroup
[ExampleGroup]
Server05
Myserver01
# END group:ExampleGroup
# BEGIN group:webservers
[webservers]
examplehostserver
hostname3
# END group:webservers
Реконструкция инвентаризации из переменных Ansible, которая будет включать объявление переменных, не будет однозначной.