Использование Ansible на Centos 7

Ansible Centos 7 — такая комбинация часто используется для распределенных систем. Ansible ставится на машину, которая будет являться мастером. С нодами мастер работает подключаясь к ним по SSH.

На клиентах, таким образом, нужен только системный пользователь и публичный ключ SSH, сгенерированный на мастере.

 

Ansible Centos 7. Начало работы

Пакет устанавливается из репозитория epel. Прежде всего, убедимся в том, что репозиторий подключен

yum repolist | grep epel

* epel: mirror.yandex.ru
epel/x86_64 Extra Packages for Enterprise Linux 7 — x86_64 12746

 

Список пакетов можно просмотреть выполнив rpm -qa, из него выборка делается grep

rpm -qa | grep ansible

Если пакета нет вывод будет пуст.

 

Установим ansible

yum install ansible

Complete!

 

Добавляем системного  пользователя

useradd -d /home/admin -m ansadmin-s /bin/bash

 

Для него нужно задать достаточно сложный пароль

passwd ansadmin

 

Чтобы срок действия пароля был бесконечным можно сделать так

passwd -x 1 ansadmin

Adjusting aging data for user ansadmin.
passwd: Success

 

su — ansadmin

[ansadmin@master ~]$

 

ssh-keygen

Your identification has been saved in /home/admin/.ssh/id_rsa.
Your public key has been saved in /home/admin/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:S4KSP0a4dyEYFbo+8AiHno0E6d7iALD1jzDg5G+7zjI

 

 

На двух других машинах, которые будут нодами добавляет таким же образом пользователя ansadmin и задаем ему пароль.

 

Далее с Ansible мастера требуется скопировать содержимое ~/.ssh/id_rsa.pub и добавить его в /root/.ssh/authorized_keys на каждом сервере.

 

В /etc/ansible/hosts добавляем два блока, с перечисленными в каждом машинами

 

mcedit /etc/ansible/hosts

[app]
123.123.123.123

[db]
123.123.123.124

 

После этого можно проверить появилась ли связь.

ansible app -m shell -a 'hostname'

123.123.123.123 | CHANGED | rc=0 >>
test1

 

 

hosts и алиасы для Ansible

С именами работать проще, чем с IP адресами (особенно когда машин много), поэтому внесем коррективы в файл hosts.

 

Системный файл hosts редактируется с реквизитами суперпользователя

sudo mcedit /etc/hosts

123.123.123.123 node1
123.123.123.124 node2

 

Подключаться теперь можно так:

[ansadmin@master ~]$ ssh ansadmin@node1

 

Та же команда, что и ранее сейчас будет возвращать уже не адреса, а алиасы:

 

[ansadmin@vm-0edd2e51 ~]$ ansible app -m shell -a 'hostname'

node1 | CHANGED | rc=0 >>
test1

 

Первым аргументом можно указывать группу серверов, задаваемую в hosts пакета или all для всех машин.

 

[ansadmin@master ~]$ ansible all -m shell -a 'hostname'

node1 | CHANGED | rc=0 >>
test1

node2 | CHANGED | rc=0 >>
test2

 

 

 

Конфигурация ansible

Основной конфигурационный файл пакета — /etc/ansible/ansible.cfg

 

В примере выше приводилась команда, которая отправляется на ноды с использованем модуля shell

Модулей множество, просмотреть список с кратким описанием можно так

ansible-doc -l | less

 

Ключ -s выведет информацию по тем командам, которые могут выполняться с использованием конкретного модуля

[ansadmin@master ~]$ ansible-doc -s shell

- name: Execute commands in nodes.
shell:
chdir: # cd into this directory before running the command
creates: # ...
executable: # ...
free_form: # ...

[...skipped...]

Эти аргументы не для всех модулей обязательны, но широко используются.

 

Самым простым модулем является ping

Ниже в команду добавлен ключ -o, благодаря которому вывод по каждой ноде происходит в одну строку.

[ansadmin@master ~]$ ansible all -m ping -o

node2 | SUCCESS => {«changed»: false, «ping»: «pong»}
node1 | SUCCESS => {«changed»: false, «ping»: «pong»}

 

 

shell практически используется очень часто. В частности для сбора информации о системе.

С ключем -v (verbose) в выводе дополнительно будет информация об используемом конфигурационном файле

ansible all -m shell -a 'uname -a; df -h' -v

Using /etc/ansible/ansible.cfg as config file

[…skipped…]

 

Выполнение команд на клиентах от имени суперпользователя

Чтобы устанавливать на нодах какие-то системные пакеты требуется добавить пользователя ansadmin в группу sudo

На обоих серверах редактируем /etc/sudoers

sudo  visudo -f /etc/sudoers

#ANSIBLE ADMIN user
ansadmin ALL=NOPASSWD: ALL

 

Строки добавляются в конец файла.

 

Добавив ключ -s (суперпользователь) установим на машине, входящей в группу app веб-сервер httpd

ansible app -m yum -a 'name=httpd state=present' -s

 

Зайдя на сервере можно убедиться в том, что пакет появился

[root@test1 ~]# rpm -qa | grep httpd

httpd-tools-2.4.6-80.el7.centos.1.x86_64
httpd-2.4.6-80.el7.centos.1.x86_64

 

При этом себ-сервер не запущен

[root@test1 ~]# service httpd status

Redirecting to /bin/systemctl status httpd.service
● httpd.service — The Apache HTTP Server
[…skipped…]

 

Запустим его с master хоста

ansible app -m service -a 'name=httpd state=started' -s

 

Веб-сервер запустился и работает

[root@test1 ~]# service httpd status | grep active

Redirecting to /bin/systemctl status httpd.service
Active: active (running) since Wed 2018-11-07 18:06:18 UTC; 27s ago

 

Для копирования конфигурационных файлов можно использовать модуль copy

echo «test» > /tmp/test.txt

 

ansible all -m copy -a 'src=/tmp/test.txt dest=/tmp/newone.txt' -s

На обе ноды после выполнения команды был скопирован файл /tmp/test.txt, размещенный на мастер-хосте.