ansible:从子文件夹中的剧本中获取角色
ansible : get roles from playbook in a subfolder
我有这棵树:
├── 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
播放文件夹中有 ansible.cfg::
$ cat plays/ansible.cfg
[defaults]
roles_path=../roles/
$
我从流浪者那里打电话给 ansible.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$
您或许可以使用变量 roles_path
。它指向存储您的角色的文件夹。
如前所述,你的 ansible.cfg
不太可能被 ansible 识别。您可以通过以下设置测试您的 ansible.cfg 是否被接收:
[defaults]
roles_path = ./isnasiblegettingmycfg
并检查调试输出。 ansible.cfg 是 looked for in:
- ANSIBLE_CONFIG (an environment variable)
- ansible.cfg (in the current directory)
- .ansible.cfg (in the home directory)
- /etc/ansible/ansible.cfg
角色是 looked for in the directory of the executed playbook, and in the directory roles/ relative to the executed playbook and roles_path。所以另一个简单的解决方案是:
cd ~/stack/plays/ && ln -s ../roles
我只是将 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
有关使其工作的 ansible.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
$
我仍然从 vagrant 调用 ansible.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
$
roles 文件夹似乎需要放在 playbooks lives 文件夹中。
可以直接提供角色路径
或者如果你愿意,可以参考它:
roles:
- role: role_in_the_current_folder
- role: ../roles/role_in_an_other_folder
我有这棵树:
├── 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
播放文件夹中有 ansible.cfg::
$ cat plays/ansible.cfg
[defaults]
roles_path=../roles/
$
我从流浪者那里打电话给 ansible.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$
您或许可以使用变量 roles_path
。它指向存储您的角色的文件夹。
如前所述,你的 ansible.cfg
不太可能被 ansible 识别。您可以通过以下设置测试您的 ansible.cfg 是否被接收:
[defaults]
roles_path = ./isnasiblegettingmycfg
并检查调试输出。 ansible.cfg 是 looked for in:
- ANSIBLE_CONFIG (an environment variable)
- ansible.cfg (in the current directory)
- .ansible.cfg (in the home directory)
- /etc/ansible/ansible.cfg
角色是 looked for in the directory of the executed playbook, and in the directory roles/ relative to the executed playbook and roles_path。所以另一个简单的解决方案是:
cd ~/stack/plays/ && ln -s ../roles
我只是将 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
有关使其工作的 ansible.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
$
我仍然从 vagrant 调用 ansible.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
$
roles 文件夹似乎需要放在 playbooks lives 文件夹中。
可以直接提供角色路径
或者如果你愿意,可以参考它:
roles:
- role: role_in_the_current_folder
- role: ../roles/role_in_an_other_folder