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 19:36]
val
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. Возможность предварительного тестирования конфигураций,​ перед передачей их в "​прод"​
Line 15: Line 17:
 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 27: 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 49: 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 91: 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 110: 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 121: 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 147: 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 158: 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 184: 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>​
  
Line 197: Line 209:
 </​code>​ </​code>​
  
-В readme.md опишем способ запуска,​ позволяющий инженеру просто скопировать команды из браузера сдаваемой в эксплуатацию системы (цифра 2, между projects и repository, это Project ID проекта из )+В readme.md опишем способ запуска,​ позволяющий инженеру просто скопировать команды из браузера сдаваемой в эксплуатацию системы (цифра 2, между projects и repository, это Project ID проекта из General Settings)
  
 <​code>​ <​code>​
Line 204: Line 216:
 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>​
 clientN$ sudo journalctl -f clientN$ sudo journalctl -f
 </​code>​ </​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>​
 +
 +После этого сотруднику оправляется ссылка на видео инструкцию ([[https://​youtu.be/​Y4RzavhVwxY?​t=3653|похожую на эту]]) и он самостоятельно подключает свой компьютер к нашей системе управления. В дальнейшем,​ можно создать в проекте новую роль, например - openvpn, добавить ее к плейбуку home-comp.yml и она будет выполнена (в течении 2-х часов или после загрузки) на всех компьютерах,​ hostname которых мы "​прилинковали"​ к файлу home-comp.yml
 +
 +Вот такое решение "из подручных материалов"​. Мы его активно используем,​ добавляя,​ по необходимости,​ новые роли (в том числе, настройку 1С, установку офиса Р7 и прочее).
 +
 +Спасибо,​ что дочитали до конца, буду рад, если кому то пригодится и ответить на вопросы,​ а, так же, советам в комментариях!
 +
  
gpo_для_linux.1682958993.txt.gz · Last modified: 2023/05/01 19:36 by val