Введение
В этой лабораторной работе вы изучите основные методы управления переменными, фактами и секретами в плейбуках Ansible на системе Red Hat Enterprise Linux (RHEL). Вы узнаете, как сделать автоматизацию более гибкой и эффективной, используя переменные плейбуков, собирая системную информацию с помощью встроенных и пользовательских фактов Ansible, а также защищая конфиденциальные данные (например, пароли) с помощью Ansible Vault.
В ходе практических шагов вы создадите плейбук для развертывания и настройки веб-сервера Apache. Вы начнете с определения простых переменных для имени пакета и веб-контента, затем используете пользовательские факты для динамического обновления конфигурации веб-сервера. В завершение вы примените Ansible Vault для безопасного создания нового системного пользователя с зашифрованным паролем, запустите полный плейбук и убедитесь, что все конфигурации были успешно применены.
Определение и использование переменных плейбука для развертывания веб-сервера Apache
На этом этапе вы узнаете, как использовать переменные в плейбуке Ansible. Переменные необходимы для того, чтобы сделать автоматизацию гибкой, пригодной для повторного использования, а также более простой для чтения и поддержки. Вместо того чтобы жестко прописывать значения (например, имена пакетов или пути к файлам) непосредственно в задачах, вы можете определить их как переменные и ссылаться на них по всему плейбуку. Мы создадим простой плейбук, который использует переменные для установки веб-сервера Apache (httpd) и развертывания базовой веб-страницы.
Переход в каталог проекта
Сначала убедитесь, что вы находитесь в правильном рабочем каталоге. Вся работа в этой лабораторной будет выполняться в каталоге
~/project, который был создан для вас.cd ~/projectУстановите пакет
ansible-core.sudo dnf install -y ansible-coreСоздание плейбука Ansible
Теперь создадим файл плейбука. Назовем его
playbook.yml. Вы можете использовать консольный текстовый редактор, напримерnano, для создания и редактирования файла.nano playbook.ymlЭта команда откроет пустой файл в редакторе
nano. Добавьте начальную часть плейбука. В этом разделе определяется имя сценария (play), целевой хост (localhost, так как мы запускаем его на той же машине) и разделvars, где мы определим наши переменные.--- - name: Deploy Apache using variables hosts: localhost become: true vars: web_pkg: httpd web_content: "Hello from Ansible Variables"Разбор структуры плейбука:
hosts: localhost: Указывает, что плейбук должен выполняться на локальной машине.become: true: Указывает Ansible использовать повышение привилегий (аналогsudo) для задач, что необходимо для установки программного обеспечения.vars: Это словарь, где мы определяем пары «ключ-значение» для переменных. Мы определилиweb_pkgдля имени пакета иweb_contentдля содержимого нашей тестовой веб-страницы.
Добавление задач в плейбук
Затем, под разделом
vars, добавьтеtasks(задачи), которые будут использовать эти переменные. Первая задача установит пакет Apache, а вторая создаст файлindex.html. Добавьте следующий блокtasksв ваш файлplaybook.yml, оставаясь в редактореnano.tasks: - name: Install the latest version of Apache ansible.builtin.dnf: name: "{{ web_pkg }}" state: latest - name: Create a basic index.html file ansible.builtin.copy: content: "{{ web_content }}" dest: /var/www/html/index.htmlОбратите внимание, как мы используем
{{ variable_name }}для обращения к ранее определенным переменным. Это шаблонизация Jinja2, которую Ansible использует для переменных. Это делает определения задач универсальными; если бы вы захотели установить Nginx вместо Apache, вам нужно было бы изменить только переменнуюweb_pkg, а не саму задачу.Проверка и сохранение плейбука
Ваш полный файл
playbook.ymlтеперь должен выглядеть так. Еще раз проверьте содержимое и отступы, так как YAML очень чувствителен к пробелам.--- - name: Deploy Apache using variables hosts: localhost become: true vars: web_pkg: httpd web_content: "Hello from Ansible Variables" tasks: - name: Install the latest version of Apache ansible.builtin.dnf: name: "{{ web_pkg }}" state: latest - name: Create a basic index.html file ansible.builtin.copy: content: "{{ web_content }}" dest: /var/www/html/index.htmlЧтобы сохранить файл в
nano, нажмитеCtrl+X, затемYдля подтверждения изменений и, наконец,Enterдля записи файла под именемplaybook.yml.Проверка синтаксиса плейбука
Перед запуском плейбука всегда полезно проверить его синтаксис на наличие ошибок.
ansible-playbook --syntax-check playbook.ymlЕсли синтаксис верен, вы увидите путь к файлу плейбука в выводе, что подтверждает его корректность:
playbook: playbook.ymlЕсли вы видите ошибки, снова откройте файл с помощью
nano playbook.ymlи исправьте их. Обратите особое внимание на правильные отступы (обычно два пробела).Запуск плейбука
Теперь выполните плейбук. Ansible подключится к
localhost, прочитает переменные и выполнит задачи.ansible-playbook playbook.ymlВы должны увидеть вывод, указывающий на успешное выполнение каждой задачи. Статус
changedозначает, что Ansible внес изменения в систему, например, установил пакет или создал файл.PLAY [Deploy Apache using variables] ******************************************* TASK [Gathering Facts] ********************************************************* ok: [localhost] TASK [Install the latest version of Apache] ************************************ changed: [localhost] TASK [Create a basic index.html file] ****************************************** changed: [localhost] PLAY RECAP ********************************************************************* localhost : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0Если вы запустите плейбук второй раз, задачи должны сообщить
okвместоchanged, так как пакет уже установлен, а файл уже содержит правильное содержимое. Это демонстрирует идемпотентность Ansible.Ручная проверка конфигурации
Хотя плейбук завершен, вы можете вручную проверить, что задачи сработали как ожидалось. Сначала проверьте, был ли установлен пакет
httpd:rpm -q httpdВывод должен показать имя пакета и версию:
httpd-2.4.57-7.el9.x86_64Затем проверьте содержимое файла
index.html:cat /var/www/html/index.htmlВывод должен соответствовать значению вашей переменной
web_content:Hello from Ansible VariablesВы успешно использовали переменные в плейбуке Ansible для настройки системы.
Отображение системной информации с помощью фактов Ansible
На этом этапе вы изучите факты Ansible. Факты — это фрагменты информации, которые Ansible собирает о системах, которыми управляет (в данном случае localhost). Эта информация включает такие детали, как операционная система, сетевые интерфейсы, память и многое другое. По умолчанию Ansible собирает факты в начале каждого сценария, делая их доступными в специальной переменной ansible_facts. Использование фактов позволяет создавать динамические плейбуки, которые адаптируются к среде, в которой они работают.
Переход в каталог проекта
Сначала убедитесь, что вы находитесь в каталоге
~/project, где вы создадите новый плейбук.cd ~/projectСоздание плейбука для отображения всех фактов
Начнем с создания плейбука, который просто отображает все факты, которые Ansible может собрать о вашей системе. Это даст вам представление об огромном объеме доступной информации. Используйте
nanoдля создания нового файла с именемdisplay_facts.yml.nano display_facts.ymlВнутри редактора
nanoдобавьте следующее содержимое. Этот плейбук нацелен наlocalhostи использует модульansible.builtin.debugдля вывода содержимого переменнойansible_facts.--- - name: Display all Ansible facts hosts: localhost tasks: - name: Print all available facts ansible.builtin.debug: var: ansible_factsСохраните файл и выйдите из
nano, нажавCtrl+X, затемYиEnter.Запуск плейбука
Теперь выполните плейбук, чтобы увидеть результат.
ansible-playbook display_facts.ymlВывод будет очень длинным, так как Ansible собирает много данных. Это будет большая структура JSON, содержащая все детали системы. Это ожидаемое поведение.
PLAY [Display all Ansible facts] *********************************************** TASK [Gathering Facts] ********************************************************* ok: [localhost] TASK [Print all available facts] *********************************************** ok: [localhost] => { "ansible_facts": { "ansible_all_ipv4_addresses": [ "172.17.0.2" ], "ansible_all_ipv6_addresses": [ "fe80::42:acff:fe11:2" ], "ansible_apparmor": { "status": "disabled" }, "ansible_architecture": "x86_64", "ansible_bios_date": "01/01/2011", "ansible_bios_version": "1.0", "ansible_cmdline": { "BOOT_IMAGE": "/boot/vmlinuz-5.14.0-427.16.1.el9_4.x86_64", "root": "UUID=...", "ro": true }, "ansible_date_time": { "date": "2024-05-21", "day": "21", "epoch": "1716298855", ... }, "ansible_distribution": "RedHat", "ansible_distribution_major_version": "9", "ansible_distribution_version": "9.4", ... } } PLAY RECAP ********************************************************************* localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0Создание плейбука для отображения конкретных фактов
Отображение всех фактов полезно для ознакомления, но в большинстве случаев вам нужны только определенные данные. Давайте создадим еще один плейбук,
display_specific_facts.yml, чтобы вывести отформатированное сообщение с несколькими ключевыми фактами.nano display_specific_facts.ymlДобавьте следующее содержимое. Этот плейбук использует параметр
msgмодуляdebugдля вывода пользовательской строки. Мы обращаемся к отдельным фактам, используя нотацию скобок, напримерansible_facts['distribution'].--- - name: Display specific Ansible facts hosts: localhost tasks: - name: Print a summary of system facts ansible.builtin.debug: msg: > The operating system is {{ ansible_facts['distribution'] }} version {{ ansible_facts['distribution_major_version'] }}. It has {{ ansible_facts['processor_cores'] }} processor cores and {{ ansible_facts['memtotal_mb'] }} MB of total memory.Символ
>вmsg: >— это функция YAML, которая позволяет записывать многострочную строку более аккуратно. Сохраните файл и выйдите изnano.Запуск плейбука для конкретных фактов
Теперь запустите этот новый плейбук.
ansible-playbook display_specific_facts.ymlВывод будет намного чище и понятнее, отображая только ту информацию, которую вы запросили.
PLAY [Display specific Ansible facts] ****************************************** TASK [Gathering Facts] ********************************************************* ok: [localhost] TASK [Print a summary of system facts] ***************************************** ok: [localhost] => { "msg": "The operating system is RedHat version 9. It has 2 processor cores and 3925 MB of total memory." } PLAY RECAP ********************************************************************* localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0Это демонстрирует, как вы можете использовать факты Ansible, чтобы ваши плейбуки «знали» среду, в которой они работают, что позволяет создавать более интеллектуальную и условную автоматизацию.
Настройка веб-сервера с использованием пользовательских фактов с управляемого хоста
На этом этапе вы узнаете, как использовать пользовательские факты. Хотя Ansible автоматически собирает широкий спектр стандартных фактов, вы также можете определять свои собственные. Они называются «локальными фактами» или «пользовательскими фактами». Это мощная функция, которая позволяет передавать в плейбуки специфическую информацию с управляемого хоста, такую как настройки приложений или данные об оборудовании, которые Ansible не собирает по умолчанию.
Ansible ищет пользовательские факты в каталоге /etc/ansible/facts.d на управляемом хосте. Любой файл в этом каталоге с расширением .fact будет обработан. Эти файлы могут быть простыми текстовыми файлами в стиле INI или файлами JSON.
Создание каталога для пользовательских фактов
Сначала нужно создать каталог, в котором Ansible будет искать файлы пользовательских фактов. Поскольку это системный каталог, для его создания необходимо использовать
sudo.sudo mkdir -p /etc/ansible/facts.dФлаг
-pгарантирует, что команда не вернет ошибку, если каталог уже существует.Создание файла пользовательских фактов
Теперь создадим файл пользовательских фактов, чтобы определить приветственное сообщение для нашего веб-сервера. Мы создадим файл в формате INI с именем
web_config.factв каталоге/etc/ansible/facts.d.sudo nano /etc/ansible/facts.d/web_config.factДобавьте в файл следующее содержимое. Это определяет секцию
[webserver]с ключомwelcome_message.[webserver] welcome_message = Welcome to the server configured by Custom Facts!Сохраните файл и выйдите из
nano, нажавCtrl+X, затемYиEnter.Создание плейбука для использования пользовательского факта
Теперь, когда пользовательский факт готов, мы можем создать плейбук, который считывает этот факт и использует его для настройки домашней страницы нашего веб-сервера. В вашем каталоге
~/projectсоздайте новый плейбук с именемconfigure_web.yml.cd ~/project nano configure_web.ymlДобавьте в плейбук следующее содержимое. Этот плейбук обновит файл
/var/www/html/index.htmlсообщением, определенным в нашем пользовательском факте.--- - name: Configure web server using custom facts hosts: localhost become: true tasks: - name: Update index.html with custom message ansible.builtin.copy: content: "{{ ansible_facts.ansible_local.web_config.webserver.welcome_message }}" dest: /var/www/html/index.htmlРазберем переменную
{{ ansible_facts.ansible_local.web_config.webserver.welcome_message }}:ansible_facts: Корневой словарь для всех фактов.ansible_local: Ключ, в котором хранятся все пользовательские факты.web_config: Имя нашего файла фактов (web_config.fact) без расширения.webserver: Имя секции[webserver]из нашего INI-файла.welcome_message: Ключ для значения, которое мы хотим использовать.
Сохраните файл и выйдите из
nano.Запуск плейбука настройки
Теперь выполните плейбук, чтобы применить конфигурацию.
ansible-playbook configure_web.ymlВывод должен показать, что задача
copyизменила (changed) файлindex.html.PLAY [Configure web server using custom facts] ********************************* TASK [Gathering Facts] ********************************************************* ok: [localhost] TASK [Update index.html with custom message] *********************************** changed: [localhost] PLAY RECAP ********************************************************************* localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0Проверка результата
Наконец, давайте убедимся, что веб-страница была обновлена правильно. Используйте команду
catдля просмотра содержимого файлаindex.html.cat /var/www/html/index.htmlВывод теперь должен отображать сообщение из вашего файла пользовательских фактов:
Welcome to the server configured by Custom Facts!Вы успешно создали пользовательский факт на управляемом хосте и использовали его в плейбуке для динамической настройки службы. Этот метод невероятно полезен для того, чтобы сделать вашу автоматизацию более гибкой и управляемой данными.
Создание системного пользователя с использованием зашифрованных переменных с помощью Ansible Vault
На этом этапе вы узнаете, как управлять конфиденциальными данными, такими как пароли или ключи API, с помощью Ansible Vault. Хранение конфиденциальной информации в открытом виде внутри плейбуков — это серьезный риск безопасности. Ansible Vault предоставляет способ шифрования файлов или отдельных переменных, обеспечивая безопасность ваших секретов. Затем вы можете использовать эти зашифрованные файлы в своих плейбуках, и Ansible будет расшифровывать их во время выполнения, когда вы предоставите правильный пароль.
Мы создадим зашифрованный файл, содержащий имя пользователя и хешированный пароль, а затем используем плейбук для создания нового системного пользователя с этими учетными данными.
Переход в каталог проекта
Убедитесь, что вы находитесь в каталоге
~/projectдля выполнения этой задачи.cd ~/projectСоздание зашифрованного файла Vault
Мы будем использовать команду
ansible-vault createдля создания нового зашифрованного YAML-файла с именемsecrets.yml. Эта команда предложит вам создать пароль для хранилища (vault). Этот пароль потребуется для открытия, редактирования или использования файла в дальнейшем.Сначала установим редактор
nano, чтобы упростить работу:export EDITOR=nanoТеперь создайте файл хранилища:
ansible-vault create secrets.ymlПри появлении запроса введите пароль для вашего хранилища. Для этой лабораторной работы давайте используем
labexв качестве пароля, чтобы упростить задачу. Вам нужно будет ввести его дважды.New Vault password: Confirm New Vault password:После подтверждения пароля команда откроет файл
secrets.ymlв текстовом редактореnano.Добавление секретных переменных в файл Vault
Внутри редактора
nano, который теперь редактирует зашифрованный файлsecrets.yml, добавьте следующие переменные. Мы определим имя пользователя и предварительно хешированный пароль для нового пользователя. Использование хешированного пароля гораздо безопаснее, чем хранение пароля в открытом виде.username: myappuser pwhash: $6$mysalt$QwMzWSEyCAGmz7tzVrAi5o.8k4d05i2QsfGGwmPtlJsWhGjSjCW6yFCH/OEqEsHk7GMSxqYNXu5sshxPmWyxo0username: Имя системного пользователя, которого мы хотим создать.pwhash: Безопасно хешированный пароль. Этот конкретный хеш соответствует паролюAnsibleUserP@ssw0rdи находится в формате, который понимает модульansible.builtin.user.
Сохраните файл и выйдите из
nano(Ctrl+X, затемY, затемEnter). Файлsecrets.ymlв вашем каталоге~/projectтеперь зашифрован. Если вы попытаетесь просмотреть его с помощьюcat secrets.yml, вы увидите только зашифрованный текст.Создание плейбука для использования файла Vault
Теперь создайте новый плейбук с именем
create_user.yml, который будет использовать переменные из вашего зашифрованного файлаsecrets.yml.nano create_user.ymlДобавьте следующее содержимое. Директива
vars_filesуказывает Ansible загрузить переменные из указанного файла.--- - name: Create a user from secret variables hosts: localhost become: true vars_files: - secrets.yml tasks: - name: Create the {{ username }} user ansible.builtin.user: name: "{{ username }}" password: "{{ pwhash }}" state: presentЭтот плейбук создаст пользователя с именем и хешем пароля, определенными в
secrets.yml. Сохраните файл и выйдите изnano.Запуск плейбука с паролем Vault
Чтобы запустить плейбук, использующий зашифрованный файл, вы должны предоставить пароль хранилища. Вы можете сделать это интерактивно, используя флаг
--ask-vault-pass.ansible-playbook --ask-vault-pass create_user.ymlAnsible запросит пароль хранилища. Введите
labex(пароль, который вы установили на шаге 2).Vault password:После того как вы предоставите правильный пароль, Ansible расшифрует файл в памяти и выполнит плейбук. Вы должны увидеть следующий вывод, указывающий на то, что пользователь был создан.
PLAY [Create a user from secret variables] ************************************* TASK [Gathering Facts] ********************************************************* ok: [localhost] TASK [Create the myappuser user] *********************************************** changed: [localhost] PLAY RECAP ********************************************************************* localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0Проверка создания пользователя
Вы можете подтвердить, что
myappuserбыл успешно создан в системе, используя командуid.id myappuserЕсли пользователь существует, вы увидите информацию о его идентификаторе пользователя (uid) и идентификаторе группы (gid).
uid=1002(myappuser) gid=1002(myappuser) groups=1002(myappuser)Это подтверждает, что вы успешно использовали Ansible Vault для управления конфиденциальными данными для ваших задач автоматизации.
Запуск плейбука с файлом паролей Vault для применения конфигураций
На этом этапе вы узнаете более автоматизированный способ предоставления пароля хранилища для Ansible. На предыдущем этапе вы использовали --ask-vault-pass для ввода пароля в интерактивном режиме. Хотя это безопасно, это не подходит для автоматизированных сред, таких как CI/CD конвейеры, где нет пользователя, который мог бы ввести пароль.
Решение заключается в использовании файла паролей хранилища. Это простой текстовый файл, содержащий пароль хранилища. Затем вы можете ссылаться на этот файл при запуске плейбука, и Ansible будет автоматически считывать из него пароль. В целях безопасности крайне важно ограничить права доступа к этому файлу паролей, чтобы его могли читать только авторизованные пользователи.
Переход в каталог проекта
Убедитесь, что вы находитесь в каталоге
~/project, где расположены ваш плейбук и файл хранилища.cd ~/projectСоздание файла паролей Vault
Давайте создадим файл для хранения нашего пароля хранилища. Назовем его
vault_pass.txt. Мы можем использовать командуechoдля создания файла и записи в него пароля (labex) за один шаг.echo "labex" > vault_pass.txtВы можете проверить содержимое файла с помощью
cat:cat vault_pass.txtВывод должен быть:
labexЗащита файла паролей
Хранение пароля в текстовом файле рискованно. Вы должны ограничить права доступа к файлу, чтобы защитить его. Команда
chmodпозволяет изменять права доступа к файлам. Мы установим права600, что означает, что только владелец файла (в данном случае пользовательlabex) имеет права на чтение и запись. Никакие другие пользователи в системе не смогут получить к нему доступ.chmod 600 vault_pass.txtВы можете проверить новые права доступа с помощью команды
ls -l:ls -l vault_pass.txtВывод должен начинаться с
-rw-------, подтверждая ограниченные права доступа.-rw-------. 1 labex labex 6 May 21 14:30 vault_pass.txtИзменение плейбука для добавления пользователя в группу
Давайте изменим наш плейбук
create_user.ymlдля выполнения дополнительного действия. Мы добавимmyappuserв группуwheel, которая во многих системах предоставляет административные привилегии (sudo). Это продемонстрирует запуск плейбука, который вносит изменения в существующую конфигурацию.Сначала откройте плейбук
create_user.ymlдля редактирования.nano create_user.ymlИзмените задачу
ansible.builtin.user, чтобы включить параметрыgroupsиappend.--- - name: Create a user from secret variables hosts: localhost become: true vars_files: - secrets.yml tasks: - name: Create the {{ username }} user and add to wheel group ansible.builtin.user: name: "{{ username }}" password: "{{ pwhash }}" state: present groups: wheel append: truegroups: wheel: Указывает группу, в которую нужно добавить пользователя.append: true: Гарантирует, что пользователь будет добавлен в эту группу, не удаляясь из других групп, в которых он может состоять.
Сохраните файл и выйдите из
nano.Запуск плейбука с файлом паролей Vault
Теперь снова запустите плейбук. На этот раз вместо
--ask-vault-passиспользуйте опцию--vault-password-file(или ее короткий псевдоним--vault-pass-file), чтобы указать путь к вашему файлу паролей.ansible-playbook --vault-password-file vault_pass.txt create_user.ymlAnsible теперь запустится без запроса пароля, так как он считывает его напрямую из
vault_pass.txt. Вы должны увидеть вывод, указывающий на то, что конфигурация пользователя была изменена.PLAY [Create a user from secret variables] ************************************* TASK [Gathering Facts] ********************************************************* ok: [localhost] TASK [Create the myappuser user and add to wheel group] ************************ changed: [localhost] PLAY RECAP ********************************************************************* localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0Статус
changedподтверждает, что Ansible изменил пользователя, добавив его в группуwheel.Проверка членства пользователя в группе
Наконец, убедитесь, что
myappuserтеперь является членом группыwheel. Вы можете сделать это с помощью командыgroups.groups myappuserВывод должен показать как основную группу пользователя (
myappuser), так и группуwheel.myappuser : myappuser wheelВы успешно использовали файл паролей хранилища для запуска плейбука в неинтерактивном режиме — это ключевой навык для автоматизации безопасных рабочих процессов.
Проверка конфигурации веб-сервера и пользователя
На этом заключительном этапе вы закрепите свои знания, создав специальный плейбук для проверки. До сих пор вы вручную проверяли результаты своих плейбуков с помощью стандартных команд Linux, таких как cat, id и groups. Более мощный и воспроизводимый подход — использовать сам Ansible для аудита и проверки состояния вашей системы.
Этот плейбук будет действовать как набор тестов, программно проверяя, что веб-сервер установлен, веб-страница имеет правильное содержимое, а системный пользователь существует с правильным членством в группах. Это демонстрирует, как Ansible можно использовать не только для управления конфигурациями, но и для проверки соответствия требованиям и состояния системы.
Переход в каталог проекта
Сначала убедитесь, что вы находитесь в каталоге
~/project.cd ~/projectСоздание плейбука проверки
Давайте создадим новый плейбук с именем
verify_config.yml. Этот плейбук будет содержать ряд задач, которые проверяют конфигурации, примененные вами на предыдущих этапах.nano verify_config.ymlДобавление задач для проверки конфигурации
Внутри редактора
nanoдобавьте следующее содержимое. Мы построим этот плейбук из нескольких задач, каждая из которых предназначена для подтверждения того, что определенное условие истинно. Если какое-либо утверждение не выполняется, плейбук остановится и сообщит об ошибке, сразу указывая, что именно не так.--- - name: Verify system configuration hosts: localhost become: true tasks: - name: Check if httpd package is installed ansible.builtin.dnf: list: httpd register: httpd_pkg_info - name: Assert that httpd is installed ansible.builtin.assert: that: - httpd_pkg_info.results | length > 0 fail_msg: "Apache (httpd) package is not installed." success_msg: "Apache (httpd) package is installed." - name: Read the content of the index.html file ansible.builtin.slurp: src: /var/www/html/index.html register: index_file - name: Assert that the web page content is correct ansible.builtin.assert: that: - "'Custom Facts' in (index_file.content | b64decode)" fail_msg: "Web page content is incorrect." success_msg: "Web page content is correct." - name: Check if myappuser exists ansible.builtin.getent: database: passwd key: myappuser register: user_info - name: Assert that myappuser exists ansible.builtin.assert: that: - user_info.ansible_facts.getent_passwd['myappuser'] is defined fail_msg: "User 'myappuser' does not exist." success_msg: "User 'myappuser' exists." - name: Query the wheel group members ansible.builtin.getent: database: group key: wheel register: wheel_group_info - name: Assert that myappuser is in the wheel group ansible.builtin.assert: that: - "'myappuser' in (wheel_group_info.ansible_facts.getent_group['wheel'][2] | default('') | split(','))" fail_msg: "User 'myappuser' is not in the wheel group." success_msg: "User 'myappuser' is in the wheel group."Давайте рассмотрим ключевые используемые модули:
ansible.builtin.dnfсlist: Проверяет наличие пакета и регистрирует результат.ansible.builtin.slurp: «Считывает» все содержимое файла с удаленного хоста. Содержимое кодируется в base64 для безопасной передачи.ansible.builtin.getent: Безопасный способ запроса системных баз данных, таких какpasswdиgroup. Результаты сохраняются вansible_facts, поэтому доступ к возвращенным данным осуществляется через ключи, такие какuser_info.ansible_facts.getent_passwd.ansible.builtin.assert: Это основа нашей проверки. Он проверяет, истинно ли заданное условие. Если нет, он прерывает выполнение сценария. Мы предоставляем пользовательские сообщения об успехе и неудаче.b64decode: Фильтр Jinja2, используемый для декодирования содержимого base64, полученного из модуляslurp.
Обратите внимание, что мы запрашиваем базы данных
passwdиgroupотдельно. Это позволяет проверке существования пользователя и проверке членства в группе wheel соответствовать фактическим данным, возвращаемымgetent.Сохраните файл и выйдите из
nano(Ctrl+X,Y,Enter).Запуск плейбука проверки
Теперь выполните ваш плейбук проверки. Поскольку он не использует никаких зашифрованных файлов, вам не нужно предоставлять пароль.
ansible-playbook verify_config.ymlЕсли все ваши предыдущие шаги были выполнены правильно, плейбук выполнится успешно, и вы увидите пользовательское сообщение об успехе для каждого утверждения.
PLAY [Verify system configuration] ********************************************* TASK [Gathering Facts] ********************************************************* ok: [localhost] TASK [Check if httpd package is installed] ************************************* ok: [localhost] TASK [Assert that httpd is installed] ****************************************** ok: [localhost] => { "changed": false, "msg": "Apache (httpd) package is installed." } TASK [Read the content of the index.html file] ********************************* ok: [localhost] TASK [Assert that the web page content is correct] ***************************** ok: [localhost] => { "changed": false, "msg": "Web page content is correct." } TASK [Check if myappuser exists] *********************************************** ok: [localhost] TASK [Assert that myappuser exists] ******************************************** ok: [localhost] => { "changed": false, "msg": "User 'myappuser' exists." } TASK [Query the wheel group members] ******************************************* ok: [localhost] TASK [Assert that myappuser is in the wheel group] ***************************** ok: [localhost] => { "changed": false, "msg": "User 'myappuser' is in the wheel group." } PLAY RECAP ********************************************************************* localhost : ok=9 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0Поздравляем! Вы успешно использовали Ansible для определения переменных, сбора системных фактов, управления секретами с помощью Vault и, наконец, для автоматизированной проверки состояния вашей системы.
Резюме
В этой лабораторной работе вы научились управлять различными типами данных в плейбуках Ansible для настройки системы RHEL. Вы начали с определения и использования стандартных переменных плейбука для гибкой установки и настройки веб-сервера Apache. Затем вы изучили, как использовать встроенные факты Ansible для отображения системной информации, что послужило основой для создания динамических и «осведомленных» о хосте задач автоматизации.
Опираясь на это, вы дополнительно настроили веб-сервер, создав и используя пользовательские факты с управляемого хоста. Для безопасной обработки конфиденциальной информации вы использовали Ansible Vault для шифрования пароля пользователя, создали нового системного пользователя с этой зашифрованной переменной и выполнили плейбук в неинтерактивном режиме с помощью файла паролей хранилища. Лабораторная работа завершилась проверкой того, что веб-сервер и новый системный пользователь были настроены правильно, что подтвердило успешное применение всех изученных концепций.


