Ansible - 根据 docker 模块中的清单文件有条件地设置卷和 tls 主机名

Ansible - Conditionally set volume and tls hostname based on inventory file in docker module

我正在使用 Ansible 将我的容器部署到生产环境中。在开发过程中,我想让 Ansible 将所有容器部署在我的本地主机上,而不是生产服务器上。

生产服务器 运行 Ubuntu,本地主机是 OS X 和 boot2docker。

我有 2 个库存文件,production 和 localhost。我的目录结构如下所示:

.
|--inventories
|  |localhost
|  |production
|
|--group_vars
|  |all
|  |localhost
|  |production
|
|--roles
|  |--web
|     |--tasks
         |main.yml
|
|web.yml 

web.yml 只是定义主机组并分配 web 角色。

/roles/web/tasks/main.yml 看起来像这样:

- name: Run web container
  docker:
    name: web
    image: some/image
    state: reloaded
    ...
    tls_hostname: boot2docker
    volumes:
      - "/data/db:/data/db"
    env:
      ...
  tags:
    - ...

我需要有条件地设置tls_hostname,仅当使用本地主机清单时;同样,我只想在使用生产库存文件时设置音量。

Ansible 的新手 - 似乎我没有以正确的方式处理这个问题,有更简单的方法吗?我想避免创建完全独立的任务以在本地部署;我只需要一种有条件地定义音量和 tls_hostname 的方法(否则将其保留为默认设置)

我看到您确实有 group_varslocalhostproduction 的文件。你熟悉那个 concept 吗?因为我认为这就是您要找的东西。

如果主机属于相应的组,将应用 group_vars 部分中定义的变量。

I need to set tls_hostname conditionally, only if the localhost inventory was used; likewise, I want to set the volume only if the production inventory file was used.

听起来你想在 ./group_vars/localhost 中定义 tls_hostname 并在 ./group_vars/production 中定义 volume

(and leave it at default setting otherwise)

默认值可以存储在几个地方。如果您有角色,您可以存储在 <role>/defaults/main.yml 中。 group_vars/all也是可以的。您也可以在 yml 中设置默认值。

- name: Run web container
  docker:
    name: web
    image: some/image
    state: reloaded
    ...
    tls_hostname: "{{ hostname | default('some default value') }}"
    volumes: "{{ volumes | default(['/data/db:/data/db']) }}"
    env:
      ...
  tags:
    - ...

如果未定义 hostnamevolumes Ansible 将回退到定义的默认值。

从 Ansible 1.8 开始,您可以使用具有特殊 omit 值的默认过滤器来省略变量和模块参数。例如,

- name: Run web container
  docker:
    name: web
    image: some/image
    state: reloaded
    ...
    tls_hostname: "{{ hostname | default('some default value') }}"
    volumes: "{{ volumes | default(omit) }}"
    env:
      ...
  tags:
    - ...