Краткое описание: В данном руководстве рассматривается установка пакета Ansible на CentOS7, а также базовая настройка playbook-ов.
Поддержи автора статьи, просмотри рекламу ↓↓↓
Знакомство с Ansible началось с плавной подводки текущих тех. заданий, когда на новый сервер Ubuntu или CentOS нужно поставить набор пакетов типа LAMP\LEMP для запуска некого web сервиса. Типичная тривиальная задача по установке пакетов была расширена до одновременной инсталляции на 10 серверах. Результатом поиска инструмента стал Ansible. Сценарий работы пакета довольно таки прост: со стороны ansible-сервера описывается установка\настройка\любые другие команды на языке YAML и по SSH исполняется на ansible-клиента через программный код. Схематически это очень сильно напоминает «Групповые политики» в Windows.
Установка Ansible
yum install ansible
Поддержи автора статьи, просмотри рекламу ↓↓↓
Настройка Ansible
Ниже будет приведен пример с возвратами ошибок, после исполнения команд. Этот режим позволил найти некоторые недочеты в описании конфигураций.
nano /etc/ansible/hosts
файл имеет вид
нужно добавить группу и её членов
[server] 192.168.1.60
проверить выполнение команды ansible можно способом
ansible -m ping all
Поддержи автора статьи, просмотри рекламу ↓↓↓
текущий вывод не возвращает ошибок, но содержит информации о том, что доверительные отношения между ansible-сервером и ansible-клиентом ещё не установлены. Этот пункт нужно выполнить на опережение, чтобы в лишний раз не вводить Y, YES или видеть ошибку в SSH соединении
ssh-keygen -t rsa
параметры ключа не изменялись, т.е. во всех трех предложениях был введен «Enter».
Сгенерированный ключ нужно скопировать на ansible-клиент для того, чтобы при установки SSH соединение не требовалось вводить пароль. Ещё один способ — утилита sshpass, но по критериям безопасности этот способ был исключён.
ssh-copy-id [email protected]
результат
проверить работу ключа можно командой
ssh [email protected]
По выполнению которой терминал должен переключиться на ansible-клиент без запроса пароля, установки ключей, сертификатов. Если возвращаются какие-либо запросы, то скорей всего есть несоответствие между ключом ansible-сервера и конечным каталогом при копировании на ansible-клиенте(зависит от пользователя, режима sudo и тд.)
Возвращаясь к выполнению команды Ansible
ansible -m ping all
в результате ошибка, в которой указано что доступ запрещен. Если проверка беспарольного доступа «ssh [email protected]» не возвращает дополнительных запросов, значит проблема в пользователе ansible-сервера и ansible-клиента. А ведь и правда, на ansible-сервере стоит CentOS7.5 и команды выполняются под пользователем root, а ansible-клиенте стоит Ubuntu и команды выполняются под пользователем adminX.
nano /etc/ansible/hosts
Поддержи автора статьи, просмотри рекламу ↓↓↓
добавить пользователя, от чего имени будет выполняться команда ping
[server] 192.168.1.60 ansible_user=adminX
повторное выполнение
ansible -m ping all
В некоторых случаях может быть возврат сообщения
который указывает на то, что на сервере отсутствует пакет python 2-ой версии. Для исправления нужно выполнить на конечном хосте:
sudo bash -c "test -e /usr/bin/python || (apt -qqy update && apt install -qy python-minimal)"
Результатом проделанных операций есть установленный Ansible, который выполняет команды на конечном сервере-клиенте через беспарольный SSH.
Создание и исполнение playbook-ов
mkdir /etc/ansible/playbooks nano /etc/ansible/playbooks/mc.yml --- - hosts: server tasks: - name: Install package mc apt: pkg=mc
Поддержи автора статьи, просмотри рекламу ↓↓↓
выполнение команды
ansible-playbook /etc/ansible/playbooks/mc.yml
приводит к результату
и снова возврат ошибки с доступом. Всё из-за того, что установка пакета MC на ansible-клиенте нужно выполнять в привилегированном режиме sudo с вводом пароля
ansible-playbook /etc/ansible/playbooks/mc.yml --ask-become-pass
Тестовая установка приложения окончена.
Playbook установка Nginx, PHP, MySQL и Redis
Задание такое: описать конфигурацию playbook-а на Ansible по установке пакетов на сервера CentOS:
- обновление ОС;
- php7 с модулями (bcmach, imagik, pdo, amqp);
- phpmyadmin;
- nginx;
- mysql;
- redis;
- mc.
Поддержи автора статьи, просмотри рекламу ↓↓↓
В исходной позиции подготовлены три сервера на CentOS 7.5 в виде виртуальных машин.
adminX@s-vmm-2:~$ virsh list --all Id Name State ---------------------------------------------------- 14 S-COS-03 running 15 S-COS-02 running 16 S-COS-01 running
Добавление новых серверов в окружение Ansible(основные принципы описаны в начале статьи)
nano /etc/ansible/hosts
[COS-LEMP] 192.168.1.[60:62]
копирование ssh ключа для беспарольного доступа
ssh-copy-id [email protected] ssh-copy-id [email protected] ssh-copy-id [email protected]
проверка доступности узлов через Ansible
ansible -m ping all
Поддержи автора статьи, просмотри рекламу ↓↓↓
создание playbook-а для обновление CentOS с последующей перезагрузкой
nano /etc/ansible/playbooks/cos-lemp-update.yml
--- - hosts: COS-LEMP tasks: - name: Update OS yum: name="*" state=latest - name: restart system to reboot to newest kernel shell: "sleep 5 && reboot" async: 1 poll: 0 - name: wait for 10 seconds pause: seconds: 10 - name: wait for the system to reboot wait_for_connection: connect_timeout: 60 sleep: 5 delay: 5 timeout: 120 - name: install epel-release yum: name=epel-release state=latest
вывод
nano /etc/ansible/playbooks/cos-lemp.yml
--- - hosts: COS-LEMP tasks: - name: Install PHP+Nginx+MC yum: name={{ item }} state=present with_items: - 'php' - 'php-bcmath' - 'ImageMagick' - 'php-pdo' - 'php-amqp' - 'php-mysql' - 'phpmyadmin' - 'nginx' - 'redis' - 'mc' - name: Add mysql repo yum: name=http://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm state=present - name: Install MySQL yum: name="mysql-community-server" - name: start services service: name={{ item }} state=started enabled=yes with_items: - 'nginx' - 'mysqld' - 'redis'
Поддержи автора статьи, просмотри рекламу ↓↓↓
Установка пакетов производилась только на двух серверах, чтобы иметь «чистую» копию в резерве. Однако с такой конфигурацией количество серверов не имеет значения, вывод
Playbook копирование SSL, перезапуск Apache
Обновление файла hosts
nano /etc/ansible/hosts
[SSL-UPDATE] host-01 ansible_user=adminX host-02 ansible_user=adminX host-03 ansible_user=adminX
в этом блоке явно указывается имя пользователя, от имени которого будут выполняться действия на конечном хосте. Если пользователи совпадают(на ansible-сервер и ansible-клиенте), то это действие можно опустить.
Создание Playbook-а:
nano /etc/ansible/playbooks/ssl-update.yml --- - hosts: SSL-UPDATE become: yes tasks: - name: COPY SSL FILES-1 copy: src: /etc/nginx/ssl/vist.od.ua/certificate.crt dest: /etc/apache2/ssl/certificate.crt - name: COPE SSL FILES-2 copy: src: /etc/nginx/ssl/vist.od.ua/private.key dest: /etc/apache2/ssl/private.key - name: APACHE2 RESTART service: name: apache2 state: restarted
Стоит отметить возможность группировки хостов, цикличного перечисления и прочих фишек, которые минимизируют код и дадут возможность легко его редактировать.