多环境部署
Multiple environment deployment
我知道您可以使用 -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
的目录。看起来清单指向具有相同名称的配置,并且假定当播放的 hosts:
指令包含清单 header 中指定的主机时使用这些变量。
但是,由于我通过 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 通过 SSH 上的 CLI 启动 Ansible 剧本,所以我希望得到如下内容:
ansible-playbook /path/to/some/playbook.yml --include-vars /etc/ansible/project/dev/vars.yml
至少,我如何在剧本中明确包含一个 vars.yml
文件以使用其中定义的变量?
您可以使用:
extra vars 与 @
:--extra-vars @/etc/ansible/project/dev/vars.yml
或
- include_vars: "/etc/ansible/project/{{ some_env }}/vars.yml"
根据您的环境加载不同的变量。
我知道您可以使用 -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
的目录。看起来清单指向具有相同名称的配置,并且假定当播放的 hosts:
指令包含清单 header 中指定的主机时使用这些变量。
但是,由于我通过 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 通过 SSH 上的 CLI 启动 Ansible 剧本,所以我希望得到如下内容:
ansible-playbook /path/to/some/playbook.yml --include-vars /etc/ansible/project/dev/vars.yml
至少,我如何在剧本中明确包含一个 vars.yml
文件以使用其中定义的变量?
您可以使用:
extra vars 与 @
:--extra-vars @/etc/ansible/project/dev/vars.yml
或
- include_vars: "/etc/ansible/project/{{ some_env }}/vars.yml"
根据您的环境加载不同的变量。