我使用Ansible将我的容器部署到生产环境。在开发过程中,我想让Ansible在我的localhost而不是生产服务器上部署所有容器。
生产服务器在Ubuntu上运行,localhost是OS X,带有boot2docker。
我有2个库存文件,生产和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
,只有在使用localhost库存时才需要;同样,我只想在使用生产库存文件时设置卷。
对Ansible来说很新 - 似乎我没有以正确的方式接近这个,这样做更容易吗?我想避免创建完全独立的任务来本地部署;我只需要一种方法来有条理地定义音量和tls_hostname
(否则保留默认设置)
答案 0 :(得分:5)
从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:
- ...
答案 1 :(得分:2)
我发现您有group_vars
和localhost
的{{1}}个文件。你熟悉concept吗?因为我认为这是你正在寻找的。 p>
如果主机属于相应的组,则将应用production
部分中定义的变量。
我需要有条件地设置
group_vars
,只有在使用localhost库存时才需要;同样,我只想在使用生产清单文件时设置卷。
所以听起来你想在tls_hostname
和tls_hostname
中的./group_vars/localhost
定义volume
。
(并保留默认设置)
默认值可以存储在多个位置。如果您有角色,则可以存储在./group_vars/production
中。 <role>/defaults/main.yml
也是可能的。您也可以在yml中设置默认值。
group_vars/all
如果未定义- 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
,则Ansible将回退到定义的默认值。