Syntax highlighting of
8252cb3 ~( devops/ansible)
# Ansible
[TOC]
## Refs
[Ansible](https://www.ansible.com)
[Documentation](https://docs.ansible.com)
[Index of all Modules](https://docs.ansible.com/ansible/latest/collections/index_module.html)
[Полное руководство Ansible](http://onreader.mdl.ru/MasteringAnsible2nd/content/index.html)
[Ansible Galaxy](https://galaxy.ansible.com/)
[Проверка синтаксиса playbook](https://docs.ansible.com/ansible-lint/)
## Установка
[source](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html#latest-releases-via-apt-ubuntu)
### Бинарник (v2.x)
```bash
sudo apt-get update
sudo apt-get install software-properties-common
sudo apt-add-repository --yes --update ppa:ansible/ansible
sudo apt-get install ansible
ansible --version
```
### Pip-пакет
```bash
sudo python3 -m pip install ansible
# --- консоль необходимо перезапустить
ansible --version
```
## Ad Hoc
```bash
#
# --- modules
#
# --- ping
# пигуем все серверы
ansible all -m ping
# пингуем один сервер
ansible ds4ci -m ping
# пингуем один сервер из заданного инвентаря с выводом отладочной информации
ansible ds4ci -i /path/to/hosts -m ping -vvvv
# --- setup
# получение "фактов" о хосте (значительный вывод)
ansible ds4staging -m setup
# получение "фактов" с фильтрацией вывода
ansible ds4staging -m setup -a 'filter=ansible_ens*'
# --- command
# выполнение произвольной команды на сервере (uptime)
ansible ds4ci -m command -a uptime
# то же, -m command выполняется по умолчанию
ansible ds4ci -a uptime
# выполнение команды с пробелами на сервере
ansible ds4ci -a "tail /var/log/dmesg"
# --- reboot
# reboot all hosts
ansible -i inventory/hosts.yml all -m reboot -b
# --- apt
ansible all -m apt -a "upgrade=yes update_cache=yes" --become
ansible all -m apt -a "upgrade=yes update_cache=yes autoremove=yes" --become
#
# --- debug
#
ansible registry -a uptime -e @secrets.yml.enc --ask-vault-pass
# отладочный вывод с подключением зашифрованного файла с секретами
ansible registry -m debug -a 'var=hostvars[inventory_hostname]' -e @secrets.yml.enc --ask-vault-pass
ansible registry -a uptime
# получение справки по модулю `service`
ansible-doc service
```
## Inventory
```ini
[group]
ds4ci ansible_host=10.0.100.232 ansible_user=adminwaltix \
ansible_port=10022 ansible_private_key_file=/path/to/idrsa
[group1]
host1 ...
[group2]
host2 ...
[parent_group:children]
group1
group2
```
Поведенческие параметры
Имя | Знач. по умолчанию | Описание
---|---|---
`ansible_host` | - | Имя хоста или IP-адрес
`ansible` | 22 | Порт для подключения по SSH
`ansible_user` | `root` | Пользователь для подключения по SSH
`ansible_password` | - | Пароль для подключения по SSH
`ansible_private_key_file` | - | Приватный SSH-ключ для аутентификации по SSH
`ansible_shell_type` | `sh` | Командная оболочка
Определение переменных групп в реестре
```ini
[all:vars]
ntp_server=ntp.ubuntu.com
[production:vars]
db_host=
db_name=
...
[staging:vars]
db_host=
db_name=
```
Определение переменных групп и хостов в отдельных файлах:
*host_vars/* - директория для переменных хостов
*host_vars/example.com* - файл с переменными хоста *example.com*
*group_vars/* - директория для переменных групп
*group_vars/production* - файл с переменными группы *production*
Формат файла:
```yml
db:
user: dbuser
password: dbpassword
primary:
host: db1.example.com
port: 5432
replica:
host: db2.example.com
port: 6543
```
Доступ к переменным из сценария: `{{ db.primary.host }}`
## Recipes
### Alt Linux
Для возможности управления Alt Linux с использование Ansible необходимо установить на Alt следующие пакеты:
```bash
# --- python 2
su
apt-get install python-module-pip
pip install simplejson
# --- python 3
su
apt-get install python3 python3-module-pip
ln -fs /usr/bin/python3 /usr/bin/python
ln -fs /usr/bin/pip3 /usr/bin/pip
```
### Кэширование переменных
Выявлено, что если в переменных хоста прописать следующую конструкцию
```yml
ansible_password: "{{ registry.ansible_password }}"
registry: ""
```
а в *secrets.yml.enc*
```yml
registry:
ansible_password: 'secret'
```
то при выполнении команды
```bash
ansible registry -a uptime -e @secrets.yml.enc --ask-vault-pass
```
мы ожидаемо получаем корректный ответ.
Но если мы сразу повторим команду без *secrets.yml.enc*, то она также выполнится корректно
```bash
ansible registry -a uptime
```
Т.е. в течении некоторого времени (до 5 минут) пароль где-то хранится...
Данное поведение наблюдается только при наличии пустой переменной `registry: ""```
## Troubleshooting
### localhost in Alert URL
В уведомлениях приходит URL localhost.
Необходимо добавить переменную окружения `GF_SERVER_ROOT_URL` с адресом сервера.
https://community.grafana.com/t/how-can-i-update-the-grafana-dashboard-url-in-the-slack-notification/15075/2
### "AnsibleError: template error while templating string: unexpected '.'
При выполнении модуля template, может случится так, что в файле-шаблоне уже используются `{{ }}`.
Напр, `oauth2_proxy` предполагает конфигурация логов через фигурные скобки.
```
#standard_logging_format = "[{{.Timestamp}}] [{{.File}}] {{.Message}}"
```
Подобная запись будет интерпретироваться Ansible-ом и будет выдана ошибка
```
"AnsibleError: template error while templating string: unexpected '.'
```
**Решение**
Чтобы *Ansible* пропускал определенные записи файла-шаблона необходимо воспользоваться `{% raw %}`и `{% endraw %}`, например
```
{% raw %}
#standard_logging_format = "[{{.Timestamp}}] [{{.File}}] {{.Message}}"
{% endraw %}
```