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 06:57]
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. Возможность предварительного тестирования конфигураций,​ перед передачей их в "​прод"​
  
-Эти требования привели к решению,​ использующему связку [[Сервис 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>​
 +client1:~# apt install ansible
 +
 client1:~# mkdir ansible-pull-gpo client1:~# mkdir ansible-pull-gpo
  
Line 45: 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 87: 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>​
-http_proxy=http://​gate.corp13.un:​3128 +https_proxy=http://​authproxy.corp.ru:3128 
-https_proxy=http://​gate.corp13.un:3128 +no_proxy=localhost,​127.0.0.1,​corp.ru
-no_proxy=localhost,​127.0.0.1,​corp13.un+
 </​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 104: Line 107:
 </​code>​ </​code>​
  
-Третья роль, обещанная в [[https://​habr.com/​ru/​articles/​709218/​|этой статье]],​ устанавливает ПО и "​иконку"​ для корпоративного аналога+Третья роль, обещанная в [[https://​habr.com/​ru/​articles/​709218/​|этой статье]],​ устанавливает ПО и "​иконку"​ для корпоративного аналога ​TeamViewer
  
 <​code>​ <​code>​
 +client1:​~/​ansible-pull-gpo#​ nano help/​files/​usr/​share/​applications/​help.desktop
 +</​code><​code>​
 +[Desktop Entry]
 +Name=Help
 +Name[ru_RU]=Помощь
 +Exec=/​bin/​bash -c 'echo -n "Enter ID: "; read -r ID; /​usr/​bin/​x11vnc -connect help.corp.ru:"​$ID"'​
 +Terminal=true
 +Type=Application
 +Icon=help-browser
 +Categories=Network
 +</​code><​code>​
 +client1:​~/​ansible-pull-gpo#​ nano help/​tasks/​main.yml
 +</​code><​code>​
 +- name: Install x11vnc
 +  apt: pkg=x11vnc state=present update_cache=true
  
 +- name: Copy help.desktop
 +  copy:
 +    src: usr/​share/​applications/​help.desktop
 +    dest: /​usr/​share/​applications/​
 </​code>​ </​code>​
  
-Создаем плейбук,​ объединяющий все эти роли:+Создаем плейбук,​ объединяющий все эти роли ​и тестируем результат:
  
 <​code>​ <​code>​
Line 119: Line 141:
     - role: proxy     - role: proxy
     - role: help     - role: help
 +</​code><​code>​
 +client1:​~/​ansible-pull-gpo#​ ansible-playbook local.yml
 +
 +client1:​~/​ansible-pull-gpo#​ reboot
 </​code>​ </​code>​
  
-Протестировать ​результат на рабочей станцию для разработки можно таким образом:+После перезагрузки,​ должна появиться возможность подключаться любым доменным пользователем,​ браузер должен работать через authproxy, а в меню графической оболочки,​ в разделе "Интернет",​ должна появиться иконка "​Помощь"​. 
 + 
 +Для доступа к этим ролям с других ​рабочих станций, разместим все в корпоративном 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:
  
 <​code>​ <​code>​
-client1:~# apt install ​ansible+client1:~# apt install ​git
  
-client1:~/ansible-pull-gpo# ansible-playbook local.yml+client1:~# cd ansible-pull-gpo/
  
-client1:​~/​ansible-pull-gpo# ​init 6 +client1:​~/​ansible-pull-gpo# ​git config --global user.email "​student@corp.ru"​
-</​code>​+
  
-После перезагрузки должна появиться возможность подключаться любым доменным пользователем,​ браузер должен подключаться через http proxy, а в разделе "​Сеть"​ должна появиться иконка "​Help"​+client1:​~/​ansible-pull-gpo#​ git init --initial-branch=main
  
-Для использования этих плейбуков на других рабочих станциях в сети, устанавливаем GitLab, можно по инструкциям из [[https://habr.com/ru/articles/716454/​|этой статьи]] и создаем проект с названием ​ansible-pull-gpo+client1:~/ansible-pull-gpo#​ git remote add origin http://gitlab.corp.ru/student/​ansible-pull-gpo.git
  
-Устанавливаем на рабочую станцию для разработки и тестирования утилиту git+client1:​~/​ansible-pull-gpo#​ git add . 
 + 
 +client1:​~/​ansible-pull-gpo#​ commit -m "​Initial commit"​ 
 + 
 +client1:​~/​ansible-pull-gpo#​ push -u origin main 
 +</​code>​ 
 + 
 +Для ​сдачи в эксплуатацию следующей системы достаточно выполнить на ней команды (вот он - ansible-pull в действии ​:)
  
 <​code>​ <​code>​
-client1:~# apt install git+client2:~# apt install git ansible
  
 +client2:~# ansible-pull -U http://​gitlab.corp.ru/​student/​ansible-pull-gpo.git
  
 +client2:~# reboot
 </​code>​ </​code>​
  
-и выполняем команды из подсказок проекта.+Инструкцию ansible-pull можно прописать ​в cron, что бы обновления конфигурации загружались ​периодически, но еще лучше, добавить в проект файлы, облегчающие ​процесс ввода в эксплуатацию новых рабочих станций:​
  
-Для сдачи в эксплуатацию ​следующей системы достаточно выполнить на ней ​команды:+Скрипт start.sh будет устанавливать необходимое ПО и прописывать ansible-pull в cron (каждые 2 часа со случайной задержкой и после перезагрузки), ​добавляя возможность указывать (например,​ тестовую) ветку ​проекта. Вывод ​команды ​ansible-pull будет передаваться в syslog
  
 <​code>​ <​code>​
-client2:~# apt install git ansible+client1:~/​ansible-pull-gponano start.sh 
 +</​code><​code>​ 
 +#​!/​bin/​bash 
 + 
 +apt update 
 +apt install ​-y git ansible 
 + 
 +echo -e "0 */2 * * * \ 
 +/​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://​gitlab.corp.ru/​student/​ansible-pull-gpo.git -C $BR 2>&1 | /​usr/​bin/​logger -t ansible-pull"​ | crontab - 
 +</​code>​ 
 + 
 +Проверить работу скрипта можно здесь же: 
 + 
 +<​code>​ 
 +client1:​~/​ansible-pull-gpo#​ BR=main bash start.sh
  
 +client1:​~/​ansible-pull-gpo#​ crontab -l
 ... ...
 </​code>​ </​code>​
  
-Последнюю ​инструкцию лучше пропасать в cron (c сообщениями в syslog), что бы можно ​было управлять ее конфигурацией в будущем+В 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>​
  
-Для упрощения подключения новых рабочих станций можно (прямо в GitLab IDE) добавить в проект файл start.sh, содержащий инструкции из двух предыдущих разделов,​ а в readme.md описать способ его запуска,​ позволяющий инженеру просто скопировать ​их из браузера сдаваемой в эксплуатацию системы+После синхронизации изменений в репозитории
  
 <​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>​ </​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