Ansible:在角色目录中的目录中调用角色的playbook
我想塑造我的角色和剧本的目录结构 目前我有一个目录结构,如Ansible:在角色目录中的目录中调用角色的playbook,ansible,ansible-playbook,ansible-tower,Ansible,Ansible Playbook,Ansible Tower,我想塑造我的角色和剧本的目录结构 目前我有一个目录结构,如 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 - r
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\u role1
deploy\u fun\u java\u stuff.yml
我可以打电话
---
- name: deploy fun java stuff
hosts: java
roles:
- { role: role1 }
但我不能打电话(我试过多种方法)。这可能吗
我真正想要完成的是能够按照我的角色有序地组织我的剧本。 我将以大量的角色和戏剧结束,我想组织他们
我可以为每个播放目录使用一个单独的ansible.cfg文件来处理这个问题,但我无法将这些cfg文件添加到ansible tower(因此我正在寻找替代解决方案) 我认为问题在于您需要正确设置相对路径。Ansible首先应用相对于调用的playbook目录的给定路径,然后查找当前工作路径(从中执行
Ansible playbook
命令),最后检入/etc/Ansible/roles
,因此可以在dir结构中使用{role:java/java\role1}
{role:../../roles/java/java\u role1}或{role:roles/java/java\u role1}
。另一个选项是配置ansible查找角色的路径。为此,您可以在项目中设置ansible.cfg
中所述的角色路径
根据您的示例:
目录树:
ansible/
├── hosts
│ └── dev
├── plays
│ └── java_plays
│ └── java.yml
└── roles
├── java
│ └── java_role1
│ └── tasks
│ └── main.yml
└── role1
└── tasks
└── main.yml
---
- name: deploy java stuff
hosts: java
roles:
- { role: roles/role1 }
- { role: roles/java/java_role1 }
---
- debug: msg="Inside role1"
为了测试它,该剧将包括java_role1
和role1
播放/java\u播放/java.yml:
ansible/
├── hosts
│ └── dev
├── plays
│ └── java_plays
│ └── java.yml
└── roles
├── java
│ └── java_role1
│ └── tasks
│ └── main.yml
└── role1
└── tasks
└── main.yml
---
- name: deploy java stuff
hosts: java
roles:
- { role: roles/role1 }
- { role: roles/java/java_role1 }
---
- debug: msg="Inside role1"
出于测试目的,这些角色只需打印调试消息
role1/tasks/main.yml:
ansible/
├── hosts
│ └── dev
├── plays
│ └── java_plays
│ └── java.yml
└── roles
├── java
│ └── java_role1
│ └── tasks
│ └── main.yml
└── role1
└── tasks
└── main.yml
---
- name: deploy java stuff
hosts: java
roles:
- { role: roles/role1 }
- { role: roles/java/java_role1 }
---
- 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:../../role1}
时,您在任务
括号内的日志输出将显示整个相对路径,而不仅仅是角色名称:
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文件,并在其中放置以下内容:
[默认值]
角色\路径=/etc/ansible/roles::
或者在您的情况下:
[默认值]
角色\路径=/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/
存货/
剧本/
|->角色->../roles
|->组变量->组变量
|->主机变量->主机变量
角色/
组变量/
东道主/
在我的例子中,我通过运行ln-s../roles playbooks/roles
创建了符号链接java/java\u role1
?Role not found error。注意,它正在查找工作目录中的角色,../plays/java\u plays/
java\u role1不在其/java/中的角色目录中。移动到角色将起作用但我想你想加入这个阶层,对吧?