实际的剧本:
---
- hosts: aws_instance.jenkins-agents
user: ec2-user
vars_files:
- ../../../vars/main.yaml
- ../../../vars/vault.yaml
...
是否有任何方法可以保留dir结构,但是避免使用lochness家族(
../../../
)?我知道角色的位置您可以指定角色的路径,但是我找不到与vars_files类似的项目
项目条件:
我们需要从项目的根目录运行剧本
vars和playbooks dir都位于项目的根目录中
该项目没有静态清单/主机,但是当您运行一些剧本时会即时生成
#1 楼
您会注意到,有关目录布局的官方建议将所有手册都置于根目录下。这是故意的,因为Ansible不能很好地处理其他方案。您可以开始将剧本放在一个子目录中,但这将需要(如您所知)从剧本到其使用的任何其他资源的相对路径的使用; Ansible使用剧本路径开始搜索,这就是它的编写方式。在大多数情况下,这就是当您选择将剧本移动到何处时要处理的内容。
但是,嵌套似乎比应有的多:
---
- hosts: aws_instance.jenkins-agents
user: ec2-user
vars_files:
- ../../../vars/main.yaml
- ../../../vars/vault.yaml
...
为什么要浏览三个目录?我希望这种布局与官方布局类似,但是有一个用于剧本的子文件夹;那么您最终会得到
---
- hosts: aws_instance.jenkins-agents
user: ec2-user
vars_files:
- ../vars/main.yaml
- ../vars/vault.yaml
...
,这是一个微小的变化。
其次,这非常罕见您实际上要使用
vars_files
。 Ansible中使用的大多数变量根据主机而有所不同(因此应在项目根目录中的group_vars
/ host_vars
中)或特定于角色(因此在角色目录中的vars
/ defaults
中)。一些文档链接:https://docs.ansible.com/ansible/intro_inventory.html#splitting-out-host-and-group-specific-data
https://docs.ansible.com/ansible/playbooks_roles.html#roles
https://docs.ansible.com/ansible/playbooks_roles.html#role-default-variables
就个人而言,我认为最好不要过多地写书,而是将所有内容委派给角色。这是您设置中整个剧本的示例:
- hosts: aws_instance.jenkins-agents
roles:
- ../roles/jenkins_agent
这为您提供了更大的重复使用灵活性。
不想为角色使用相对路径,可以在运行Ansible命令的根目录中的
roles_path
中覆盖ansible.cfg
。#2 楼
由于我尚无法评论030的答案(刚刚开设了一个帐户),因此我将在此处回答。组vars目录是相对于Ansible路径的。
您不必从/ etc / ansible运行Ansible。如果愿意,可以从〜/ .hidden / directory / stuff运行它。只要确保保持目录结构即可。即:
/pipeline/ # ansible playbooks are here
/pipeline/roles
/pipeline/group_vars
然后您可以运行类似的命令
cd /pipeline
ansible-playbook deploy_app.yml
这将从管道中读取组变量/ group_vars文件夹。最好先CD到您的ansible根文件夹,因为如果它无法在默认位置(/ etc / ansible)中找到它们,则会从您当前所在的文件夹中查找路径,这样就可以将ansible.cfg放在/管道,而不必指定其他命令行参数。您还可以选择在ansible.cfg中定义特定的路径。
您可以更进一步,为每个环境/位置/ etc分别设置组var:
/pipeline/prod/group_vars/all.yml
/pipeline/dev/group_vars/all.yml
并使用include-vars如下运行。
ansible-playbook deploy_app.yml -i prod
评论
我建议按组对变量进行排序,唯一的事情是,如果将清单放入子目录中,则应将符号链接到group_vars和hosts_vars放入清单子目录中。
–吉里·克劳达(Jiri Klouda)
17年6月19日在9:05
#3 楼
为避免此类问题,这就是为什么Ansible中有主机和组。/etc/ansible/group_vars/raleigh # can optionally end in '.yml', '.yaml', or '.json'
/etc/ansible/group_vars/webservers
/etc/ansible/host_vars/foosball
评论
这没有回答我的问题,但是让每个组说一个值是一个有趣的主意。我们拥有的变量主要与特定群体有关。只是/ etc变体对我们不起作用。我希望它能够从项目中挑选他们。
– MailoSvětel
17年6月17日在15:06
它不必驻留在etc文件夹中。如果主机和组vars dirs位于ansible目录中,则它将起作用
– 030
17年6月19日在8:07
#4 楼
Ansible通常根据inventory_dir
和playbook_dir
采取相对路径: - debug: var=inventory_dir
- debug: var=playbook_dir
评论
也许您可以为相对部分../../../vars使用变量?