Есть ли способ сортировки групп в файле ANSIL хоста без сортировки хостов в группах? - PullRequest
0 голосов
/ 08 мая 2019

В файле ANSENT хоста (или инвентаря) вы можете сгруппировать хост, используя скобки.Я хочу отсортировать эти группы, используя функцию сортировки в linux, но она будет сортировать отдельные хосты, и я хочу, чтобы правильный хост все еще находился в правильной группе.Например,

[webservers]
examplehostserver
hostname3

[database]
db_server_1
local_db_server

[ExampleGroup]
Server05
Myserver01

Я ищу способ сортировки по группе, сохраняя хост в правильной группе

У меня такое ощущение, что это невозможно в командах терминала или bash

Ответы [ 2 ]

0 голосов
/ 08 мая 2019

Вы можете сделать это с помощью простого скрипта 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

Большая часть этих дополнительных данных будет потеряна решением Владимира.

0 голосов
/ 08 мая 2019

Простой 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, которая будет включать объявление переменных, не будет однозначной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...