User Tools

Site Tools


gpo_для_linux

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Last revision Both sides next revision
gpo_для_linux [2023/05/01 09:10]
val [GPO для Linux из подручных материалов]
gpo_для_linux [2023/05/02 10:02]
val
Line 3: Line 3:
 Всем привет! Всем привет!
  
-На занятиях часто задают вопрос, а есть ли аналог групповых политик Microsoft для Linux систем, ​на который ​долгое время просто отвечал - "​Конечно,​ ведь есть Ansible"​! Сегодня хочется подтвердить это практическим примером,​ использование которого помогает нам управлять множеством Linux систем в сети и за ее пределами. Еще одна причина появления этого решения заключается в том, что некая компания планировала внедрить на нашем предприятии ПО с красивым названием "​Система управления конфигурациями"​ (представьте,​ как звучала аббревиатура:​),​ но, что-то пошло не так, и после Нового года понадобилось (срочно,​ как обычно) все сделать самим. Поэтому было решено реализовать только тот функционал,​ который понадобился ​бы в первую очередь:​+Когда меня спрашивали, а есть ли аналог групповых политик Microsoft для Linux систем,​ долгое время просто отвечал - "​Конечно,​ ведь есть Ansible"​! Сегодня хочется подтвердить это практическим примером,​ использование которого помогает нам управлять множеством Linux систем в сети и за ее пределами. Еще одна причина появления этого решения заключается в том, что некая компания планировала внедрить на нашем предприятии ПО с красивым названием "​Система управления конфигурациями"​ (представьте,​ как звучала аббревиатура:​),​ но, что-то пошло не так, и после Нового года понадобилось (срочно,​ как обычно) все сделать самим. Поэтому было решено реализовать только тот функционал,​ который понадобился в первую очередь:​
  
 1. Простой способ инициализации (подключения к нашей системе управления) вводимых в эксплуатацию или уже существующих систем 1. Простой способ инициализации (подключения к нашей системе управления) вводимых в эксплуатацию или уже существующих систем
Line 9: Line 9:
 2. Возможность автоматического управления системами,​ недоступными по сети "​напрямую"​ (за NAT или Firewall) 2. Возможность автоматического управления системами,​ недоступными по сети "​напрямую"​ (за NAT или Firewall)
  
-3. Возможность поддержки нескольких категорий (профилей) систем ​и смены профиля для системы+3. Возможность поддержки нескольких категорий (профилей) систем
  
 4. Возможность предварительного тестирования конфигураций,​ перед передачей их в "​прод"​ 4. Возможность предварительного тестирования конфигураций,​ перед передачей их в "​прод"​
  
-Эти требования привели к решению,​ использующему связку [[Сервис Ansible#​ansible-pull]] (совершенно случайно узнал про него, и вот как пригодилось:​) и [[Инструмент GitLab]]+IMG_1.png
  
-Коротко про ansible-pull (будем считать,​ что с самим ansible аудитория уже знакома,​ иначе [[https://​habr.com/​ru/​companies/​express42/​articles/​254959/​|вот]]) - эта утилита загружает из Git репозитория (GitLab, ​Gitee, ...) копию проекта и выполняет из него плейбук с именем local.yml, либос именем которое совпадает с hostname системы. Остается описать в проекте все необходимые роли и "​запускать"​ их из этих плейбуков.+Эти требования привели к решению,​ использующему связку 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, ​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 27:
 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 49:
 </​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 91:
 </​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 110:
  
 <​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 121:
 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 147:
 </​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 158:
 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 сервера ):+Для сдачи в эксплуатацию следующей системы достаточно выполнить на ней команды (вот он - 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 194:
  
 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 207:
 </​code>​ </​code>​
  
-Для упрощения подключения новых ​рабочих ​станций можно (прямо в GitLab IDE) добавить в проект файл start.sh, ​содержащий инструкции из двух предыдущих разделов+В 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>​
  
-, а в readme.md ​описать способ ​его запуска, позволяющий ​инженеру просто скопировать их из браузера сдаваемой в эксплуатацию системы+После синхронизации изменений в репозитории
  
-==== Старая версия ​====+<​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>​
  
-В отличии от настоящего 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 и прочее).
  
-Теперь ​осталось добавлять в проект задачи и ролиопределять (при ​необходимости) соответствующие им инвентарные ​переменные и учитывать (при необходимости) версию дистрибутива.+Спасибо, что дочитали до конца, буду рад, если кому то пригодится и ответить на вопросы, а, так же, советам в комментариях!
  
-Для демонстрации давайте рассмотрим задачи ... 
  
gpo_для_linux.txt · Last modified: 2023/06/02 16:08 by val