This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
gpo_для_linux [2023/05/01 09:16] val [GPO для Linux из подручных материалов] |
gpo_для_linux [2023/06/02 16:08] (current) val |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== GPO для Linux из подручных материалов====== | ====== GPO для Linux из подручных материалов====== | ||
+ | |||
+ | * [[https://habr.com/ru/articles/732736/|GPO для Linux из подручных материалов]] | ||
Всем привет! | Всем привет! | ||
- | На занятиях часто задают вопрос, а есть ли аналог групповых политик Microsoft для Linux систем, на который долгое время просто отвечал - "Конечно, ведь есть Ansible"! Сегодня хочется подтвердить это практическим примером, использование которого помогает нам управлять множеством Linux систем в сети и за ее пределами. Еще одна причина появления этого решения заключается в том, что некая компания планировала внедрить на нашем предприятии ПО с красивым названием "Система управления конфигурациями" (представьте, как звучала аббревиатура:), но, что-то пошло не так, и после Нового года понадобилось (срочно, как обычно) все сделать самим. Поэтому было решено реализовать только тот функционал, который понадобился бы в первую очередь: | + | Когда меня спрашивали, а есть ли аналог групповых политик Microsoft для Linux систем, долгое время просто отвечал - "Конечно, ведь есть Ansible"! Сегодня хочется подтвердить это практическим примером, использование которого помогает нам управлять множеством Linux систем в сети и за ее пределами. Еще одна причина появления этого решения заключается в том, что некая компания планировала внедрить на нашем предприятии ПО с красивым названием "Система управления конфигурациями" (представьте, как звучала аббревиатура:), но, что-то пошло не так, и после Нового года понадобилось (срочно, как обычно) все сделать самим. Поэтому было решено реализовать только тот функционал, который понадобился в первую очередь: |
1. Простой способ инициализации (подключения к нашей системе управления) вводимых в эксплуатацию или уже существующих систем | 1. Простой способ инициализации (подключения к нашей системе управления) вводимых в эксплуатацию или уже существующих систем | ||
Line 9: | Line 11: | ||
2. Возможность автоматического управления системами, недоступными по сети "напрямую" (за NAT или Firewall) | 2. Возможность автоматического управления системами, недоступными по сети "напрямую" (за NAT или Firewall) | ||
- | 3. Возможность поддержки нескольких категорий (профилей) систем и смены профиля для системы | + | 3. Возможность поддержки нескольких категорий (профилей) систем |
4. Возможность предварительного тестирования конфигураций, перед передачей их в "прод" | 4. Возможность предварительного тестирования конфигураций, перед передачей их в "прод" | ||
- | Эти требования привели к решению, использующему связку [[Сервис Ansible#ansible-pull]] (совершенно случайно узнал про него, и вот как пригодилось:) и [[Инструмент GitLab]] | + | IMG_1.png |
+ | |||
+ | Эти требования привели к решению, использующему связку Git и [[https://docs.ansible.com/ansible/latest/cli/ansible-pull.html|ansible-pull]] (совершенно случайно узнал про него, и вот как пригодилось:) | ||
- | Коротко про ansible-pull (будем считать, что с самим ansible аудитория уже знакома, иначе [[https://habr.com/ru/companies/express42/articles/254959/|вот]]) - эта утилита загружает из Git репозитория (GitLab, Gitee, ...) копию проекта и выполняет из него плейбук с именем local.yml, либо, с именем которое совпадает с hostname системы. Остается описать в проекте все необходимые роли и "запускать" их из этих плейбуков. | + | Коротко про ansible-pull (будем считать, что с самим ansible аудитория уже знакома, иначе [[https://habr.com/ru/companies/express42/articles/254959/|вот]]) - эта утилита загружает из Git репозитория (GitLab, Gitea, ...) копию проекта и выполняет из него плейбук с именем local.yml, либо с именем, которое совпадает с hostname системы. Остается описать в проекте все необходимые роли и "запускать" их из этих плейбуков. |
По поводу ролей, рассмотрим описанные в предыдущих статьях (см. ссылки): | По поводу ролей, рассмотрим описанные в предыдущих статьях (см. ссылки): | ||
- | 1. [[https://habr.com/ru/articles/718632/|Подключение]] к [[https://habr.com/ru/articles/732290/|домену]] | + | 1. [[https://habr.com/ru/articles/718632/|Подключение к домену]] |
2. Настройка на использование [[https://habr.com/ru/articles/732290/|корпоративного прокси]] | 2. Настройка на использование [[https://habr.com/ru/articles/732290/|корпоративного прокси]] | ||
Line 25: | Line 29: | ||
3. Установка ПО и "иконки" для [[https://habr.com/ru/articles/709218/|корпоративного аналога TeamViewer]] | 3. Установка ПО и "иконки" для [[https://habr.com/ru/articles/709218/|корпоративного аналога TeamViewer]] | ||
- | По аналогии можно будет добавить любые другие, в том числе, под другие дистрибутивы (в нашем случае будет Debian/Ubuntu). | + | По аналогии, можно будет добавить любые другие, в том числе, под другие дистрибутивы (в нашем случае будет Debian/Ubuntu). |
Итак, поехали! | Итак, поехали! | ||
- | На рабочей станции для разработки и тестирования (у нас будет client1) создаем каталог (в дальнейшем, для краткости, команды создания и переходов в каталоги буду опущены) для нашего проекта, например, ansible-pull-gpo (делать это будем в учетной записи root, что позволит сразу тестировать результат) | + | На компьютере разработчика (у нас будет client1) создаем каталог (в дальнейшем, для краткости, команды создания и переходов в каталоги будут опущены) для нашего проекта, например, ansible-pull-gpo (делать это будем в учетной записи root, что позволит сразу тестировать результат) |
<code> | <code> | ||
Line 47: | Line 51: | ||
</code><code> | </code><code> | ||
[libdefaults] | [libdefaults] | ||
- | default_realm = CORP13.UN | + | default_realm = CORP.RU |
</code><code> | </code><code> | ||
client1:~/ansible-pull-gpo# nano kerberos/files/etc/pam.d/common-auth | client1:~/ansible-pull-gpo# nano kerberos/files/etc/pam.d/common-auth | ||
Line 89: | Line 93: | ||
</code> | </code> | ||
- | Создаем роль, настраивающую использование [[https://habr.com/ru/articles/732290/|корпоративного прокси]] (наверное, самую простую в этой статье) | + | Создаем роль, настраивающую использование [[https://habr.com/ru/articles/732290/|корпоративного прокси]] (самую простую из трех) |
<code> | <code> | ||
- | client1:~/ansible-pull-gpo# cat proxy/files/etc/environment | + | client1:~/ansible-pull-gpo# nano proxy/files/etc/environment |
</code><code> | </code><code> | ||
- | https_proxy=http://gate.corp13.un:3128 | + | https_proxy=http://authproxy.corp.ru:3128 |
- | no_proxy=localhost,127.0.0.1,corp13.un | + | no_proxy=localhost,127.0.0.1,corp.ru |
</code><code> | </code><code> | ||
- | client1:~/ansible-pull-gpo# cat proxy/tasks/main.yml | + | client1:~/ansible-pull-gpo# nano proxy/tasks/main.yml |
</code><code> | </code><code> | ||
- name: Copy environment | - name: Copy environment | ||
Line 108: | Line 112: | ||
<code> | <code> | ||
- | client1:~/ansible-pull-gpo# cat help/files/usr/share/applications/help.desktop | + | client1:~/ansible-pull-gpo# nano help/files/usr/share/applications/help.desktop |
</code><code> | </code><code> | ||
[Desktop Entry] | [Desktop Entry] | ||
Name=Help | Name=Help | ||
Name[ru_RU]=Помощь | Name[ru_RU]=Помощь | ||
- | Exec=/bin/bash -c 'echo -n "Enter ID: "; read -r ID; /usr/bin/x11vnc -connect gate.corp13.un:"$ID"' | + | Exec=/bin/bash -c 'echo -n "Enter ID: "; read -r ID; /usr/bin/x11vnc -connect help.corp.ru:"$ID"' |
Terminal=true | Terminal=true | ||
Type=Application | Type=Application | ||
Line 119: | Line 123: | ||
Categories=Network | Categories=Network | ||
</code><code> | </code><code> | ||
- | client1:~/ansible-pull-gpo# cat help/tasks/main.yml | + | client1:~/ansible-pull-gpo# nano help/tasks/main.yml |
</code><code> | </code><code> | ||
- name: Install x11vnc | - name: Install x11vnc | ||
Line 145: | Line 149: | ||
</code> | </code> | ||
- | После перезагрузки, должна появиться возможность подключаться любым доменным пользователем, браузер должен работать через proxy, а в разделе "Интернет" должна появиться иконка "Помощь" | + | После перезагрузки, должна появиться возможность подключаться любым доменным пользователем, браузер должен работать через authproxy, а в меню графической оболочки, в разделе "Интернет", должна появиться иконка "Помощь". |
- | Для доступа к этим ролям с других рабочих станциях в сети, разместим все в корпоративном GitLab (если его еще нет, см. 3-й шаг из [[https://habr.com/ru/articles/716454/|этой статьи]] | + | Для доступа к этим ролям с других рабочих станций, разместим все в корпоративном GitLab, если его еще нет, см. 3-й шаг из [[https://habr.com/ru/articles/716454/|этой статьи]]. В дальнейшем, подразумевается имя GitLab сервера - gitlab.corp.ru и учетная запись владельца проекта - student |
- | Создаем публичный проект без readme с названием ansible-pull-gpo (см. 4-й шаг из [[https://habr.com/ru/articles/716454/|той же статьи]]) и выполняем команды из подсказок проекта внутри каталога ansible-pull-gpo, предварительно, установив на рабочую станцию для разработки и тестирования утилиту git | + | Создаем публичный проект без readme с названием ansible-pull-gpo (см. 4-й шаг из [[https://habr.com/ru/articles/716454/|той же статьи]]) и выполняем внутри каталога ansible-pull-gpo команды из подсказок нового проекта, предварительно установив утилиту git: |
<code> | <code> | ||
Line 156: | Line 160: | ||
client1:~# cd ansible-pull-gpo/ | client1:~# cd ansible-pull-gpo/ | ||
- | ... | + | client1:~/ansible-pull-gpo# git config --global user.email "student@corp.ru" |
+ | |||
+ | client1:~/ansible-pull-gpo# git init --initial-branch=main | ||
+ | |||
+ | client1:~/ansible-pull-gpo# git remote add origin http://gitlab.corp.ru/student/ansible-pull-gpo.git | ||
+ | |||
+ | client1:~/ansible-pull-gpo# git add . | ||
+ | |||
+ | client1:~/ansible-pull-gpo# commit -m "Initial commit" | ||
+ | |||
+ | client1:~/ansible-pull-gpo# push -u origin main | ||
</code> | </code> | ||
- | Для сдачи в эксплуатацию следующей системы достаточно выполнить на ней команды (подразумевается имя GitLab сервера - server.corp13.un и учетная запись владельца проекта - student): | + | Для сдачи в эксплуатацию следующей системы достаточно выполнить на ней команды (вот он - ansible-pull в действии :) |
<code> | <code> | ||
client2:~# apt install git ansible | client2:~# apt install git ansible | ||
- | client2:~# ansible-pull -U http://server.corp13.un/student/ansible-pull-gpo.git | + | client2:~# ansible-pull -U http://gitlab.corp.ru/student/ansible-pull-gpo.git |
client2:~# reboot | client2:~# reboot | ||
</code> | </code> | ||
- | Инструкцию ansible-pull можно прописать в cron, что бы обновления конфигурации загружались автоматически, например, каждые 2 часа, но еще лучше, добавить в проект файлы облегчающие процесс ввода в эксплуатацию новых рабочих станций: | + | Инструкцию ansible-pull можно прописать в cron, что бы обновления конфигурации загружались периодически, но еще лучше, добавить в проект файлы, облегчающие процесс ввода в эксплуатацию новых рабочих станций: |
- | Скрипт start.sh будет устанавливать необходимое ПО и прописывать ansible-pull в cron добавляя возможность указывать (например, тестовую) ветку проекта. Вывод команды ansible-pull будет передаваться в syslog | + | Скрипт start.sh будет устанавливать необходимое ПО и прописывать ansible-pull в cron (каждые 2 часа со случайной задержкой и после перезагрузки), добавляя возможность указывать (например, тестовую) ветку проекта. Вывод команды ansible-pull будет передаваться в syslog |
<code> | <code> | ||
Line 182: | Line 196: | ||
echo -e "0 */2 * * * \ | echo -e "0 */2 * * * \ | ||
- | /usr/bin/ansible-pull -s 120 -U http://server.corp13.un/student/ansible-pull-gpo.git -C $BR 2>&1 | /usr/bin/logger -t ansible-pull\n\ | + | /usr/bin/ansible-pull -s 120 -U http://gitlab.corp.ru/student/ansible-pull-gpo.git -C $BR 2>&1 | /usr/bin/logger -t ansible-pull\n\ |
- | @reboot sleep 1m; /usr/bin/ansible-pull -U http://server.corp13.un/student/ansible-pull-gpo.git -C $BR 2>&1 | /usr/bin/logger -t ansible-pull" | crontab - | + | @reboot sleep 1m; /usr/bin/ansible-pull -U http://gitlab.corp.ru/student/ansible-pull-gpo.git -C $BR 2>&1 | /usr/bin/logger -t ansible-pull" | crontab - |
- | </code><code> | + | </code> |
+ | |||
+ | Проверить работу скрипта можно здесь же: | ||
+ | |||
+ | <code> | ||
client1:~/ansible-pull-gpo# BR=main bash start.sh | client1:~/ansible-pull-gpo# BR=main bash start.sh | ||
Line 191: | Line 209: | ||
</code> | </code> | ||
- | В readme.md опишем способ запуска, позволяющий инженеру просто скопировать его из браузера сдаваемой в эксплуатацию системы | + | В readme.md опишем способ запуска, позволяющий инженеру просто скопировать команды из браузера сдаваемой в эксплуатацию системы (цифра 2, между projects и repository, это Project ID проекта из General Settings) |
<code> | <code> | ||
+ | client1:~/ansible-pull-gpo# nano readme.md | ||
+ | </code><code> | ||
+ | sudo -i | ||
+ | |||
+ | export BR=main; bash <(curl -s http://gitlab.corp.ru/api/v4/projects/2/repository/files/start.sh/raw?ref=$BR) | ||
+ | </code> | ||
+ | |||
+ | После синхронизации изменений в репозитории | ||
+ | |||
+ | <code> | ||
+ | client1:~/ansible-pull-gpo# git --no-optional-locks status | grep 'modified\|deleted\|new file\|renamed' | git commit -a -F - | ||
+ | |||
+ | client1:~/ansible-pull-gpo# push -u origin main | ||
+ | </code> | ||
+ | |||
+ | процесс подключения следующей рабочей станции выглядит как на титульном скриншоте, а именно, после базовой инсталляции системы, инженер подключается локальной учетной записью, открывает браузер, находит (через Explore в GitLab) проект ansible-pull-gpo и копирует из readme.md две команды в терминал. После перезагрузки рабочей станции можно наблюдать процесс применения конфигурации: | ||
+ | |||
+ | <code> | ||
+ | clientN$ sudo journalctl -f | ||
+ | </code> | ||
+ | |||
+ | Остается рассказать про профили систем. Например, домашние компьютеры сотрудников не нужно включать в домен, но иконка "Помощь/Help" для разрешения удаленного подключения инженера может очень пригодиться. Для этого опишем профиль - просто еще один плейбук, аналогичный local.yml с названием home-comp.yml (в реальности, удобнее использовать отдельный каталог для профилей) | ||
+ | |||
+ | <code> | ||
+ | client1:~/ansible-pull-gpo# nano home-comp.yml | ||
+ | </code><code> | ||
+ | - hosts: localhost | ||
+ | roles: | ||
+ | - role: help | ||
+ | </code> | ||
+ | |||
+ | Далее, уточняем hostname компьютера сотрудника (например, petrov-home) и создаем одноименный линк на созданный плейбук (hostname должны быть уникальны, компьютерам предприятия они назначается по определенному правилу, которое исключает возможность совпадений) | ||
+ | |||
+ | <code> | ||
+ | client1:~/ansible-pull-gpo# ln -s home-comp.yml petrov-home.yml | ||
+ | |||
+ | client1:~/ansible-pull-gpo# git --no-optional-locks status | grep 'modified\|deleted\|new file\|renamed' | git commit -a -F - | ||
+ | client1:~/ansible-pull-gpo# push -u origin main | ||
</code> | </code> | ||
- | ==== Старая версия ==== | ||
- | В отличии от настоящего Microsoft GPO, мы нигде не храним список управляемых машин, фактически, для того, что бы система была под нашим управлением, достаточно в ее [[Планирование выполнения заданий в Linux#Сервис cron]] добавить (периодически и после перезагрузки) вызов команды [[Сервис Ansible#ansible-pull]], предварительно сформировав инвентарный файл с переменными. Переменные из инвентарного файла определяют, какие задачи и роли Ansible будут выполнены в системе, тем самым определяя ее профиль. Для выполнения этих действий добавили в репозиторий bash срипт, выполняющий все необходимое, в том числе, формирование инвентарного файл с [[Средства программирования shell#Использование диалоговых окон]]. Скрипт подразумевает возможность многократного перезапуска для изменения (пункт 3) профиля системы | + | После этого сотруднику оправляется ссылка на видео инструкцию ([[https://youtu.be/Y4RzavhVwxY?t=3653|похожую на эту]]) и он самостоятельно подключает свой компьютер к нашей системе управления. В дальнейшем, можно создать в проекте новую роль, например - openvpn, добавить ее к плейбуку home-comp.yml и она будет выполнена (в течении 2-х часов или после загрузки) на всех компьютерах, hostname которых мы "прилинковали" к файлу home-comp.yml |
- | Используя [[Инструмент GitLab#Подключение через API]] сделали простой URL, который достаточно открыть оператору в любом браузере (можно даже curl) и скопировать команду в консоль с повышенными привилегиями. Команда позволяет указать другую Git ветку проекта, например тестовую. | + | Вот такое решение "из подручных материалов". Мы его активно используем, добавляя, по необходимости, новые роли (в том числе, настройку 1С, установку офиса Р7 и прочее). |
- | Теперь осталось добавлять в проект задачи и роли, определять (при необходимости) соответствующие им инвентарные переменные и учитывать (при необходимости) версию дистрибутива. | + | Спасибо, что дочитали до конца, буду рад, если кому то пригодится и ответить на вопросы, а, так же, советам в комментариях! |
- | Для демонстрации давайте рассмотрим задачи ... | ||