Управление группами серверов с помощью pdsh. pdsh-mod-genders

Если у вас есть группа серверов в которой есть деление по ролям(серверы выполняют различные функции) или например вы используете разные дистрибутивы под разные задачи то эта заметка будет вам очень полезна).
В проекте в котором я работаю, для массового управления группами серверов есть средства собственной разработки. Это очень удобно, когда у тебя например 100 серверов и тебе нужно выполнить какое то действие  на конкретных группах или на всех и ты можешь оперировать именами групп а не длинным списком из имен серверов.
Типичный кейс — запуск puppet-агента на всех серверах. Или например проверка версии некого пакета на всех серверах с CentOS 7.3.

Другая проблема которую решает данное средство — инвентаризация. Хочется иметь некий файл с описанием серверов их ролей и прочих атрибутов позволяющих понять предназначение серверов и управлять ими «массово».
Недавно я попал в среду, где было очень много серверов и совершенно отсутствовали средства их инвентаризации и тем более управления.

Когда нужно было сделать что то на паре серверов люди делали примерно так:

pdsh -w sd01,sd05,sd06 rpm -qa kernel

Конечно, держать имена и роли всех серверов в голове это круто само по себе но совершенно не эффективно.
Особенно когда есть такие прекрасные и простые средства для упорядочивания всего этого хозяйства.

pdsh + genders

genders — это по сути файл с собственным синтаксисом описания ролей, атрибутов и библиотека для работы с этим файлом. Этот проект вышел из HPC где необходимо массовое управление группами серверов.

У pdsh есть модуль — pdsh-mod-genders позволяющий использовать genders-файл.

Установка

Для rhel-base дистрибутивов пакеты есть в EPEL.

yum install pdsh pdsh-mod-genders -y

Файл с описанием

Файл располагается в /etc/genders. Имеет очень простой формат:

node name  # roles and attributes
sl01         puppet,el7
dh0[1-3]     docker,el7
sl0[2-7]     gluster,el7
tgt0[1-2]    tgt,el7
test         test,el6
sl08,sl12    test,os=debian8

рэнжи можно указывать очень гибко:

foo01,foo02,foo03,foo04,foo05 = foo[01-05]
foo3,foo7,foo9,foo11     = foo[3,7,9-11]
fooi,fooj,foo0,foo1,foo2 = fooi,fooj,foo[0-2]

Управление серверами

выполнить docker ps на всех машинах с ролью docker:

pdsh -g docker docker ps

вывести дату на всех el7 серверах:

pdsh -g el7 date

вывести hostname серверов с debian8:

pdsh -g os=debian8 hostname

выполнить puppet на всех серверах описанных в файле:

pdsh -a puppet agent -t

есть еще полезная утилитка nodeattr из пакета genders которая так же позволяет получать различную инфу о серверах из этого файла, например проверять роли сервера в скриптах. Но, это уже другая история.