Почему Ansible не читает шаблоны в относительном пути?
Я использую Ansible, и у меня есть некоторые проблемы с шаблоном. Вот вывод ошибки при выполнении:
$ ansible-playbook -i hosts site.yml
PLAY [users] ******************************************************************
GATHERING FACTS ***************************************************************
ok: [10.0.3.240]
TASK: [templates] *************************************************************
fatal: [10.0.3.240] => {'msg': 'unable to read /home/robe/Desktop/ansible_demo/fig.conf.j2', 'failed': True}
fatal: [10.0.3.240] => {'msg': 'unable to read /home/robe/Desktop/ansible_demo/fig.conf.j2', 'failed': True}
FATAL: all hosts have already failed -- aborting
PLAY RECAP ********************************************************************
to retry, use: --limit @/home/robe/site.retry
10.0.3.240 : ok=1 changed=0 unreachable=1 failed=0
Это моя структура проекта:
$ tree
.
├── ansible.cfg
├── hosts
├── roles
│ └── users
│ ├── files
│ ├── handlers
│ │ └── main.yml
│ ├── tasks
│ │ └── main.yml
│ ├── templates
│ │ └── fig.conf.j2
│ └── vars
│ └── main.yml
├── site.yml
└── Vagrantfile
Это мой код сайта .yml:
---
- hosts: users
remote_user: root
sudo: True
tasks:
- name: templates
template: src="fig.conf.j2" dest="/home/vagrant/fig.conf"
Затем, почему Ansible не смотрит в каталог шаблонов и он выглядит только в корневом каталоге.
Ответы
Ответ 1
Ansible будет искать в каталоге role/users/templates только тогда, когда вы явно используете роль "users", которую вы не используете в своем примере. Чтобы сделать то, что вы хотите, вам нужно изменить свой site.yml, чтобы он выглядел примерно так:
- hosts: users
remote_user: root
sudo: True
roles:
- { role: users }
Тогда в role/users/tasks/main.yml вы должны иметь:
- name: templates
template: src="fig.conf.j2" dest="/home/vagrant/fig.conf"
Роль в site.yml сообщает Ansible, что нужно запускать файл yaml role/users/tasks/main.yml. Задачи, которые ссылаются на файлы или шаблоны в этой роли, по умолчанию будут искать роли/пользователи/файлы и роли/пользователи/шаблоны для этих файлов/шаблонов. Возможно, вы захотите прочитать больше о ролях в документации Ansible, чтобы лучше понять, как они сочетаются друг с другом.
Ответ 2
Если вы хотите получить доступ к файлу шаблона "fig.conf.j2" из site.yml, вам нужно создать каталог шаблонов помимо site.yml и поместить в него файл "fig.conf.j2".
Согласно вашей текущей структуре каталогов, так как каталог шаблонов находится внутри роли. Вам нужно получить доступ к шаблону из tasks/main.yml внутри этой роли