我想塑造我的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:部署有趣的java东西
hosts:java
角色:
- {role:java / java_role1}
我真正想要实现的是能够以有序的方式和我的角色一起构建我的戏剧 . 我最终会有大量的角色和戏剧,我想组织它们 .
我可以为每个播放目录使用单独的ansible.cfg文件来处理这个问题,但是我无法将这些cfg文件添加到ansible塔(所以我正在寻找替代解决方案) .
3 回答
更优雅的解决方案(imo)是将您的角色目录符号链接到playbooks目录中 .
我的目录结构如下:
就我而言,我通过运行
ln -s ../roles playbooks/roles
创建了符号链接我认为问题是你需要正确设置相对路径 . Ansible首先应用相对于被调用的playbooks目录的给定路径,然后查找当前工作路径(从中执行
ansible-playbook
命令)并最终检入/etc/ansible/roles
,因此在你的目录结构中代替{ role: java/java_role1 }
你可以使用{ role: ../../roles/java/java_role1 }
或{ role: roles/java/java_role1 }
. 另一种选择是配置ansible正在寻找角色的路径 . 为此,您可以在项目ansible.cfg
中设置roles_path
,如Ansible docs中所述 .根据你的例子:
Dir tree:
为了测试它,该剧将包括
java_role1
和role1
.plays/java_plays/java.yml:
出于测试目的,这些角色只需打印调试消息 .
role1/tasks/main.yml:
dev
hosts文件只是将localhost设置为java
组 . 现在我可以使用剧本:现在使用
{ role: ../../roles/java/java_role1 }
和{ role: ../../roles/role1 }
时,在TASK
括号内的日志输出会显示相同的路径,而不仅仅是角色名称:我使用的另一个选项是在playbook目录中创建一个ansible.cfg文件并在其中放置以下内容:
[默认]
roles_path = / etc / ansible / roles ::
或者在你的情况下:
[默认]
roles_path = / etc / ansible / roles:/ etc / ansible / roles / java
然后不要使用任何相对路径 .