我已经有一堆剧本,所以我开始在剧本目录中整理它们。导致必须存在指向vars文件的相对路径。

实际的剧本:

---
- hosts:  aws_instance.jenkins-agents
  user:   ec2-user
  vars_files:
    - ../../../vars/main.yaml
    - ../../../vars/vault.yaml
  ...


是否有任何方法可以保留dir结构,但是避免使用lochness家族(../../../)?

我知道角色的位置您可以指定角色的路径,但是我找不到与vars_files类似的项目

项目条件:


我们需要从项目的根目录运行剧本
vars和playbooks dir都位于项目的根目录中
该项目没有静态清单/主机,但是当您运行一些剧本时会即时生成


评论

也许您可以为相对部分../../../vars使用变量?

#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_dirplaybook_dir采取相对路径:
 - debug: var=inventory_dir
- debug: var=playbook_dir