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 %} ```
