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
gpo_для_linux [2023/05/01 09:10]
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 сервера ):+Для сдачи в эксплуатацию следующей системы достаточно выполнить на ней команды (вот он - 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>​
  
-Для упрощения подключения новых ​рабочих ​станций можно (прямо в 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.1682921446.txt.gz · Last modified: 2023/05/01 09:10 by val