我想塑造我的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塔(所以我正在寻找替代解决方案)。
答案 0 :(得分:9)
我认为问题在于您需要正确设置相对路径。 Ansible首先相对于被调用的playbooks目录应用给定路径,然后查找当前工作路径(从中执行ansible-playbook
命令)并最终检入/etc/ansible/roles
,而不是{{1在您的目录结构中,您可以使用{ role: java/java_role1 }
或{ role: ../../roles/java/java_role1 }
。另一种选择是配置ansible正在寻找角色的路径。为此,您可以按照Ansible docs中的说明在项目{ role: roles/java/java_role1 }
中设置roles_path
。
根据您的示例:
目录树
ansible.cfg
为了测试它,该剧将包括ansible/
├── hosts
│ └── dev
├── plays
│ └── java_plays
│ └── java.yml
└── roles
├── java
│ └── java_role1
│ └── tasks
│ └── main.yml
└── role1
└── tasks
└── main.yml
和java_role1
。
<强>起着/ java_plays / java.yml:强>
role1
出于测试目的,这些角色只需打印调试信息。
<强>基于role1 /任务/ main.yml:强>
---
- name: deploy java stuff
hosts: java
roles:
- { role: roles/role1 }
- { role: roles/java/java_role1 }
---
- debug: msg="Inside role1"
hosts文件只将localhost设置为dev
组。现在我可以使用剧本了:
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
答案 1 :(得分:3)
我使用的另一个选项是在你的playbook目录中创建一个ansible.cfg文件并在其中放入以下内容:
[默认]
roles_path = / etc / ansible / roles ::
或在你的情况下:
[默认]
roles_path = / etc / ansible / roles:/ etc / ansible / roles / java
然后不要使用任何相对路径。
答案 2 :(得分:1)
更优雅的解决方案(imo)将您的角色目录符号链接到playbooks目录中。
我的目录结构如下:
inventory/ playbooks/ |-> roles -> ../roles |-> group_vars -> ../group_vars |-> host_vars -> ../host_vars roles/ group_vars/ host_vars/
就我而言,我通过运行ln -s ../roles playbooks/roles