多环境部署

时间:2017-12-12 19:57:03

标签: ansible ansible-2.x

我知道您可以使用-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:指令包含库存标题中指定的主机时使用这些变量。

但是,由于我通过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 playbook,我希望得到如下内容:

ansible-playbook /path/to/some/playbook.yml --include-vars /etc/ansible/project/dev/vars.yml

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

1 个答案:

答案 0 :(得分:2)

您可以使用:

extra vars<%= f.collection_radio_buttons :category, [[1,"Joke "],[2,"Gossip "],[3,"option3 "],[4,"option4 "]], :first, :last %> @

include_vars

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

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