Установка Ansible на Centos 7


Рассмотрим как выполняется установка Ansible на Centos 7 и разберем основы работы с Ansible.

Ansible ставится на машину, которая будет являться мастером, с неё будут отправляться команды. Их пакет будет выполнять подключаясь к нодам по ssh (про ssh авторизацию по ключу).



Ansible на Centos 7


На клиентах, таким образом, нужен только системный пользователь и публичный ключ 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 на каждом сервере.



Возвращаемся к пользователю root и в /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, размещенный на мастер-хосте.

Читайте также про использование playbook в Ansible

Сказать спасибо