Содержание Playbook
initial_server_setup.yml—- hosts: all remote_user: root gather_facts: false vars: create_user: sammy copy_local_key: «{{ lookup(‘file’, lookup(‘env’,’HOME’) + ‘/.ssh/id_rsa.pub’) }}» sys_packages: tasks: — name: Make sure we have a ‘wheel’ group group: name: wheel state: present — name: Allow ‘wheel’ group to have passwordless sudo lineinfile: path: /etc/sudoers state: present regexp: ‘^%wheel’ line: ‘%wheel ALL=(ALL) NOPASSWD: ALL’ validate: ‘/usr/sbin/visudo -cf %s’ — name: Create a new regular user with sudo privileges user: name: «` create_user `» groups: wheel shell: /bin/bash — name: Set authorized key for remote user authorized_key: user: «` create_user `» state: present key: «` copy_local_key `» — name: Disable password authentication for root lineinfile: path: /etc/ssh/sshd_config state: present regexp: ‘^PermitRootLogin’ line: ‘PermitRootLogin prohibit-password’ — name: Update apt apt: update_cache=yes — name: Install required system packages apt: name=` sys_packages ` state=latest — name: UFW — Allow SSH connections ufw: rule: allow name: OpenSSH — name: UFW — Deny all other incoming traffic by default ufw: state: enabled policy: deny direction: incoming
Роли
Ролью называется типовой набор переменных и задач, назначаемых для одного или нескольких серверов. Если вам нужно применить к серверу или группе серверов типовой набор операций, вам достаточно просто назначить ему роль. Предварительно в проекте каталоге проекта должна быть создана соответствующая структура. В сценариях роли назначаются следующим образом:
--- - name: check and apply basic configuration to all hosts hosts: all roles: - common - name: check and apply configuration to group1 hosts: group1 roles: - pgsql - name: check and apply configuration to group2 hosts: group2 roles: - fooapp
Cценарии (playbooks)
Все сценарии в Ansible пишутся на YAML. Это — человекочитаемый формат сериализованных данных, гораздо более простой, чем XML или JSON.
Чтобы выполнить сценарий используется команда ansible-playbook со следующим сиснтаксисом:
ansible-playbook <имя_файла_сценария.yml> ...
В начале сценария обязательно должна присутствовать последовательность символов «–––» (так в YAML обозначается начало документа). Перед каждым новым разделом списка ставится дефис ( – ):
--- - hosts: webservers
Основными параметрами/группами простого сценария являются:
- hosts — в нем указываются управляемые узлы или группы узлов, к которым нужно применить изменения;
- tasks — здесь описывается состояние, в которое необходимо привести управляемый узел, альтернативой этому могут служить роли;
Также в сценарии перед непосредственным описанием задач могут быть указаны следующие параметры или группы параметров:
- gather_facts — собирать или нет информацию о хостах перед выполнением задач, по умолчанию — да;
- vars — в нем указываются различные переменные, которые будут использованы при выполнении сценария;
- connection — можно указать метод соединения с хостами: pure ssh, paramiko, fireball, chroot, jail, local, accelerate (применимо также для выполнения отдельного модуля);
- sudo — после установления соединения выполнять задачу с привилегиями другого пользователя, по умолчанию другой пользователь — root;
- sudo_user — в сочетании с предыдущим параметром можно указать с привилегиями какого именно пользователя будет выполнена задача;
- vars_prompt — перед выполением плэйбука Ansible в интерактивном режиме может уточнить указанные в этом разделе параметры;
- remote_user (в предыдущих версиях — просто user) — имя пользователя для авторизации на удалённом хосте.
Рассмотрим все эти разделы более подробно.
В разделе hosts указывается группа управляемых узлов, к которой будут применены описываемые в сценарии изменения.
Так, строка формата:
hosts: webservers
означает, что изменения будут применены к узлам из группы webservers.
Сценарии могут выполняться не только от имени пользователя, под именем которого установлено соедиение, но и любого другого. В следующем примере авторизация на хосте будет произведена с именем yourname, но задачи будут выполняться от имени пользователя root (если, конечно, этому пользователю это разрешено):
--- - hosts: webservers user: yourname sudo: yes
Если добавить параметр “user: postgres”, то все действия будут выполняться с привилегиями пользователя postgres.
В разделе vars указываются переменные, которые будут использованы в сценарии, и их значения:
- hosts: webservers vars: http_port: 80 max_clients: 200
Список изменений, которые необходимо произвести на управляемом узле, приводится в разделе tasks. Каждой задаче (task) присваивается имя (name). Далее указываются модули Ansible, которые будут задействованы при ее выполнении:
- hosts: webservers user: yourname tasks: - service: name=nginx state=started
Для каждой задачи можно указывать пользователя, от имени которого она будет выполнена:
--- - hosts: webservers user: yourname tasks: - service: name=nginx state=started sudo: yes
Файл конфигурации /etc/ansible/hosts
В файле /etc/ansible/hosts указывается список хостов, с которыми должен работать ansible.Файл снабжен достаточно подробными комментариями:
Нажмите здесь для раскрытия…
# Это файл ansible ‘hosts’, установленный по умолчанию.## Файл должен иметь имя /etc/ansible/hosts## — Комментарии начинаются с симовла ‘#’# — Пустые строки игнорируются# — Группы хостов разделяются элементами # — Можно использовать имена хостов или IP-адреса# — Имя хоста или адрес могут входить в несколько групп
# Пример 1: Хосты без групп должны быть перечислены до первого заголовка группы.
#
# Пример 2: После заголовка начался список хостов, входящих в группу ‘webservers’
# здесь всё ещё группа ‘webservers’
#
# Пример 3: После заголовка началась группа серверов баз данных ‘dbservers’ group
# Еще пример диапазона имён, теперь без лидирующих нулей
Дополнительно в файле
Проверки и условия
В данную группу войдут действия, которые помогут нам ограничить выполнение задач.
1. Проверка на пустую папку.
Задачи сводится к двум операциям:
- получении списка файлов в целевом каталоге (например, с помощью команды ls) и регистрации полученного значения в переменную с помощью register.
- проверка содержимого переменной, которую мы получили на шаге 1 с помощью when.
Пример будет таким:
— name: Register Contents of PGDATA Folder
shell: ls /var/lib/postgresql/11/main
register: pg_contents
— name: Init PostgreSQL DB
shell: /opt/pgpro/std-11/bin/pg-setup initdb
environment:
PGDATA: «/var/lib/postgresql/11/main»
when: pg_contents | length == 0
* в данном примере мы в первой задаче выводим содержимое каталога /var/lib/postgresql/11/main и помещаем его в переменную pg_contents. Во второй задаче мы уже проверяем с помощью when количество строк — если их 0, то тогда выполняем команду initdb
На практике, это важно, так как инициализация базы PostgreSQL при непустом каталоге выводит сообщение об ошибке
О when: https://docs.ansible.com/ansible/latest/user_guide/playbooks_conditionals.html.
2. Проверить, определена ли переменная.
Для этого используется опция is defined (определена) или is not defined (не определена):
when: pgpro is defined
when: pgpro is not defined
* в данном примере мы проверим наличие переменной pgpro. На практике такая проверка имеет значение, так как если мы попробуем выполнить действия с несуществующей переменной, Ansible нам вернет ошибку.
В официальной документации про это сказано в статье о when (ссылка выше).
3. Выполнение команды, если сервис в рабочем состоянии.
Нам необходимо получить информацию о службах с помощью service_facts, после чего можно уже делать проверку с помощью when:
— name: Populate service facts
ansible.builtin.service_facts:
— name: Stop Service If Running One
shell: systemctl stop apache2
when: ansible_facts.services is defined and ansible_facts.services.state == «running»
* в данном примере мы проверим, есть ли служба apache2 и запущена ли она. Если это так, то мы ее останавливаем.
Подробнее о service_facts можно прочитать в документации (ссылка выше в разделе 4. Получить список сервисов).
4. Существует ли файл.
Проверка может быть выполнена с помощью stat:
— name: Register File Stat
stat:
path: /etc/nginx/nginx.conf
register: stat_result
— name: Cat file if exists
shell: cat /etc/nginx/nginx.conf
when: stat_result.stat.exists
* в данном примере будет выполнено чтение файла /etc/nginx/nginx.conf, если он существует.
О stat: https://docs.ansible.com/ansible/latest/collections/ansible/builtin/stat_module.html.
5. Операционная система.
С помощью переменных ansible_os_family и ansible_distribution_major_version мы можем получить информацию об операционной системы, которая работает на целевом компьютере. Это можно использовать для выполнения проверок и задания условий.
а) Проверка по семейству:
— name: Run task1 if OS is Debian
…
when: ansible_os_family == «Debian»
— name: Run task2 if OS is Red Hat
…
when: ansible_os_family == «RedHat»
* в данном примере мы запустим задачу task1 в системах на основе Debian и task2 — на основе RedHat.
— name: Run task1 if OS is Debian 9
…
when: ansible_os_family == «Debian» and ansible_distribution_major_version == «9»
— name: Run task2 if OS is Red Hat 8
…
when: ansible_os_family == «RedHat» and ansible_distribution_major_version == «8»
* в данном примере мы запустим задачу task1 в системах на основе Debian версии 9 и task2 — на основе RedHat версии 8.
Installing and running the devel branch from source
In Ansible 2.10 and later, the ansible/ansible repository contains the code for basic features and functions, such as copying module code to managed nodes. This code is also known as .
New features are added to on a branch called . If you are testing new features, fixing bugs, or otherwise working with the development team on changes to the core code, you can install and run .
Note
You should only install and run the branch if you are modifying or trying out features under development. This is a rapidly changing source of code and can become unstable at any point.
Note
If you want to use Ansible AWX as the control node, do not install or run the branch of Ansible. Use an OS package manager (like or ) or to install a stable version.
If you are running Ansible from source, you may also wish to follow the Ansible GitHub project. We track issues, document bugs, and share feature ideas in this and other related repositories.
For more information on getting involved in the Ansible project, see the . For more information on creating Ansible modules and Collections, see the .
You can install the branch of directly from GitHub with :
$ python -m pip install --user https://github.com/ansible/ansible/archive/devel.tar.gz
Note
If you have Ansible 2.9 or older installed or Ansible 3, see .
You can replace in the URL mentioned above, with any other branch or tag on GitHub to install older versions of Ansible (prior to 2.10.), tagged alpha or beta versions, and release candidates. This installs all of Ansible.
$ python -m pip install --user https://github.com/ansible/ansible/archive/stable-2.9.tar.gz
See for instructions on how to run directly from source.
You can install the branch of by cloning the GitHub repository:
$ git clone https://github.com/ansible/ansible.git $ cd ./ansible
The default branch is .
Теги
В нашем примере нам не довелось использовать теги — еще одну удобную возможность управления запуском плейбука.
Теги позволяют отметить роль и при запуске плейбука запустить именно ее, проигнорировав другие роли. Например, есть такой плейбук:
…
roles:
— role: nginx
tags: web1
— role: apache
tags: web2
* в данном плейбуке есть две роли — одна называется nginx, вторая — apache; для каждой роли мы задали свой тег.
Теперь, чтобы запустить плейбук, но выполнить в нем определенную роль, нам достаточно указать тег:
ansible-playbook —tags web2 /etc/ansible/play.yml -kK
* данная команда запустит плейбук с выполнением только роли с тегом web2 (в нашем примере, apache).
Краткий словарь терминов Ansible
В этом руководстве широко используются такие термины Ansible:
- Control Machine (или Node): ведущая система, в которой установлен Ansible и откуда он может подключаться к нодам и выполнять на них команды.
- Нода (Node): сервер, управляемый Ansible.
- Файл инвентаря (Inventory): файл, который содержит информацию о серверах, которыми управляет Ansible, обычно находится в /etc/ansible/hosts.
- Плейбук (Playbook): файл, содержащий серию задач, которые нужно выполнить на удаленном сервере.
- Роли (Roles): коллекция плейбуков и других файлов, которые имеют отношение к цели (например, к установке веб-сервера).
- Play: полный набор инструкций Ansible. В play может быть несколько плейбуков и ролей, включенных в один плейбук, который служит точкой входа.
Тестирование Ansible
Чтобы проверить Ansible и убедиться, что он работает, вы можете запускать для него команды. Например, чтобы проверить, что сеть работает для всех удаленных серверов, выполните следующую команду из Ubuntu.
ansible -m ping server1 --ask-pass
Или пингуйте всю группу:
ansible -m ping servers --ask-pass
Если команда ping выполнена успешно, Ansible может получить доступ к вашим серверам и работает правильно.
Выполнение других команд
Чтобы запустить любую команду на серверах, управляемых с помощью Ansible, следуйте синтаксису команды ниже. Однако не забудьте заменить EXAMPLE-COMMAND на фактическую команду, которую вы хотите запустить.
ansible -m shell -a 'EXAMPLE-COMMAND' servers --ask-pass
Или конкретный сервер:
ansible -m shell -a 'EXAMPLE-COMMAND' server1 --ask-pass
Установите Ansible на сервер Ubuntu
В Ubuntu программное обеспечение Ansible невероятно легко установить, благодаря разработчикам программного обеспечения, предоставляющего Personal Package Archive (PPA), в котором есть все необходимые зависимости и готовые пакеты. Чтобы начать установку, войдите в Ubuntu Server и следуйте пошаговым инструкциям ниже, чтобы установить Ansible.
Шаг 1. На сервере Ubuntu у вас может не быть включена поддержка PPA. Причина, по которой поддержка PPA может быть отключена, заключается в том, что Ubuntu Server по умолчанию не включает пакет «software-properties-common», который включает функцию PPA.
Чтобы установить «общие свойства программного обеспечения» на сервер Ubuntu, используйте команду Apt ниже в приглашении оболочки терминала или сеансе SSH.
sudo apt install software-properties-common
Шаг 2. После установки пакета «software-properties-common» на вашем сервере Ubuntu пора добавить в систему официальный Ansible PPA. Используя команду add-apt-repository, добавьте PPA.
sudo apt-add-repository ppa:ansible/ansible
После добавления PPA на сервер Ubuntu вы увидите подсказку на экране. В этом приглашении описывается, что такое PPA, а также некоторая другая информация о программном обеспечении на нем. Нажмите клавишу Enter, чтобы продолжить работу с подсказкой и добавить PPA.
Шаг 3. После того, как PPA добавлен на сервер Ubuntu, пора запустить команду обновления. Это обновит исходные коды программного обеспечения Ubuntu и сделает доступным Ansible PPA.
sudo apt update
Шаг 4. После обновления пришло время установить все ожидающие исправления программного обеспечения, которые могут иметь Ubuntu Server. Для этого используйте команду обновления.
sudo apt upgrade -y
Шаг 5: Теперь, когда ваша система обновлена, пришло время установить Ansible на Ubuntu Server с помощью команды Apt ниже.
sudo apt install ansible ssh-pass
Пользовательский файл инвентаря
Файл инвентаря по умолчанию обычно находится в /etc/ansible/hosts, но вы можете использовать опцию -i для указания пользовательских файлов при запуске команд и плейбуков Ansible. Это удобный способ настройки индивидуального инвентаря для каждого проекта, который можно включить в системы контроля версий, такие как Git:
Такая опция действительна и для ansible-playbook:
Динамический файл инвентаря
Ansible поддерживает сценарии инвентаризации для создания динамических файлов. Это полезно, если ваш инвентарь часто меняется, когда серверы создаются и уничтожаются.
Вы можете найти ряд скриптов с открытым исходным кодом в официальном репозитории Ansible GitHub. После загрузки требуемого сценария на Ansible control machine и настройки необходимых параметров (например, учетных данных API) вы можете запустить исполняемый файл в качестве пользовательского инвентаря с любой командой Ansible, которая поддерживает эту опцию.
Следующая команда использует скрипт инвентаря my_inventory.py с командой ping для проверки подключения ко всем текущим активным серверам:
За более подробной информацией о том, как использовать динамические файлы инвентаризации, пожалуйста, обратитесь к официальной документации Ansible.
Шаг 4 — Запуск ситуативных команд (опционально)
Убедившись, что узел управления Ansible может взаимодействовать с хостами, вы можете запускать на серверах ситуативные команды и плейбуки.
Любая команда, обычно запускаемая на удаленном сервере через SSH, может быть запущена с помощью Ansible на серверах, заданных в файле инвентаризации. Например, вы можете проверить использования дисковых ресурсов всеми серверами с помощью следующей команды:
При желании вы можете заменить выделенную команду любой другой командой.
Также вы можете запускать модули Ansible с помощью ситуативных команд, как мы это делали с модулем при тестировании подключения. Например, мы можем использовать модуль для установки последней версии на все серверы из файла инвентаризации:
Вы можете использовать команды Ansible как для отдельных хостов, так и для групп и подгрупп хостов. Например, вы можете проверить время каждого хоста в группе с помощью следующей команды:
Можно указать несколько хостов, разделив их имена двоеточиями:
Разное
В данном разделе будет рассказано о дополнительных опциях, которые позволяют менять поведение выполнения задач, добавляет функциональности или все то, для чего не найдена отдельная подходящая категория.
1. Шифрование строки.
С помощью ansible-vault мы можем шифровать файлы и папки. Это позволит нам хранить секреты не в открытом виде. Данные расшифровываются в момент выполнения задач.
Данной командой мы получаем шифрованную строку:
ansible-vault encrypt_string
Система запросит ввести дважды пароль и предложит ввести строку, которую нужно зашифровать. После мы должны нажать 2 раза Ctrl + D — мы получим строку, которая начинается с !Vault и различные символы.
Для того, чтобы в момент выполнения задачи ansible расшифровал данные, при запуске плейбука мы должны указать ключ —ask-vault-pass:
ansible-playbook … —ask-vault-pass
Об ansible-vault: https://docs.ansible.com/ansible/latest/user_guide/vault.html.
2. Игнорировать ошибки.
Если ansible столкнется с ошибкой при выполнении задачи, работа плейбука будет завершена. Иногда, нужно пропустить ошибку при выполнении определенной задачи, чтобы выполнение было продолжено. Для этого существует опция ignore.
а) чтобы пропустить ошибки выполнения, в настройка задачи используем:
— name: Bad Task
…
ignore_errors: yes
б чтобы игнорировать ошибки при подключении к хосту:
— name: Bad Task
…
ignore_unreachable: yes
3. Начинать выполнение с определенной задачи.
При выполнении отладки, полезно запустить плейбук, но начать выполнение с определенной задачи. Остальные пропустить.
Это можно сделать с помощью опции —start-at-task:
ansible-playbook … —start-at-task=»Start Job»
* в данном примере плейбук начнет выполнять задания с задачи Start Job.
4. Завершить выполнение плейбука после определенной задачи.
С помощью данной конструкции:
— meta: end_play
5. Зависимые роли.
С помощью файла meta/main.yml в роли мы можем определить пред-роль, от которой зависит выполнение текущей роли. Для этого настраивается опция dependencies:
dependencies:
— role: pred
6. Вставка роли и ее задач.
Позволяет в процессе выполнения задачи подключить роль. Делается при помощи include_role:
— name: «Include Other Role»
include_role:
name: other_role
А это пример, как подключить роль и сделать так, чтобы все ее задачи выполнились на определенном хосте:
— name: «Include Other Role»
include_role:
name: other_role
apply:
delegate_to: «` deploy_vm`.`instance`.`ipv4 `»
7. Повторы при выполнении задачи.
Мы можем управлять цикличностью выполнения задач с помощью retries (количиство повторов), delay (задержка в секундах).
Рассмотрим пример повтора выполнения задачи при возникновении ошибки:
— name: Run anything command
command: /foo/bar/cmd
register: result
retries: 3
delay: 60
until: result is not failed
* в данном примере мы будем выполнять команду /foo/bar/cmd пока ее выполнение не закончится без ошибок. Количество повторов будет равен 3 с интервалом в 60 секунд.
Небольшой пример на странице .
8. Резервное копирование базы данных MySQL/MariaDB.
Работа с базой данных возможно с помощью коллекции mysql.mysql_db. Она не идет в комплекте к ansible и нам необходимо ее установить командой:
ansible-galaxy collection install community.mysql
Резервное копирование можно выполнить так:
— name: Dump mysql databases
community.mysql.mysql_db:
state: dump
name:
— db1
— db2
target: /tmp/dump.sql
* в данном примере мы создадим 2 дампа из баз db1 и db2 и сохраним результат в файл /tmp/dump.sql.
О mysql_db: https://docs.ansible.com/ansible/latest/collections/community/mysql/mysql_db_module.html.
9. Объединение задач в блоки.
Это позволит установить общие свойства и условие для нескольких задач. Такая форма записи уменьшит количиство строк и упростит восприятие.
Синтаксис записи:
— name: Block Name
block:
— name: Task 1
…
— name: Task 2
…
— name: Task 3
…
when: ansible_facts == ‘CentOS’
become: true
become_user: root
ignore_errors: yes
* в данном примере будет выполнены 3 задачи, если выполнится одно условие, которое описывается не для задач, а для блока.
О block: https://docs.ansible.com/ansible/latest/user_guide/playbooks_blocks.html.
10. Перебор массива.
Предположим, нам нужно перебрать все элементы массива в шаблоне. Это можно сделать конструкцией:
{% for host in my_hosts %}
server «` host `»
{% endfor %}
* в данном примере мы сделаем перебор по переменной my_hosts. Для каждого элемента массива будет создана строка со значением server <значение переменной>.
Что дальше?
Используя эти модули, вы можете настраивать целые системы Linux, копируя, создавая шаблоны или изменяя файлы конфигурации, создавая пользователей, устанавливая пакеты, запуская системные службы, обновляя брандмауэр и т. Д.
Если вы новичок в Ansible, обязательно ознакомьтесь с документацией о том, как создавать playbooks, чтобы объединить эти модули для автоматизации вашей системы.
Начиная с Ansible 2.10, модули организованы в коллекции. Большинство модулей в этом списке являются частью коллекции и доступны по умолчанию в Ansible, но некоторые из них являются частью других коллекций. Список коллекций можно найти в документации Ansible .
Часть 2: Настройка хоста Windows
В этом разделе мы собираемся настроить нашу удаленную хост-систему Windows 10 для подключения к узлу Ansible Control. Мы собираемся установить прослушиватель WinRM ( сокращение от Windows Remote), который позволит установить соединение между хост-системой Windows и сервером Ansible.
Но прежде чем мы это сделаем, ваша хост-система Windows должна выполнить несколько требований для успешной установки:
- Ваша хост-система Windows должна быть Windows 7 или новее . Для серверов убедитесь, что вы используете Windows Server 2008 и более поздние версии.
- Убедитесь, что ваша система работает под управлением .NET Framework 4.0 или более поздней версии.
- Windows PowerShell должна быть версии 3.0 или более поздней.
При соблюдении всех требований выполните следующие действия:
Переменные
Во время деплоя, как правило, требуется не только установить какое-либо приложение, но и настроить его в соответствии с определенными параметрами на основании принадлежности к группе серверов или индивидуально (например, ip-адрес BGP-соседа и номер его AS или параметры для базы данных). Как уже было сказано, загромождать файл hosts будет не очень красиво, поэтому разработчики Ansible пошли следующим путём:
- файлы с переменными групп хранятся в директории “group_vars/имя_группы”;
- файлы с переменными хостов в директории “hosts_vars/имя_хоста”;
- файлы с переменными роли (о них речь пойдет ниже) в директории “имя_роли/vars/имя_задачи.yml”;
Помимо пользовательских переменных можно (и даже нужно) использовать факты, собранные ansible перед выполнением сценариев и отдельных задач.
Обновите сервер Ubuntu
Приложение Ansible лучше всего работает на последней версии Ubuntu Server. Прежде чем следовать этому руководству, чтобы узнать, как установить и настроить инструмент Ansible, необходимо обновить Ubuntu Server. В идеале до версии 18.04 LTS или новее.
Обновление Ubuntu Server — сложный процесс по сравнению с Ubuntu Desktop, поскольку нет графического интерфейса для выполнения тяжелой работы. Создавайте резервные копии всех важных данных на внешний диск, в сетевую папку или в облачную службу. Затем следуйте этому руководству, чтобы узнать, как обновить свой сервер Ubuntu.
В качестве альтернативы, если обновление занимает слишком много времени, попробуйте загрузить новая версия Ubuntu Server здесь, и установите его, прежде чем продолжить.
Настройка системы
В данном разделе мы рассмотрим процессы, которые больше подходят для категории настройки системы.
1. Добавить задание в cron.
Выполняется с помощью модуля cron:
— name: Add Job for Run Command
cron:
name: Start Script
job: «/scripts/command.sh»
user: root
minute: «0»
hour: «*/6»
day: «*»
month: «*»
weekday: «*»
* в данном примере мы создадим задание для запуска команды /scripts/command.sh каждый день, каждые 6 часов.
О cron: https://docs.ansible.com/ansible/latest/collections/ansible/builtin/cron_module.html.
2. Добавить публичный ключ хоста в known_hosts.
Делается с помощью known_hosts. Пример из официальной документации:
— name: Tell the host about our servers it might want to ssh to
known_hosts:
path: /etc/ssh/ssh_known_hosts
name: foo.com.invalid
key: «{{ lookup(‘file’, ‘pubkeys/foo.com.invalid’) }}»
* в данном примере мы добавим ключ из файла pubkeys/foo.com.invalid в /etc/ssh/ssh_known_hosts.
О known_hosts: https://docs.ansible.com/ansible/latest/collections/ansible/builtin/known_hosts_module.html.
3. Создание новых SSH-ключей для сервера.
Создание ключей реализуется с помощью модуля openssh_keypair:
— name: Generate New SSH Host Keys
openssh_keypair:
path: «/etc/ssh/ssh_host_` item`.`type `_key»
owner: root
state: present
type: «` item`.`type `»
size: «` item`.`size `»
force: yes
loop:
— { type: dsa, size: 1024 }
— { type: ecdsa, size: 521 }
— { type: ed25519, size: 2048 }
— { type: rsa, size: 2048 }
* в данном примере мы создадим 4 ключа разных типов: dsa, ecdsa, ed25519, rsa. Так как у каждого из них свои требования к размеру, перечень представлен в виде двумерного массива. Ключи будут созданы в каталоге /etc/ssh/.
О openssh_keypair: https://docs.ansible.com/ansible/latest/collections/community/crypto/openssh_keypair_module.html.
4. Работа с SSH authorized_key.
Данный файл содержит публичный ключ для подключения по SSH. Работа с ним через Ansible выполняется с помощью модуля authorized_key.
Пример добавления ключа:
— name: Set authorized key took from file
authorized_key:
user: root
state: present
key: ‘` item `’
with_file:
— files/key.pub
* в данном примере мы берем содержимое файла files/key.pub и устанавливаем его для пользователя root.
Об authorized_key: https://docs.ansible.com/ansible/2.4/authorized_key_module.html.
5. Создание системной учетной записи.
Для этого есть модуль user. У него много опций, но для создания системной учетной записи нам достаточно:
— name: Create User Consul
user:
name: consul
system: yes
comment: «Consul Agent»
* в данном примере будет создана учетная запись consul.
О user: https://docs.ansible.com/ansible/latest/collections/ansible/builtin/user_module.html.
6. Работа с systemd.
Для данной настройки есть одноименный модуль systemd. Рассмотрим варианты его использования.
а) перечитать конфигурацию (необходимо делать каждый раз, когда мы меняем настройки юнита):
— name: systemd reload
systemd:
daemon_reload: yes
б) разрешить сервис (автозапуск):
— name: mysql enable
systemd:
name: mysql
enabled: yes
* для сервиса mysql.
в) перезапустить сервис:
— name: mysql reload
systemd:
name: mysql
state: restarted
* для сервиса mysql.
О systemd: https://docs.ansible.com/ansible/latest/collections/ansible/builtin/systemd_module.html.
7. Настройка брандмауэра.
Выполняется разными модулями в зависимости от используемой системы управления netfilter:
- firewalld
- iptables
- ufw
Рассмотрим небольшие примеры.
а) firewalld:
— name: permit traffic in default zone for https service
firewalld:
service: https
permanent: yes
state: enabled
Подробнее: https://docs.ansible.com/ansible/latest/collections/ansible/posix/firewalld_module.html.
б) iptables:
— name: Block specific IP
iptables:
chain: INPUT
source: 8.8.8.8
jump: DROP
Подробнее: https://docs.ansible.com/ansible/latest/collections/ansible/builtin/iptables_module.html.
в) UFW.
Добавить 80 порт:
— name: Allow all access to tcp port 80
ufw:
rule: allow
port: ’80’
proto: tcp
Добавить порты с циклом:
— name: Allow Ports in Firewall
ufw:
rule: allow
port: «` item`.`port `»
proto: «` item`.`proto `»
comment: «` item`.`comment `»
loop:
— { port: 5432, proto: tcp, comment: ‘PostgreSQL’ }
Подробнее: https://docs.ansible.com/ansible/latest/collections/community/general/ufw_module.html.
Заключение
В этом обучающем модуле вы выполнили установку Ansible и создали файл инвентаризации для выполнения ситуативных команд с узла управления Ansible.
После подтверждения возможности подключения и управления инфраструктурой с центрального узла управления Ansible вы можете запускать на этих хостах любые команды или плейбуки. При работе с новыми серверами полезно использовать плейбук сообщества «Начальная настройка сервера». Узнать, как писать собственные плейбуки, можно в нашем руководстве Configuration Management 101: Writing Ansible Playbooks.
Дополнительную информацию по использованию Ansible можно найти в «Руководстве с полезными советами по Ansible».
Заключение
Автоматизация начальной настройки сервера может сэкономить ваше время, а также обеспечить все ваши серверы стандартной конфигурацией, которую можно улучшить и настроить в соответствии с потребностями. Из-за распределенного характера современных приложений и необходимости в высокой согласованности различных промежуточных сред автоматизация базовых этапов настройки становится все важнее.
В этом мануале мы продемонстрировали, как использовать Ansible для автоматизации основных задач, которые должны выполняться на новом сервере: это создание пользователя с доступом sudo, включение брандмауэра UFW и отключение удаленного входа в систему для root.
Если вы хотите добавить в плейбук новые задачи для дальнейшей настройки базовой среды сервера, пожалуйста, обратитесь к руководству Создание плейбука Ansible.
AnsibleUbuntuUbuntu 18.04
Заключение
В этом мануале рассматриваются наиболее распространенные команды Ansible, которые вы можете использовать при подготовке серверов. Также вы узнали, как удаленно выполнять команды на ваших нодах, как запускать плейбуки и использовать различные пользовательские настройки.
Существует еще много вариантов команд и флагов, которые могут пригодиться вам в работе с Ansible. Чтобы получить обзор всех доступных опций, вы можете использовать команду help:
Если вы хотите получить более полное представление об Ansible и всех его доступных командах и функциях, обратитесь к официальной документации Ansible.