我知道您可以使用-i
标志在不同的清单文件之间切换,该标志可用于在不同的主机之间切换。
在我的示例中,要在不同部署之间执行操作的主机,因此我将主机作为--extra-vars
,并使用delegate_to
将其部署到该主机(有关更多详细信息,请参见下面的内容)。
我希望有一种方法能够以类似的方式在包含环境变量的文件之间切换。例如,假设我有以下简化的目录结构:
/etc/ansible/
├── ansible.cfg
├── hosts
└── project/
└── environments/
├── dev/
│ └── vars.yml
└── prd/
└── vars.yml
两个环境中的vars.yml
的结构是完全相同的,只是由于环境之间的差异,变量具有不同的值。
我找到了一些谈论类似的事情的地方,比如:
https://rock-it.pl/managing-multiple-environments-with-ansible-best-practices/
http://rosstuck.com/multistage-environments-with-ansible
http://www.geedew.com/setting-up-ansible-for-multiple-environment-deployments/
在这些指南中,它们针对静态声明的主机执行操作。有一件事似乎对我有帮助,那就是称为group_vars
的目录。看起来清单指向具有相同名称的配置,并假设当play的hosts:
指令包含清单头部中指定的主机时,会使用这些变量。
但是,由于我通过CLI标志--extra-vars
动态读取了我们正在操作的服务器,所以我不能采用这种方法,因为我在我的剧本中总是会有这样的东西:
...
hosts: localhost
tasks:
...
- name: do something
...
delegate_to: {{ item }}
with_items: {{ given_hosts }}
或者我首先运行一个任务,获取服务器并将其添加到新主机,如下所示:
- name: Extract Hosts
hosts: localhost
tasks:
- name: Adding given hosts to new group...
add_host:
name: "{{ item }}"
groups: some_group
with_items:
- "{{ list_of_hosts | default([]) }}"
然后使用动态创建的组:
- name: Restart Tomcat for Changes to Take Effect
hosts: some_group
tasks:
- name: Restarting Tomcat...
service:
name: tomcat
state: restarted
因此,我需要找到一种方法来指定要使用的vars.yml
。因为我使用Jenkins通过CLI over SSH启动Ansible攻略,所以我希望如下所示:
ansible-playbook /path/to/some/playbook.yml --include-vars /etc/ansible/project/dev/vars.yml
至少,我该如何在剧本中显式地包含一个vars.yml
文件,以使用其中定义的变量?
发布于 2017-12-13 14:14:53
您可以使用:
使用@
的extra vars:--extra-vars @/etc/ansible/project/dev/vars.yml
或
include_vars
- include_vars: "/etc/ansible/project/{{ some_env }}/vars.yml"
根据您的环境加载不同的变量。
https://stackoverflow.com/questions/47780583
复制相似问题