Задача: Рассмотреть снова работу ansible, но ориентироваться на мою текущую рабочую систему Ubuntu Trusty Server

Ведь ранее я как-то тестировал, что есть сервис Ansible, но это было на Ubuntu Precise. Да, работа с ним мне понравилась, но видимо я тогда не совсем понимал для чего мне этот инструмент, а вот сейчас у меня как раз надобность в использовании инструмента в задачу которого будет управление всеми другими узлами через единый центр. В задачи центра входит составление playbookов, команд. Вот к примеру составить простенький playbook через который система будет самостоятельно настраиваться до того факта как я буду на нем обкатывать свои задумки. А то делать все каждый раз уже как-то утомительно. Можно конечно настроить раз и создать слепок и начинать с него, но нет это нудно причем сделать это нужно как для домашней системы так и для рабочей, а playbook будет универсальным.

По большей части мои эксперименты включают Ubuntu системы, а особенность использовать Ansible — это то что на подконтрольные узлы не нужно устанавливать ни какие агенты, вся работа строится вокруг сервиса SSH что для Ubuntu систем является дефолтным.

Дальнейшие действия проворачиваются на Ubuntu Trusty Desktop которая является рабочей и управляющей:

aollo@work:~$ sudo rm -Rf /var/lib/apt/lists

aollo@work:~$ sudo apt-get update && sudo apt-get upgrade -y

Пояснение по работе Ansible: через файл hosts происходит инвентаризация удаленный узлов с которыми предстоит работа, а при использовании playbook (файла с расширением YAML) все также опираясь на файл инвентаризации, но описывается список действий, к примеру: установить, обновить, переместить и т.д.

aollo@work:~$ sudo apt-get install software-properties-common python-software-properties -y

aollo@work:~$ sudo dpkg-reconfigure python-software-properties

Текущая версия приложения Ansible в дефолтных репозитариях Ubuntu Trusty Desktop:

aollo@work:~$ apt-cache show ansible | grep Version

Version: 1.7.2+dfsg-1~ubuntu14.04.1

Version: 1.5.4+dfsg-1

Но использовать будут самую последнюю доступную в подключаемых репозитариях:

aollo@work:~$ sudo apt-add-repository ppa:ansible/ansible

aollo@work:~$ sudo apt-get update && sudo apt-get install ansible sshpass -y

aollo@work:~$ sudo ansible --version | head -n 1

ansible 2.4.2.0

Как видно пусть я и буду использовать подключаемый репозитарий с PPA, но версия пакета Ansible будет более новой чем та которая может быть установлена по умолчанию.

Создаю дефолтную копию инвентаризованного файла hosts:

aollo@work:~$ sudo mv /etc/ansible/hosts /etc/ansible/hosts.default

Группы хостов объединяются в файле hosts – общее имя ихнего функционала в квадратные скобки, к примеру:

[db]

IP&DNS

IP&DNS:PORT

В файле «Host inventory» содержится информация о обслуживаемых нодах ( где собственно все команды будут исполнены). Конфигурационный файл с Ansible может быть использован для настройки переменного окружения.

В ansible, используются playbooks — это набор инструкций и они состоят из задач. Плейбуки описываются с помощью функциональности модуля ядра самого Ansible ( так же, могут использовать сторонние модули). Playbooks — последовательность или набор команд в которых так же, может использоваться различные проверки: если условие не выполняется, то определенные команды могут пропускаться. Данные playbook, описываются в формате YAML.

На заметку: для большего удобства центральная часть (управляющая) должна иметь возможность подключения к узлам через SSH посредством публичных ключей, а настраивается эта возможность через ssh-copy-id где нужно с управляющей передать данный публичный хост на управляемый. Или же предопределить логин и пароль на подключение к узлам если нужды в публичных ключах нет. Так же на управляемых хостах должен быть установлен пакет OpenSSH-сервер.

aollo@work:~$ ssh-keygen -t dsa

aollo@work:~$ ssh -o 'StrictHostKeyChecking no' 'ekzorchik@10.7.9.130'

где node1 — это хост с IP адресом 10.9.9.130

aollo@work:~$ sudo nano /etc/ansible/hosts

[host]

10.9.9.130 ansible_ssh_user=ekzorchik ansible_ssh_pass=712mbddr@ ansible_ssh_port=22

10.9.9.189 ansible_ssh_user=ekzorchik ansible_ssh_pass=712mbddr@ ansible_ssh_port=22

#or

#10.9.9.130:22

aollo@work:~$ sudo ansible host -m shell -a 'uname -a'

10.9.9.130 | FAILED | rc=-1 >>

Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host.

Или можно указать конкретный хост, а не применять запрос ко всей группе хостов обозначенных в квадратных скобках:

aollo@work:~$ sudo ansible 10.9.9.130 -m shell -a 'uname -a'

За проверку ключей при подключении через SSH отвечает параметр host_key_checking если присвоить значение False проверка будет
отключена:

