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_vars
个 localhost
和 production
的文件。你熟悉那个 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:
- ...
如果未定义 hostname
或 volumes
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:
- ...
我正在使用 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_vars
个 localhost
和 production
的文件。你熟悉那个 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:
- ...
如果未定义 hostname
或 volumes
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:
- ...