Ansible 多环境部署

Ansible 多环境部署,ansible,ansible-2.x,Ansible,Ansible 2.x,我知道您可以使用-I标志在不同的资源清册文件之间进行更改,该标志可用于在不同主机之间切换 在我的例子中,要处理的主机在部署之间会发生变化,因此我将主机作为--extra vars接收,并使用delegate_to部署到该主机(有关更多详细信息,请参见下文) 我希望有一种方法可以以类似的方式在包含环境变量的文件之间切换。例如,假设我有以下简化的目录结构: /etc/ansible/ ├── ansible.cfg ├── hosts └── project/ └── environment

我知道您可以使用
-I
标志在不同的资源清册文件之间进行更改,该标志可用于在不同主机之间切换

在我的例子中,要处理的主机在部署之间会发生变化,因此我将主机作为
--extra vars
接收,并使用
delegate_to
部署到该主机(有关更多详细信息,请参见下文)

我希望有一种方法可以以类似的方式在包含环境变量的文件之间切换。例如,假设我有以下简化的目录结构:

/etc/ansible/
├── ansible.cfg
├── hosts
└── project/
    └── environments/
        ├── dev/
        │   └── vars.yml
        └── prd/
            └── vars.yml
两种环境中
vars.yml
的结构完全相同,只是由于环境之间的差异,变量的值不同

我发现有几个地方谈论做类似的事情,比如:

在这些指南中,它们针对静态声明的主机进行操作。对我有帮助的似乎是名为
group\u vars
的目录。它看起来像是库存指向具有相同名称的配置,并且当播放的
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 playbook,所以我希望有如下内容:

ansible playbook/path/to/some/playbook.yml——包括vars/etc/ansible/project/dev/vars.yml

至少,我如何在剧本中明确包含
vars.yml
文件以使用其中定义的变量?

您可以使用:

使用
@
--extra-vars@/etc/ansible/project/dev/vars.yml

:


根据您的环境加载不同的变量。

感谢Konstantin,您总是有很好且简单的解决方案。对于读者:因为我已经在使用
--extra-vars
来获取输入,所以我只是在其中放了一个
环境
变量,所以当Jenkins使用
--extra-vars
调用
ansible playbook
命令时,它会注入用户给定的环境。然后,在我的第一个剧本中,我使用如上所示的
-include_vars
,以便在剧本的其余部分使用包含的变量。
- include_vars: "/etc/ansible/project/{{ some_env }}/vars.yml"