[英]Is there a way to sort the groups in an ansible host file without sorting the hosts within the groups?
在ansible主機(或庫存)文件中,您可以使用括號對主機進行分組。 我想在linux中使用sort函數對這些組進行排序,但它會對各個主機進行排序,我希望正確的主機仍在正確的組下。 例如,
[webservers]
examplehostserver
hostname3
[database]
db_server_1
local_db_server
[ExampleGroup]
Server05
Myserver01
我正在尋找一種按組排序的方法,同時將主機保持在正確的組下
我覺得這在終端命令或bash中是不可能的
簡單的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
Native 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變量重建庫存將不是明確的。
你可以用一個簡單的Python腳本來做到這一點:
#!/usr/bin/python
import sys
groups = {}
group = None
for line in sys.stdin:
line = line.rstrip()
if line.startswith('['): # look for inventory groups
group = line[1:-1].lower() # extract the group name
groups[group] = []
if group and line: # gather up non-blank lines
groups[group].append(line)
for group in sorted(groups): # sort groups by name
print('\n'.join(groups[group])) # print out the group
print()
假設我們在文件hosts
有您的示例清單,以及sortinv.py
的上述腳本,則使用以下命令:
python sortinv.py < hosts
生產:
[database]
db_server_1
local_db_server
[ExampleGroup]
Server05
Myserver01
[webservers]
examplehostserver
hostname3
這種機制的優點是它可以保留主變量和組變量之類的東西。 例如,給定此輸入:
[webservers]
examplehostserver ansible_host=10.0.0.1
hostname3
[database]
db_server_1
local_db_server
[ExampleGroup]
Server05
Myserver01
[webservers:vars]
apache_package_name=httpd
我們得到:
[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
弗拉基米爾的解決方案將丟失大部分額外數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.