繁体   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