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/02 07:12]
val
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. Возможность предварительного тестирования конфигураций,​ перед передачей их в "​прод"​
Line 15: Line 15:
 IMG_1.png IMG_1.png
  
-Эти требования привели к решению,​ использующему связку [[Сервис Ansible#ansible-pull]] (совершенно случайно узнал про него, и вот как пригодилось:​) ​и [[Инструмент GitLab]]+Эти требования привели к решению,​ использующему связку ​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 системы. Остается описать в проекте все необходимые роли и "​запускать"​ их из этих плейбуков.+Коротко про 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 31: Line 31:
 Итак, поехали! Итак, поехали!
  
-На рабочей станции для ​разработки и тестирования ​(у нас будет client1) создаем каталог (в дальнейшем,​ для краткости,​ команды создания и переходов в каталоги будут опущены) для нашего проекта,​ например,​ ansible-pull-gpo (делать это будем в учетной записи root, что позволит сразу тестировать результат)+На компьютере разработчика (у нас будет client1) создаем каталог (в дальнейшем,​ для краткости,​ команды создания и переходов в каталоги будут опущены) для нашего проекта,​ например,​ ansible-pull-gpo (делать это будем в учетной записи root, что позволит сразу тестировать результат)
  
 <​code>​ <​code>​
Line 49: 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 91: 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 110: 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 121: 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 147: 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 158: 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 сервера - 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 (каждые 2 часа со случайной задержкой и после перезагрузки),​ добавляя возможность указывать (например,​ тестовую) ветку проекта. Вывод команды ansible-pull будет передаваться в syslog Скрипт start.sh будет устанавливать необходимое ПО и прописывать ansible-pull в cron (каждые 2 часа со случайной задержкой и после перезагрузки),​ добавляя возможность указывать (например,​ тестовую) ветку проекта. Вывод команды ansible-pull будет передаваться в syslog
Line 184: 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>​
  
Line 204: Line 214:
 sudo -i sudo -i
  
-export BR=main; bash <(curl -s http://server.corp13.un/​api/​v4/​projects/​2/​repository/​files/​start.sh/​raw?​ref=$BR)+export BR=main; bash <(curl -s http://gitlab.corp.ru/​api/​v4/​projects/​2/​repository/​files/​start.sh/​raw?​ref=$BR)
 </​code>​ </​code>​
  
-После синхронизации ​(push) ​изменений в репозитории процесс подключения следующей рабочей станции выглядит как на титульном скриншоте,​ а именно,​ после базовой инсталляции системы,​ инженер подключается локальной учетной записью,​ открывает ​в браузере файл 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>​ <​code>​
Line 213: Line 231:
 </​code>​ </​code>​
  
-Остается рассказать про профили систем. Например,​ домашние компьютеры сотрудников не нужно включать в домен, но иконка "​Помощь/​Help"​ для разрешения удаленного подключения инженера может очень пригодиться. Для этого опишем профиль - просто еще один плейбук,​ аналогичный local.yml с названием home-comp.yml (в реальности, ​лучше использовать отдельный каталог для профилей)+Остается рассказать про профили систем. Например,​ домашние компьютеры сотрудников не нужно включать в домен, но иконка "​Помощь/​Help"​ для разрешения удаленного подключения инженера может очень пригодиться. Для этого опишем профиль - просто еще один плейбук,​ аналогичный local.yml с названием home-comp.yml (в реальности,​ удобнее использовать отдельный каталог для профилей)
  
 <​code>​ <​code>​
-client1:​~/​ansible-pull-gpo# ​cat home-comp.yml+client1:​~/​ansible-pull-gpo# ​nano home-comp.yml
 </​code><​code>​ </​code><​code>​
 - hosts: localhost - hosts: localhost
Line 223: Line 241:
 </​code>​ </​code>​
  
-Далее, уточняем hostname компьютера сотрудника (например,​ petrov-home) и создаем одноименный линк на созданный плейбук:+Далее, уточняем hostname компьютера сотрудника (например,​ petrov-home) и создаем одноименный линк на созданный плейбук ​(hostname должны быть уникальны,​ компьютерам предприятия они назначается по определенному правилу,​ которое исключает возможность совпадений)
  
 <​code>​ <​code>​
 client1:​~/​ansible-pull-gpo#​ ln -s home-comp.yml petrov-home.yml 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>​
  
-После ​синхронизации (push) изменений в репозитории, ​сотруднику оправляется ссылка видео инструкцию ([[https://​youtu.be/​Y4RzavhVwxY?​t=3653|похожую на эту]]) и он самостоятельно подключает свой компьютер к нашей системе управления. ​+После ​этого сотруднику оправляется ссылка на видео инструкцию ([[https://​youtu.be/​Y4RzavhVwxY?​t=3653|похожую на эту]]) и он самостоятельно подключает свой компьютер к нашей системе управления. ​В дальнейшем,​ можно создать в проекте новую роль, например - openvpn, добавить ее к плейбуку home-comp.yml и она будет выполнена (в течении 2-х часов или после загрузки) на всех компьютерах,​ hostname которых мы "​прилинковали"​ к файлу home-comp.yml 
 + 
 +Вот такое решение "из подручных материалов"​. Мы его активно используем,​ добавляя,​ по необходимости,​ новые роли (в том числе, настройку 1С, установку офиса Р7 и прочее). 
 + 
 +Спасибо,​ что дочитали до конца, буду рад, если кому то пригодится и ответить на вопросы,​ а, так же, советам в комментариях! 
  
-Вот такое решение "из подручных материалов"​. Спасибо,​ что дочитали до конца, буду рад ответить на вопросы в комментариях! 
gpo_для_linux.txt · Last modified: 2023/06/02 16:08 by val