有没有一种方法可以在不排序组内的主机的情况下,对ansible主机文件中的组进行排序?

2024-09-30 14:24:29 发布

您现在位置:Python中文网/ 问答频道 /正文

在ansible主机(或资源清册)文件中,可以使用括号对主机进行分组。我想在linux中使用sort函数对这些组进行排序,但是它会对各个主机进行排序,并且我希望正确的主机仍然位于正确的组下。例如

[webservers]
examplehostserver
hostname3

[database]
db_server_1
local_db_server

[ExampleGroup]
Server05
Myserver01

我正在寻找一种方法,以分类,同时保持主机在正确的组

我觉得在终端命令或bash中这是不可能的


Tags: 文件函数dbserver排序linux资源ansible
2条回答

您可以使用一个简单的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中,那么下面的命令:

^{pr2}$

产生:

[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

弗拉基米尔的解决方案将丢失许多额外的数据。在

简单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的输入给出

^{pr2}$

本机可译解决方案仅限于组和主机。下面的问题示例清单

^{pr3}$

给出(简写):

^{pr4}$

blockinfide

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

从构成变量声明的可解释变量重建库存不会是明确的。

相关问题 更多 >