簡體   English   中英

有沒有辦法在ansible主機文件中對組進行排序而不對組內的主機進行排序?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM