Краткое описание: В данном руководстве рассматривается установка пакета Ansible на CentOS7, а также базовая настройка playbook-ов.

Понравилась статья, отблагодари автора, посмотри рекламу. СпасибоПоддержи автора статьи, просмотри рекламу ↓↓↓

Нужна консультация или помощь в решении IT вопроса?

Знакомство с Ansible началось с плавной подводки текущих тех. заданий, когда на новый сервер Ubuntu или CentOS нужно поставить набор пакетов типа LAMP\LEMP для запуска некого web сервиса. Типичная тривиальная задача по установке пакетов была расширена до одновременной инсталляции на 10 серверах. Результатом поиска инструмента стал Ansible. Сценарий работы пакета довольно таки прост: со стороны ansible-сервера описывается установка\настройка\любые другие команды на языке YAML и по SSH исполняется на ansible-клиента через программный код. Схематически это очень сильно напоминает «Групповые политики» в Windows.

Установка Ansible

yum install ansible

Понравилась статья, отблагодари автора, посмотри рекламу. СпасибоПоддержи автора статьи, просмотри рекламу ↓↓↓

Очень просто, да?

Настройка Ansible

Ниже будет приведен пример с возвратами ошибок, после исполнения команд. Этот режим позволил найти некоторые недочеты в описании конфигураций.

nano /etc/ansible/hosts

файл имеет вид

Настройка Ansible Centos, файл hosts

нужно добавить группу и её членов

[server]
192.168.1.60

проверить выполнение команды ansible можно способом

ansible -m ping all

Настройка Ansible Centos, попытка ping hosts

Понравилась статья, отблагодари автора, посмотри рекламу. СпасибоПоддержи автора статьи, просмотри рекламу ↓↓↓

текущий вывод не возвращает ошибок, но содержит информации о том, что доверительные отношения между ansible-сервером и ansible-клиентом ещё не установлены. Этот пункт нужно выполнить на опережение, чтобы в лишний раз не вводить Y, YES или видеть ошибку в SSH соединении

ssh-keygen -t rsa

Настройка Ansible Centos, генерация ssh ключа

параметры ключа не изменялись, т.е. во всех трех предложениях был введен «Enter».

Сгенерированный ключ нужно скопировать на ansible-клиент для того, чтобы при установки SSH соединение не требовалось вводить пароль. Ещё один способ — утилита sshpass, но по критериям безопасности этот способ был исключён.

ssh-copy-id [email protected]

результат

Настройка Ansible Centos, копирование ключа RSA для SSH

проверить работу ключа можно командой

ssh [email protected]

По выполнению которой терминал должен переключиться на ansible-клиент без запроса пароля, установки ключей, сертификатов. Если возвращаются какие-либо запросы, то скорей всего есть несоответствие между ключом ansible-сервера и конечным каталогом при копировании на ansible-клиенте(зависит от пользователя, режима sudo и тд.)

Возвращаясь к выполнению команды Ansible

ansible -m ping all

Настройка Ansible Centos, ping hosts ошибка

в результате ошибка, в которой указано что доступ запрещен. Если проверка беспарольного доступа «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

Настройка Ansible Centos, ping hosts

В некоторых случаях может быть возврат сообщенияAnsible ping отсутствует python

 

который указывает на то, что на сервере отсутствует пакет 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

приводит к результату

Настройка Ansible Centos, ошибка при запуске playbook-a

и снова возврат ошибки с доступом. Всё из-за того, что установка пакета MC на ansible-клиенте нужно выполнять в привилегированном режиме sudo с вводом пароля

ansible-playbook /etc/ansible/playbooks/mc.yml --ask-become-pass

Настройка Ansible Centos, запуск playbook-a

Тестовая установка приложения окончена.

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

Настройка Ansible Centos, LEMP ping проверка

Понравилась статья, отблагодари автора, посмотри рекламу. СпасибоПоддержи автора статьи, просмотри рекламу ↓↓↓

создание 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

вывод

Настройка Ansible Centos, playbook yum update

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'

Понравилась статья, отблагодари автора, посмотри рекламу. СпасибоПоддержи автора статьи, просмотри рекламу ↓↓↓

Установка пакетов производилась только на двух серверах, чтобы иметь «чистую» копию в резерве. Однако с такой конфигурацией количество серверов не имеет значения, вывод

Настройка Ansible Centos, playbook установка Nginx, PHP, mysql, 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

Ansible playbook: копирование SSL по сети, перезапуск Apache
Стоит отметить возможность группировки хостов, цикличного перечисления и прочих фишек, которые минимизируют код и дадут возможность легко его редактировать.

Понравилась статья, отблагодари автора, посмотри рекламу. СпасибоПоддержи автора статьи, просмотри рекламу ↓↓↓

Если у вас есть профессиональный интерес в расширении данной статьи — заполните форму запроса.