Ansible
Вложенные материалы
Item does not exist or read access blocked by ACLs: +show/+1890af9d50fb4de0834d49108c59370a/devops/ansible
Полезные ссылки
Установка
Бинарник (v2.x)
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-пакет
sudo python3 -m pip install ansible # --- консоль необходимо перезапустить ansible --version
Ad Hoc
# # --- 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
[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 | Командная оболочка |
Определение переменных групп в реестре
[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.comgroup_vars/ - директория для переменных групп group_vars/production - файл с переменными группы production
Формат файла:
db: user: dbuser password: dbpassword primary: host: db1.example.com port: 5432 replica: host: db2.example.com port: 6543
Доступ к переменным из сценария: {{ db.primary.host }}
Vault
Утилита командной строки ansible-vault
позволяет создавать и редактировать зашифрованный файл, который ansible-playbook
будет автоматически распознавать и расшифровывать с помощью пароля.
# зашифровать имеющийся файл ansible-vault encrypt secrets.yml # создать новый зашифрованный файл ansible-vault create secrets.yml.enc # изменить пароль зашифронного файла ansible-vault rekey secrets.yml.enc # открыть зашифрованный файл для редактирования ansible-vault edit secrets.yml.enc # вызов сценария с запросом пароля расшифрования ansible-playbook some-playbook.yml --ask-vault-pass # вызов сценария с указанием расположения файла с паролем ansible-playbook some-playbook.yml --vault-password-file ~/password.txt
Recipes
Alt Linux
Для возможности управления Alt Linux с использование Ansible необходимо установить на Alt следующие пакеты:
# --- 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
Кэширование переменных
Выявлено, что если в переменных хоста прописать следующую конструкцию
ansible_password: "{{ registry.ansible_password }}" registry: ""
а в secrets.yml.enc
registry: ansible_password: 'secret'
то при выполнении команды
ansible registry -a uptime -e @secrets.yml.enc --ask-vault-pass
мы ожидаемо получаем корректный ответ.
Но если мы сразу повторим команду без secrets.yml.enc, то она также выполнится корректно
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 %}