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/04/30 20:01]
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. Возможность предварительного тестирования конфигураций,​ перед передачей их в "​прод"​
  
-Эти требования привели к решению,​ использующему связку [[Сервис 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>​
-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 106: Line 109:
 </​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>​
  
-Для использования этих ​плейбуков на других рабочих станциях в сети, устанавливаем GitLab, можно по инструкциям из [[https://​habr.com/​ru/​articles/​716454/​|этой статьи]] и создаем проект с названием ansible-pull-gpo+Создаем плейбукобъединяющий ​все ​эти роли и тестируем результат:
  
-Устанавливаем на рабочую станцию для разработки и тестирования утилиту git+<​code>​ 
 +client1:​~/​ansible-pull-gpo#​ nano local.yml 
 +- hosts: localhost 
 +  roles: 
 +    - role: kerberos 
 +    - role: proxy 
 +    - role: help 
 +</​code><​code>​ 
 +client1:​~/​ansible-pull-gpo#​ ansible-playbook local.yml 
 + 
 +client1:​~/​ansible-pull-gpo#​ reboot 
 +</​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 git client1:~# apt install git
-</​code>​ 
  
-и выполняем команды из подсказок проекта.+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>​
  
-Для сдачи в эксплуатацию следующей системы достаточно выполнить на ней команды:​+Для сдачи в эксплуатацию следующей системы достаточно выполнить на ней команды ​(вот он - ansible-pull в действии ​:)
  
 <​code>​ <​code>​
 client2:~# apt install git ansible client2:~# apt install git ansible
  
 +client2:~# ansible-pull -U http://​gitlab.corp.ru/​student/​ansible-pull-gpo.git
 +
 +client2:~# reboot
 +</​code>​
 +
 +Инструкцию ansible-pull можно прописать в cron, что бы обновления конфигурации загружались периодически,​ но еще лучше, добавить в проект файлы, облегчающие процесс ввода в эксплуатацию новых рабочих станций:​
 +
 +Скрипт start.sh будет устанавливать необходимое ПО и прописывать ansible-pull в cron (каждые 2 часа со случайной задержкой и после перезагрузки),​ добавляя возможность указывать (например,​ тестовую) ветку проекта. Вывод команды ansible-pull будет передаваться в syslog
 +
 +<​code>​
 +client1:​~/​ansible-pull-gpo#​ nano 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.1682874086.txt.gz · Last modified: 2023/04/30 20:01 by val