ansible: получение ролей из playbook в подпапке



У меня есть это дерево:



├── plays
│   ├── ansible.cfg
│   ├── playbook_01.yml
│   ├── playbook_02.yml
│   └── playbook_03.yml
├── README.rst
├── roles
│   ├── role_A
│   │   ├── files
│   │   └── tasks
│   │   └── main.yml
│   └── role_B
│   ├── files
│   └── tasks
│   └── main.yml
├── serverlist
│   ├── client1_serverlist_prod
│   ├── client1_serverlist_test
│   ├── client1_serverlist_train
│   ├── client2_serverlist_prod
│   ├── client2_serverlist_test
│   └── client2_serverlist_train
└── vagrant
└── Vagrantfile


С ансиблем.cfg в папке play::



$ cat plays/ansible.cfg
[defaults]
roles_path=../roles/
$


Я звоню из вагранта ансибля.playbook::



$ grep playbook vagrant/Vagrantfile
ansible.playbook = "../plays/playbook_01.yml


На playbook_01.yml::



$ cat plays/playbook_01.yml
- hosts: vagrant
vars:
user: fox
home: /home/fox
roles:
- role_B


С role_B::



$ cat roles/role_B/tasks/main.yml
---
- name: Create user group
group: name={{ user }} state=present

- name: Create home directory for user
file: state=directory path={{ home }} group=www-data owner={{ user }}
$


Но ansible, когда только пошел посмотреть роли в папке play, я получаю эту ошибку::



vagrant$ vagrant provision
==> vagrant: Running provisioner: ansible...
PYTHONUNBUFFERED=1 ANSIBLE_HOST_KEY_CHECKING=false ANSIBLE_FORCE_COLOR=true
ANSIBLE_SSH_ARGS='-o UserKnownHostsFile=/dev/null -o IdentitiesOnly=yes -o
ForwardAgent=yes -o ControlMaster=auto -o ControlPersist=60s' ansible-playbook
--user=vagrant --connection=ssh --timeout=30 --limit='vagrant'
--inventory-file=/home/luis/lab/sandbox/akd-iac/stack/vagrant/.vagrant/provisioners/ansible/inventory
--sudo -vvvv ../plays/playbook_01.yml
ERROR: cannot find role in
~/stack/plays/roles/role_B or
~/stack/plays/role_B or /etc/ansible/roles/role_B
Ansible failed to complete successfully. Any error output should be
visible above. Please fix these errors and try again.
vagrant$
654   3  

3 ответов:

Вероятно, вы можете использовать переменную roles_path. Он указывает на папку, в которой хранятся ваши роли.

Как уже упоминалось, ваш ansible.cfg вряд ли будет подобран ансиблем. Вы можете проверить, если ваш ансибль.cfg подбирается, устанавливая это:

[defaults]
roles_path = ./isnasiblegettingmycfg

И проверка вывода отладки. Анзибль.cfg ищется в :

  • ANSIBLE_CONFIG (переменная окружения)
  • ансибль.cfg (в текущем каталоге)
  • .анзибль.cfg (в домашнем каталоге)
  • / etc / ansible / ansible.cfg

Роли-это искал в директории исполняемого playbook, а также в директории roles/ относительно исполняемого playbook и roles_path. Итак, еще одно простое решение:

cd ~/stack/plays/ && ln -s ../roles

Я заставляю его работать, просто перемещая папку ролей в папку plays и удаляя play/ansible.cfg:

.
├── plays
│   ├── playbook_01.yml
│   ├── playbook_02.yml
│   ├── playbook_03.yml
│   └── roles
│       ├── role_A
│       │   ├── files
│       │   └── tasks
│       │       └── main.yml
│       └── role_B
│           ├── files
│           └── tasks
│               └── main.yml
├── README.rst
├── serverlist
│   ├── client1_serverlist_prod
│   ├── client1_serverlist_test
│   ├── client1_serverlist_train
│   ├── client2_serverlist_prod
│   ├── client2_serverlist_test
│   └── client2_serverlist_train
└── vagrant
    └── Vagrantfile

Подробности о анзибль.конфигурация cfg, которая заставляет его работать::

$ ls ~/.ansible.cfg
ls: cannot access ~/.ansible.cfg: No such file or directory

$ grep roles_path /etc/ansible/ansible.cfg
#roles_path    = /etc/ansible/roles

$ echo $ANSIBLE_CONFIG

$
Я все еще звоню из вагранта-ансибля.playbook::
$ grep playbook vagrant/Vagrantfile
ansible.playbook = "../plays/playbook_01.yml

На playbook_01.yml::

$ cat plays/playbook_01.yml
- hosts: vagrant
  vars:
    user: fox
    home: /home/fox
  roles:
    - role_B

С role_B::

$ cat roles/role_B/tasks/main.yml
---
- name: Create user group
  group: name={{ user }} state=present

- name: Check Python version
  command: python --version
  register: pyver

- name: Print version
  debug:
    msg: "Python Version: {{ pyver.stderr }}"

С этой модификацией, которая работает как заклинание:

$ vagrant provision
==> vagrant: Running provisioner: ansible...

PLAY [vagrant] ************************************************************
GATHERING FACTS ***********************************************************
  ok: [vagrant]
TASK: [role_B | Create user group] ****************************************
  ok: [vagrant]
TASK: [role_B | Check Python version] *************************************
  changed: [vagrant]
TASK: [role_B | Print version] ********************************************
  ok: [vagrant] => {
    "msg": "Python Version: Python 2.7.9"
}
PLAY RECAP ****************************************************************
vagrant                    : ok=4    changed=1    unreachable=0    failed=0
$

Похоже, что папка ролей должна быть внутри папки playbooks lives.

Comments

    Ничего не найдено.