ansible:从子文件夹中获取playbook中的角色

use*_*834 11 vagrant ansible 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
Run Code Online (Sandbox Code Playgroud)

在play文件夹中使用ansible.cfg ::

$ cat plays/ansible.cfg
[defaults]
roles_path=../roles/
$
Run Code Online (Sandbox Code Playgroud)

我从vagrant打电话给ansible.playbook ::

$ grep playbook vagrant/Vagrantfile
ansible.playbook = "../plays/playbook_01.yml
Run Code Online (Sandbox Code Playgroud)

在playbook_01.yml上::

$ cat plays/playbook_01.yml
- hosts: vagrant
  vars:
    user: fox
    home: /home/fox
  roles:
    - role_B
Run Code Online (Sandbox Code Playgroud)

与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 }}
$
Run Code Online (Sandbox Code Playgroud)

但是当只看到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$
Run Code Online (Sandbox Code Playgroud)

Héc*_*eja 6

你可以使用变量roles_path.它指向存储角色的文件夹.


use*_*834 0

我只需将“角色”文件夹移动到“plays”文件夹中并删除“play/ansible.cfg”即可使其工作:

\n\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 plays\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 playbook_01.yml\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 playbook_02.yml\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 playbook_03.yml\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 roles\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 role_A\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 files\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tasks\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.yml\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 role_B\n\xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 files\n\xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tasks\n\xe2\x94\x82\xc2\xa0\xc2\xa0             \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.yml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 README.rst\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 serverlist\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 client1_serverlist_prod\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 client1_serverlist_test\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 client1_serverlist_train\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 client2_serverlist_prod\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 client2_serverlist_test\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 client2_serverlist_train\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 vagrant\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 Vagrantfile\n
Run Code Online (Sandbox Code Playgroud)\n\n

有关使其工作的 ansible.cfg 配置的详细信息::

\n\n
$ ls ~/.ansible.cfg\nls: cannot access ~/.ansible.cfg: No such file or directory\n\n$ grep roles_path /etc/ansible/ansible.cfg\n#roles_path    = /etc/ansible/roles\n\n$ echo $ANSIBLE_CONFIG\n\n$\n
Run Code Online (Sandbox Code Playgroud)\n\n

我仍然从 vagrant 调用 ansible.playbook::

\n\n
$ grep playbook vagrant/Vagrantfile\nansible.playbook = "../plays/playbook_01.yml\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 playbook_01.yml 上::

\n\n
$ cat plays/playbook_01.yml\n- hosts: vagrant\n  vars:\n    user: fox\n    home: /home/fox\n  roles:\n    - role_B\n
Run Code Online (Sandbox Code Playgroud)\n\n

与角色_B::

\n\n
$ cat roles/role_B/tasks/main.yml\n---\n- name: Create user group\n  group: name={{ user }} state=present\n\n- name: Check Python version\n  command: python --version\n  register: pyver\n\n- name: Print version\n  debug:\n    msg: "Python Version: {{ pyver.stderr }}"\n
Run Code Online (Sandbox Code Playgroud)\n\n

通过这个修改,效果就像一个魅力:

\n\n
$ vagrant provision\n==> vagrant: Running provisioner: ansible...\n\nPLAY [vagrant] ************************************************************\nGATHERING FACTS ***********************************************************\n  ok: [vagrant]\nTASK: [role_B | Create user group] ****************************************\n  ok: [vagrant]\nTASK: [role_B | Check Python version] *************************************\n  changed: [vagrant]\nTASK: [role_B | Print version] ********************************************\n  ok: [vagrant] => {\n    "msg": "Python Version: Python 2.7.9"\n}\nPLAY RECAP ****************************************************************\nvagrant                    : ok=4    changed=1    unreachable=0    failed=0\n$\n
Run Code Online (Sandbox Code Playgroud)\n\n

看起来该角色文件夹需要位于 playbooks live 文件夹内。

\n