Проблема использования 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.

Добавить комментарий

Ваш e-mail не будет опубликован.