
У нас в Altenar собралась достаточно большая и продвинутая команда разработчиков. За эти годы внутри компании накоплен разнообразный опыт в создании и развитии высоконагруженных систем. Поэтому время от времени коллегам хочется поделиться с миром своими знаниями. Регистрироваться на Хабре они пока не готовы, зато совсем не против материализовываться на моей странице. Надеюсь острой аллергии это у вас не вызывает. Если будут вопросы к материалу, смело оставляйте их в комментариях, обещаю молниеносно перенаправлять авторам статьи. Добро пожаловать за кат.

Привет, меня зовут Денис, и я около двух лет работаю DevOps инженером в компании Altenar. Наша инфраструктура располагается как в Google Cloud, так и в собственном облаке на базе VMWare, в котором находится более 200 серверов и виртуальных машин.
Когда количество Linux машин в компании достаточно велико, то рано или поздно возникает необходимость в централизованном управлении доступом к серверам и если в случае с Windows использование AD является индустриальным стандартом, то, когда дело доходит до Linux приходится использовать такие инструменты как FreeIPA.
FreeIPA (Free Identity, Policy and Audit) ─ это open-source решение для Linux (аналогичное MS Active Directory), которое обеспечивает централизованное управление учетными записями и централизованную аутентификацию.
Необходимо отметить, что у RedHat есть решение IdM, которое является частью RHEL. Они технически идентичны с FreeIPA и, можно сказать, что FreeIPA является upstream версией для IdM на которой обкатываются новые фичи (как Fedora для RHEL).
FreeIPA использует клиент-серверную модель. Клиентом может быть любая Linux машина, которая настроена для взаимодействия с FreeIPA (IdM) контроллером домена. Клиент осуществляет взаимодействие с помощью Kerberos, NTP, DNS сервисов и сертификатов.

Как настроить решение с репликацией из двух FreeIPA серверов с DNS можно почитать в этой статье, а для установки FreeIPA клиентов нам понадобится:
● Функционирующий FreeIPA контроллер с настроенным DNS сервером
● Один CentOS 7 сервер по крайней мере с 1GB памяти.
● Ansible version: 2.8+
● Terraform version: 0.13+
Конечно, можно устанавливать FreeIPA клиентов вручную. Это можно сделать в 3 шага:
1) Установить пакет yum install ipa-client
2) Запустить скрипт установки ipa-client-install
3) Пройти по шагам, ответив на вопросы установщика.
Но я уверен, что все прекрасно понимают плюсы автоматизации, поэтому мы пойдем немного другим путём. В Altenar мы используем два основных инструмента автоматизации ─ Ansible и Terraform. В данному случае мы решили использовать Ansible и взяли роль из официального репозитория freeipa.org с минимальным набором переменных в дополнение к перечисленным в /ipaclient/defaults/main.yml.
ipaclient_domain: nix.altenar.com
ipaserver_domain: nix.altenar.com
ipaserver_realm: NIX.ALTENAR.COM
ipaclient_realm: NIX.ALTENAR.COM
ipaclient_no_ntp: yes
ipaclient_mkhomedir: yes
Playbook для запуска роли выглядит так:
---
- name: Playbook to configure IPA clients
hosts:
- linux
- tag_linux
become: yes
gather_facts: True
roles:
- { role: freeipa/ipaclient, state: present }
Изначально мы также использовали ansible для создания DNS записей.
tasks:
- ipa_dnsrecord:
ipa_host: ipa.nix.altenar.com
ipa_pass: <removed>
state: present
zone_name: nix.altenar.com
record_name: "{{inventory_hostname}}"
record_type: 'A'
record_value: "{{ansible_host}}"
validate_certs: no
ipa_user: user
При этом возникала проблема: чтобы создать dns запись необходимо было сначала явно указать IP адрес "{{ansible_host}}" в inventory файле, что было не очень удобно.
[linux]
xknm0.nix.altenar.com ansible_host=10.10.10.243
И так как мы используем в том числе Terraform в нашем частном облаке и стараемся придерживаться подхода IaC был найден terraform-provider-freeipa, который позволил нам добавлять DNS записи при создании виртуальных машин.
terraform {
required_providers {
freeipa = {
source = "camptocamp/freeipa"
version = "0.7.0"
}
}
}
provider freeipa {
host = "ipa.nix.altenar.com" # or set $FREEIPA_HOST
username = "admin" # or set $FREEIPA_USERNAME
password = "<removed>" # or set $FREEIPA_PASSWORD
insecure = true
}
resource freeipa_dns_record "test" {
dnszoneidnsname = "nix.altenar.com."
idnsname = "test"
records = ["10.10.10.10"]
type = "A"
}
В результате мы получаем готовую DNS запись при создании виртуальной машины.

И ничто нам не мешает продолжить установку FreeIPA клиента с помощью Ansible роли.
Так выглядит процесс создания DNS записей и установки FreeIPA клиентов у нас в Altenar. Надеюсь, что наш опыт был вам полезен, ну а мы в свою очередь продолжим делиться лайфхаками.
P.S. Если есть вопросы или вы хотели бы рассказать о своем опыте по заявленной теме, смело приходите в комментарии.