aollo@work:~$ sudo nano /etc/ansible/ansible.cfg

host_key_checking = False

Пробую еще раз и все получилось:

aollo@work:~$ sudo ansible host -m shell -a 'uname -a'

10.9.9.130 | SUCCESS | rc=0 >>

Linux srv-trusty 4.4.0-98-generic #121~14.04.1-Ubuntu SMP Wed Oct 11 11:54:55 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

Примеры:

aollo@work:~$ sudo ansible host -m ping

10.9.9.130 | SUCCESS => {

"changed": false,

"ping": "pong"

}

aollo@work:~$ sudo ansible host -a "ls -lah"

10.9.9.130 | SUCCESS | rc=0 >>

total 36K

drwxr-xr-x 5 ekzorchik ekzorchik 4.0K Dec 22 17:05 .

drwxr-xr-x 3 root root 4.0K Dec 22 16:52 ..

drwx------ 3 ekzorchik ekzorchik 4.0K Dec 22 17:05 .ansible

-rw------- 1 ekzorchik ekzorchik 24 Dec 22 16:56 .bash_history

-rw-r--r-- 1 ekzorchik ekzorchik 220 Dec 22 16:52 .bash_logout

-rw-r--r-- 1 ekzorchik ekzorchik 3.6K Dec 22 16:52 .bashrc

drwx------ 2 ekzorchik ekzorchik 4.0K Dec 22 16:53 .cache

-rw-r--r-- 1 ekzorchik ekzorchik 675 Dec 22 16:52 .profile

drwx------ 2 ekzorchik ekzorchik 4.0K Dec 22 16:55 .ssh

aollo@work:~$ sudo ansible host -m shell -a 'uptime'

10.9.9.130 | SUCCESS | rc=0 >>

17:55:29 up 1:01, 2 users, load average: 0.00, 0.00, 0.00

Если Ваш собственный файл с хостами находится в другом месте то чтобы выполнить по нему действия следует задействовать ключ «-i»:

ansible -i ~/hosts -m ping all

где ключ

  • -m → использовать модуль
  • -a ‘uptime’ → передать параметр к задействованному модулю

Чтобы установить пакет на удаленную систему:

aollo@work:~$ sudo ansible host -m shell -a 'apt-get install htop -y -qq'

[WARNING]: Consider using apt module rather than running apt-get

10.9.9.130 | FAILED | rc=100 >>

E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)

E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?non-zero return code

В целях отладки советую использовать ключ «-v» или несколько «-vvv» дабы получить больше диагностической информации чтобы понять что не так:

aollo@work:~$ sudo ansible host -m shell -a 'apt-get install htop -y -qq' -v

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

[WARNING]: Consider using apt module rather than running apt-get

(дословный перевод: Рассмотрите возможность использования apt-модуля вместо запуска apt-get)

10.9.9.130 | FAILED | rc=100 >>

E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)

E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?non-zero return code

Так нужно разрешить использование повышение привилегий:

#[all:vars]

#ansible_sudo_pass=712mbddr@

#or

[host]

10.9.9.130 ansible_ssh_user=ekzorchik ansible_ssh_pass=712mbddr@ ansible_ssh_port=22 ansible_sudo_pass=712mbddr@

Но этого мало, у меня ведь в выводе предупреждение, что отсутствует модуль для работы с установщиком приложений apt-get.

aollo@work:~$ sudo apt-get install python-apt python3-apt aptitude -y

aollo@work:~$ sudo ansible host -m apt -a 'upload_cache=yes'

