[web]
node2
[db]
db1 ansible_host=10.0.0.21 ansible_user=deploy
[local]
localhost ansible_connection=local
[web:vars]
ansible_user=student
| Что |
Где |
Значит |
| имя машины |
node2 |
так машина называется в выводе; по нему же Ansible подключается, если нет ansible_host |
ansible_host |
строка машины |
адрес или имя для SSH |
ansible_user |
строка машины или [группа:vars] |
под кем входить; без него — под твоим именем |
ansible_connection=local |
строка машины |
работать на этой машине без SSH |
[web] |
заголовок |
группа; all — все машины инвентаря |
student@node1:~/inv$ ansible-inventory -i hosts.ini --graph
@all:
|--@ungrouped:
|--@web:
| |--node2
|--@local:
| |--localhost
student@node1:~/inv$ ansible -i hosts.ini all --list-hosts
hosts (2):
node2
localhost
Без -i Ansible ищет /etc/ansible/hosts; на учебной машине его нет, и
команда видит только localhost. Ошибки инвентаря в плейбуке —
ansible-playbook.
ansible <машины> -m <модуль> -a '<параметры>' — один модуль на всех
машинах группы. Ответ — по машине:
student@node1:~/inv$ ansible -i hosts.ini web -m copy \
> -a 'content="hello\n" dest=/tmp/hello.txt'
node2 | CHANGED => {
"changed": true,
"dest": "/tmp/hello.txt",
...
}
Повтор той же команды — node2 | SUCCESS и "changed": false: файл уже
такой. Модуль command (он же по умолчанию, без -m) не знает, что
делает команда, и всегда пишет CHANGED:
student@node1:~/inv$ ansible -i hosts.ini web -m command -a 'id -un'
node2 | CHANGED | rc=0 >>
student
| В выводе |
Значит |
SUCCESS |
модуль отработал, менять было нечего |
CHANGED |
модуль изменил машину (у command — всегда) |
FAILED! |
модуль отработал с ошибкой — причина в msg |
UNREACHABLE! |
к машине не подключиться — ansible |
-o печатает ответ каждой машины одной строкой. service в ответе
выводит сотни полей юнита — -o или плейбук читать удобнее.
Модули выполняются от того, под кем Ansible вошёл. Запись в /etc без
прав:
node2 | FAILED! => {
...
"msg": "Destination /etc not writable"
}
-b (--become) — выполнить модуль через sudo:
student@node1:~/inv$ ansible -i hosts.ini web -b -m command -a 'id -un'
node2 | CHANGED | rc=0 >>
root
На учебных машинах sudo у student без пароля. Где sudo спрашивает
пароль, добавь -K (--ask-become-pass). В плейбуке то же —
become: true.
- hosts: web
become: true
vars:
pkg: nginx
tasks:
- name: Установить {{ pkg }}
apt: { name: "{{ pkg }}", state: present, update_cache: true }
- name: Конфиг из шаблона
template: { src: nginx.conf.j2, dest: /etc/nginx/nginx.conf }
notify: reload nginx
- name: Запустить и включить
service: { name: "{{ pkg }}", state: started, enabled: true }
handlers:
- name: reload nginx
service: { name: nginx, state: reloaded }
ansible-playbook -i inventory.ini site.yml
ansible-playbook -i inventory.ini site.yml --check --diff
ansible-playbook -i inventory.ini site.yml --limit web1 --tags config
ansible-galaxy init roles/myrole
Переменные — group_vars/, host_vars/; секреты — ansible-vault
(ansible-vault encrypt secrets.yml, запуск с --ask-vault-pass). На
учебной машине сети наружу нет: update_cache и пакеты из сети не
сработают.
Как читать вывод прогона, changed=0 на втором прогоне, обработчики,
--check --diff и ошибки плейбука — ansible-playbook.