use*_*469 10 ansible ansible-playbook
有没有人知道如何将playbooks放入文件夹,但共享相同的角色,group_vars和其他通常位于根目录的东西?
这是我想要的:
root_dir: - group_vars - roles - inventory - playbooks - my_playbook.yml - site.yml - deploy.yml
我们的根目录现在变得非常大了,我想将一些剧本分成他们自己的文件夹(显示为剧本/上面).当一个目录(例如,playbooks /)与root目录相比时,一个相同的小剧本无法运行,因为它不会从group_vars中获取内容.
我可以部分解决这个问题,并在我的playbooks /目录中运行一个剧本:
- hosts: host_group sudo: true gather_facts: false vars_files: - ../group_vars/all/main.yml
这将获取main.yml中定义的变量.但是,我不清楚这是否会添加group_vars /中定义的组变量,而不是明确指定的../group_vars/.
谢谢!
小智 7
Ansible将在group_vars没有明确说明路径的情况下接听:
以下是示例目录结构/tmp/ansible:
/tmp/ansible
??? group_vars
? ??? test_group.yml
??? inventory
??? playbooks
? ??? foo.yml
??? site.yml
Run Code Online (Sandbox Code Playgroud)
库存文件:
[test_group]
localhost
Run Code Online (Sandbox Code Playgroud)
主要剧情site.yml:
# site.yml
---
- include: playbooks/foo.yml
Run Code Online (Sandbox Code Playgroud)
二级剧本foo.yml:
---
- hosts: localhost
tasks:
- debug: var=foo
Run Code Online (Sandbox Code Playgroud)
组变量test_group.yml:
foo: bar
Run Code Online (Sandbox Code Playgroud)
以下是执行辅助剧本的所有方法:
从根文件夹使用相对路径/tmp/ansible:
ansible-playbook -i inventory playbooks/foo.yml -c local
PLAY [localhost] **************************************************************
GATHERING FACTS ***************************************************************
ok: [localhost]
TASK: [debug var=foo] *********************************************************
ok: [localhost] => {
"var": {
"foo": "bar"
}
}
PLAY RECAP ********************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0
Run Code Online (Sandbox Code Playgroud)从包含父路径中的库存的Playbooks子文件夹/tmp/ansible/playbooks:
ansible-playbook -i ../inventory foo.yml -c local
PLAY [localhost] **************************************************************
GATHERING FACTS ***************************************************************
ok: [localhost]
TASK: [debug var=foo] *********************************************************
ok: [localhost] => {
"var": {
"foo": "bar"
}
}
PLAY RECAP ********************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0
Run Code Online (Sandbox Code Playgroud)正如我们在上面的例子中所看到的,ansible-playbook将根据路径inventory file或者文件夹查找变量来执行.无需额外工作即可分离Playbooks.
如果您不使用角色,Gregory Shulov 的回答有效。但是,如果您使用角色,您的子文件夹剧本将无法正常引用它们。
如果您没有太多文件,我建议通过在它们前面加上下划线来分隔它们的“子文件夹”文件。这帮助我将一些积木游戏与我希望人们运行的真实剧本分开。
组/主机变量与定义库存的位置有关。当我开始时,我遇到了与您类似的问题。这是我采取的步骤
将您的库存(静态或动态)移动到单独的目录中。即 $PROJECT_HOME/inventory/base_inventory。Ansible 将自动解析该目录中的所有文件并添加到清单中。这总是在以后被覆盖。例如 ansible -i inventory/other_hosts
更新 ansible.cfg 以指向新的清单目录。IE。主机文件 = $PROJECT_HOME/库存
将您的 groups_vars 和 host_vars 移动到新的清单目录中。即 $PROJECT_HOME/inventory/group_vars
现在,您无需担心相对路径。此外,如果您想从源代码树中的任何位置使用您的角色,请更新 ansible.cfg 并将 roles_path 设置为基本项目路径。即roles_path =roles:$PROJECT_HOME/roles