10.9.9.130 | FAILED! => {

"changed": false,

"msg": "Unsupported parameters for (apt) module: upload_cache Supported parameters include: allow_unauthenticated,autoclean,autoremove,cache_valid_time,deb,default_release,dpkg_options,force,force_apt_get,install_recommends,only_upgrade,package,purge,state,update_cache,upgrade"

Вот как нужно устанавливать пакеты:

aollo@work:~$ sudo ansible host --sudo -m raw -a "apt-get install htop -qq" -v

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

[DEPRECATION WARNING]: The sudo command line option has been deprecated in favor of the "become" command line arguments. This feature will be removed in

version 2.6. Deprecation warnings can be disabled by setting

deprecation_warnings=False in ansible.cfg.

10.9.9.130 | SUCCESS | rc=0 >>

Shared connection to 10.9.9.130 closed.

Дабы на консоль не вываливались предупреждения добавлю в конфигурационный файл ansible.conf следующую строку:

aollo@work:~$ sudo nano /etc/ansible/ansible.cfg

#deprecation_warnings = True

deprecation_warnings=False

-m raw -a "apt-get install htop -qq" → ознает, что используется модуль raw. Посредством него отправляются команды в SSH сессии, но при этом не загружается на хост модуль Python. Т.е. этот модуль просто отправляет указанную команду как строку и все. Применим к любой системе которую поддерживает Ansible.

Чтобы выключить удаленные системы(систему):

aollo@work:~$ sudo ansible host --sudo -m raw -a "poweroff"

Список всех модулей см. на официальном сайте.

Удаляю установленный пакет:

aollo@work:~$ sudo ansible host --sudo -m raw -a "apt-get remove htop -qq" -v

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

10.9.9.130 | SUCCESS | rc=0 >>

(Reading database ... 58876 files and directories currently installed.)

Removing htop (1.0.2-3) ...

Processing triggers for man-db (2.6.7.1-1ubuntu1) ...

Processing triggers for mime-support (3.54ubuntu1.1) ...

Shared connection to 10.9.9.130 closed.

Обновить репозитарии удаленной системы:

aollo@work:~$ sudo ansible host --sudo -m apt -a 'update_cache=yes'

10.9.9.130 | SUCCESS => {

"cache_update_time": 1513954664,

"cache_updated": true,

"changed": true

}

ключи модуля apt описаны на официальном сайте.

Обновить репозитарии и установить все самые последние версии установленных программ:

aollo@work:~$ sudo ansible host --sudo -m apt -a 'update_cache=yes upgrade=yes' -v → понять что команда отработала это взглянуть на вывод, он должен быть «зеленым» – значит все успешно, если «оранжевый» – значит где-то ошибка.

Чтобы установить пакет через модуль apt:

aollo@work:~$ sudo ansible host --sudo -m apt -a 'name=htop install_recommends=yes state=latest'

Чтобы удалить установленный пакет через модуль apt:

aollo@work:~$ sudo ansible host --sudo -m apt -a 'name=htop purge=yes state=absent'

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

aollo@work:~$ sudo apt-get install -y whois

aollo@work:~$ mkpasswd --method=sha-512

Пароль: 123

$6$tUi6FsMRWcI$vmvjormQulOb0dYwkxxchFQRlnYr0KA.JcZURbO2rfJpwBBVLpQQpjmhLi0Q74Aj5Q418PTSrdpb2luhoYvNO1

aollo@work:~$ sudo ansible host --sudo -m user -a "name=keiz update_password=always password=$6$4a3pTQTxSFPj$XGKaA6YOoc8iUyh13FwEYa6jlPknkf.MKk7jYJZ2iINtAqtD2vvT8mq..iU9Hc8X50LuIXeNR.UU37b.l0cFM. groups=adm,sudo shell=/bin/bash createhome=yes system=yes"

Но хоть команда и отрабатывает, авторизоваться под учетной записью kez с паролем 123 не выходит.

Просмотр файла shadow показал, что хеш переданный с командой (предполагается генерить 512-битный md5) отличается от хеша в файле shadow на удаленной машине, а именно отсутствует первые $6$4a Все равно нет соответствия переданного хеша и содержимого /etc/shadow на ноде.

Как же быть, получается модуль не работает, но думаю можно выйти из ситуации через модуль raw:

aollo@work:~$ openssl passwd -crypt Aa1234567

Warning: truncating password to 8 characters

xKHlEUwL9xDV6

aollo@work:~$ sudo ansible host --sudo -m raw -a "useradd -m -p xKHlEUwL9xDV6 -s /bin/bash -G adm,sudo keiz"

Проверяю, а смогу ли я авторизоваться под учетной записью keiz на удаленной ноде:

aollo@work:~$ ssh -l keiz 10.9.9.130

keiz@10.9.9.130's password: Aa1234567

keiz@srv-trusty:~$

отлично модуль raw успешно отработал.

Чтобы удалить пользователя:

aollo@work:~$ sudo ansible host --sudo -m user -a "name=keiz remove=yes state=absent"

На заметку: заметить что порой переданная строка с консоли ни с первого раза отрабатывает, значит нужно увеличить таймаут:

aollo@work:~$ sudo nano /etc/ansible/ansible.cfg

timeout = 20

Вроде как понятно, главное поставить себе задачу и оперируя выводом на консоль и поисковой системой Google решить можно все.

На этом я пока прощаюсь, с уважением автор блога Олло Александр aka ekzorchik.

От ekzorchik

Всем хорошего дня, меня зовут Александр. Я под ником - ekzorchik, являюсь автором всех написанных, разобранных заметок. Большинство вещей с которыми мне приходиться разбираться, как на работе, так и дома выложены на моем блоге в виде пошаговых инструкции. По сути блог - это шпаргалка онлайн. Каждая новая работа где мне случалось работать вносила новые знания и нюансы работы и соответственно я расписываю как сделать/решить ту или иную задачу. Это очень помогает. Когда сам разбираешь задачу, стараешься ее приподнести в виде структурированной заметки чтобы было все наглядно и просто, то процесс усвоения идет в гору. Также прошу на https://win.ekzorchik.ru https://lin.ekzorchik.ru https://net.ekzorchik.ru https://voip.ekzorchik.ru https;//home.ekzorchik.ru