Проблема использования Ansible и nochmodx
С момента начала использования ansible в Astra Linux отметил для себя занятную особенность, а именно — при включенном механизме запрета установки исполняемого бита для пользователей (nochmodx) ansible не функционирует.
В принципе это логично — принцип работы заключается в том, что подключившись к удаленному хосту (через ssh), система управления конфигурацией генерирует python скрипт, безуспешно пытается установить ему бит исполнения и завершает свою работу ошибкой.
Возможно, если бы мы открыли доступ по ssh для root ошибки удалось бы избежать, так как в Astra linux SE 1.6 root может устанавливать бит исполнения даже при включенном режиме nochmodx, однако ходят слухи, что для сделавших так системных администраторов в аду подготовлен отдельный котёл…
Правда это или нет — никто не знает, но, что известно точно, что использовать root, а через ssh особенно — не безопасно. По этой причине эту идею я не рассматривал.
Как-то раз в одной умной книжке я вычитал, что безопасность и удобство — вещи не просто не совместимые, а взаимоисключающие. И вот я даже не заметил, что включать механизм nochmodx мне стало надоедать. Издевательство, познав управление конфигурацией, как кодом, делать что-то вручную.
И вот настал день, когда руководство нашей бюджетной организации, подарило нам целую неделю возможностей, сместив начало рабочего дня (с 8:30 на 6:00).
Время стало больше, и я понял — сейчас или никогда. Взял себя в руки и поставил задачу, деактивировать nochmodx, запустить playbook, активировать nochmodx.
Ansible у меня работает в паре с GitLab CI/CD, что позволяет предварительно произвести тестирование синтаксиса playbook, доставку конфигурации на виртуальную машину с последующим тестированием и развёртыванием в производственной среде.
Постановка задач и реализация
Задачу я себе поставил, осталось определиться с её реализацией.
В ansible создана группа clients_ipa в которую включены отделы организации.
[clients_ipa]
opo
pto
ooik
То есть список компьютеров у меня уже имеется, и использовать нужно его, так как дублировать списки — не самая лучшая идея.
Хранится у меня всё в отдельный файлах соответствующих наименованиям отделов, а компьютеры записываются в виде диапазонов, например:
[opo]
opo[1:4]
opo6
В итоге я определил следующую логику для своего скрипта:
1. Проанализировать файл группы client_ipa, получить наименования отделов;
2. Проанализировать каждый файл отдела, преобразовать диапазоны в понятный для bash синтаксис;
3. Раскрыть диапазоны и перебрать по ssh, отключив, либо включив механизм запрета исполняемого бита.
В ходе написания скрипта, столкнулся с непонятным для меня поведением ssh, который на втором компьютере завершал скрипт без объяснения причин.
Как-то давно я сталкивался с этим, поэтому попробовал запускать его с аргументом -f. Это помогло, и механизм nochmodx отключался и включался на всех компьютерах, перед развёртыванием.
Однако, отправка ssh в фон, привела к тому, что скрипт завершался, до завершения работы ssh, поэтому дополнил его отслеживанием процессов ssh и ожиданием их завершения.
В итоге скрипт исправно работает и отключает nochmodx перед работой ansible и включает механизм защиты после окончания развёртывания.
#!/bin/bash
while read line
do
if grep -Eq "^\[" <<< $line # Убираем заголовок [clients_ipa]
then
continue
fi
pc=$(sed -e 1d -e s/\\[/{/ -e s/\\]/}/ -e s/:/../ /etc/ansible/hosts/$line) # Удаляем заголовок группы, заменяем opo[1:3] на opo{1..3} для дальнейшего перебора в цикле bash
for x in $(eval echo $pc) # Перебираем ПК
do
ssh -f marukhin@$x "sudo astra-nochmodx-lock $1" 2>/dev/null
done
done < /etc/ansible/hosts/zz_clients_ipa
while ps --user="$(whoami)" | grep -q "ssh$" # Ждём, когда все процессы ssh ушедшие в фон завершаться
do
sleep 1
done
Возможно, я изобрёл колесо, поэтому буду рад, если Вы поделитесь информацией о своём способе отключения nochmodx в Astra Linux.