Ansible:剧本在角色目录中的目录中调用角色
Ansible: playbook calling Role in a directory that is in the roles directory
我想调整我的 ansible 角色和剧本的目录结构。
目前我有一个类似的目录结构。
group_vars
* all
* group-one
- group-vars.yml
- group-vault.yml
...
host_vars
- server1.yml
plays
- java_plays
* deploy_fun_java_stuff.yml
* deploy_playbook.yml
roles
- role1
- tasks
* main.yml
- handlers
- (the rest of the needed directories)
- role2
- java
- java_role1
- tasks
* main.yml
- handlers
- (the rest of the needed directories)
我希望能够召唤出剧中java_role1
的角色deploy_fun_java_stuff.yml
我可以打电话给
---
- name: deploy fun java stuff
hosts: java
roles:
- { role: role1 }
但我不能打电话(我试过多种方法)。这可能吗?
- name: deploy fun java stuff
hosts: java
roles:
- { role: java/java_role1 }
我真正想要完成的是能够按照我的角色有序地组织我的剧本。
我最终会得到大量的角色和戏剧,我想组织它们。
我可以为每个播放目录使用单独的 ansible.cfg 文件来处理这个问题,但我无法将这些 cfg 文件添加到 ansible tower(所以我正在寻找替代解决方案)。
我认为问题是您需要正确设置相对路径。 Ansible 首先应用相对于被调用的 playbooks 目录的给定路径,然后查看当前工作路径(您正在执行 ansible-playbook
命令),最后检查 /etc/ansible/roles
,而不是 { role: java/java_role1 }
在您的目录结构中,您可以使用 { role: ../../roles/java/java_role1 }
或 { role: roles/java/java_role1 }
。另一种选择是配置 ansible 寻找角色的路径。为此,您可以按照 Ansible docs.
中所述在项目 ansible.cfg
中设置 roles_path
根据你的例子:
目录树:
ansible/
├── hosts
│ └── dev
├── plays
│ └── java_plays
│ └── java.yml
└── roles
├── java
│ └── java_role1
│ └── tasks
│ └── main.yml
└── role1
└── tasks
└── main.yml
为了测试它,该剧将包括 java_role1
和 role1
。
plays/java_plays/java.yml:
---
- name: deploy java stuff
hosts: java
roles:
- { role: roles/role1 }
- { role: roles/java/java_role1 }
出于测试目的,这些角色仅打印调试消息。
role1/tasks/main.yml:
---
- debug: msg="Inside role1"
dev
hosts 文件只是将 localhost 设置为 java
组。现在我可以使用剧本了:
fishi@zeus:~/workspace/ansible$ ansible-playbook -i hosts/dev plays/java_plays/java.yml
PLAY [deploy java stuff] *******************************************************
TASK [setup] *******************************************************************
ok: [localhost]
TASK [role1 : debug] ***********************************************
ok: [localhost] => {
"msg": "Inside role1"
}
TASK [java_role1 : debug] *************************************
ok: [localhost] => {
"msg": "Inside java_role1"
}
PLAY RECAP *********************************************************************
localhost : ok=3 changed=0 unreachable=0 failed=0
现在,当您使用 { role: ../../roles/java/java_role1 }
和 { role: ../../roles/role1 }
时,您在 TASK
括号内的日志输出将显示整个相对路径,而不仅仅是角色名称:
fishi@zeus:~/workspace/ansible$ ansible-playbook -i hosts/dev plays/java_plays/java.yml
PLAY [deploy java stuff] *******************************************************
TASK [setup] *******************************************************************
ok: [localhost]
TASK [../../roles/role1 : debug] ***********************************************
ok: [localhost] => {
"msg": "Inside role1"
}
TASK [../../roles/java/java_role1 : debug] *************************************
ok: [localhost] => {
"msg": "Inside java_role1"
}
PLAY RECAP *********************************************************************
localhost : ok=3 changed=0 unreachable=0 failed=0
我使用的另一个选项是在您的 playbook 目录中创建一个 ansible.cfg 文件,并将以下内容放入其中:
[默认值]
roles_path = /etc/ansible/roles: :
或者您的情况:
[默认值]
roles_path = /etc/ansible/roles:/etc/ansible/roles/java
那就不要使用任何相对路径。
一个更优雅的解决方案 (imo) 是将您的角色目录符号链接到 playbooks 目录中。
我的目录结构如下:
inventory/
playbooks/
|-> roles -> ../roles
|-> group_vars -> ../group_vars
|-> host_vars -> ../host_vars
roles/
group_vars/
host_vars/
在我的例子中,我通过 运行 ln -s ../roles playbooks/roles
创建了符号链接
我想调整我的 ansible 角色和剧本的目录结构。
目前我有一个类似的目录结构。
group_vars
* all
* group-one
- group-vars.yml
- group-vault.yml
...
host_vars
- server1.yml
plays
- java_plays
* deploy_fun_java_stuff.yml
* deploy_playbook.yml
roles
- role1
- tasks
* main.yml
- handlers
- (the rest of the needed directories)
- role2
- java
- java_role1
- tasks
* main.yml
- handlers
- (the rest of the needed directories)
我希望能够召唤出剧中java_role1
的角色deploy_fun_java_stuff.yml
我可以打电话给
---
- name: deploy fun java stuff
hosts: java
roles:
- { role: role1 }
但我不能打电话(我试过多种方法)。这可能吗?
- name: deploy fun java stuff hosts: java roles: - { role: java/java_role1 }
我真正想要完成的是能够按照我的角色有序地组织我的剧本。 我最终会得到大量的角色和戏剧,我想组织它们。
我可以为每个播放目录使用单独的 ansible.cfg 文件来处理这个问题,但我无法将这些 cfg 文件添加到 ansible tower(所以我正在寻找替代解决方案)。
我认为问题是您需要正确设置相对路径。 Ansible 首先应用相对于被调用的 playbooks 目录的给定路径,然后查看当前工作路径(您正在执行 ansible-playbook
命令),最后检查 /etc/ansible/roles
,而不是 { role: java/java_role1 }
在您的目录结构中,您可以使用 { role: ../../roles/java/java_role1 }
或 { role: roles/java/java_role1 }
。另一种选择是配置 ansible 寻找角色的路径。为此,您可以按照 Ansible docs.
ansible.cfg
中设置 roles_path
根据你的例子:
目录树:
ansible/
├── hosts
│ └── dev
├── plays
│ └── java_plays
│ └── java.yml
└── roles
├── java
│ └── java_role1
│ └── tasks
│ └── main.yml
└── role1
└── tasks
└── main.yml
为了测试它,该剧将包括 java_role1
和 role1
。
plays/java_plays/java.yml:
---
- name: deploy java stuff
hosts: java
roles:
- { role: roles/role1 }
- { role: roles/java/java_role1 }
出于测试目的,这些角色仅打印调试消息。
role1/tasks/main.yml:
---
- debug: msg="Inside role1"
dev
hosts 文件只是将 localhost 设置为 java
组。现在我可以使用剧本了:
fishi@zeus:~/workspace/ansible$ ansible-playbook -i hosts/dev plays/java_plays/java.yml
PLAY [deploy java stuff] *******************************************************
TASK [setup] *******************************************************************
ok: [localhost]
TASK [role1 : debug] ***********************************************
ok: [localhost] => {
"msg": "Inside role1"
}
TASK [java_role1 : debug] *************************************
ok: [localhost] => {
"msg": "Inside java_role1"
}
PLAY RECAP *********************************************************************
localhost : ok=3 changed=0 unreachable=0 failed=0
现在,当您使用 { role: ../../roles/java/java_role1 }
和 { role: ../../roles/role1 }
时,您在 TASK
括号内的日志输出将显示整个相对路径,而不仅仅是角色名称:
fishi@zeus:~/workspace/ansible$ ansible-playbook -i hosts/dev plays/java_plays/java.yml
PLAY [deploy java stuff] *******************************************************
TASK [setup] *******************************************************************
ok: [localhost]
TASK [../../roles/role1 : debug] ***********************************************
ok: [localhost] => {
"msg": "Inside role1"
}
TASK [../../roles/java/java_role1 : debug] *************************************
ok: [localhost] => {
"msg": "Inside java_role1"
}
PLAY RECAP *********************************************************************
localhost : ok=3 changed=0 unreachable=0 failed=0
我使用的另一个选项是在您的 playbook 目录中创建一个 ansible.cfg 文件,并将以下内容放入其中:
[默认值]
roles_path = /etc/ansible/roles: :
或者您的情况:
[默认值]
roles_path = /etc/ansible/roles:/etc/ansible/roles/java
那就不要使用任何相对路径。
一个更优雅的解决方案 (imo) 是将您的角色目录符号链接到 playbooks 目录中。
我的目录结构如下:
inventory/ playbooks/ |-> roles -> ../roles |-> group_vars -> ../group_vars |-> host_vars -> ../host_vars roles/ group_vars/ host_vars/
在我的例子中,我通过 运行 ln -s ../roles playbooks/roles