我正在使用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
(并保留默认设置)
2 回答
从Ansible 1.8开始,您可以使用带有特殊omit值的默认过滤器来省略变量和模块参数 . 例如,
我看到你确实有
localhost
和production
的group_vars
文件 . 你熟悉concept吗?因为我认为这就是你要找的东西 .如果主机属于相应的组,则将应用
group_vars
部分中定义的变量 .所以听起来你想在
./group_vars/localhost
中定义tls_hostname
,在./group_vars/production
中定义volume
.默认值可以存储在多个位置 . 如果您有角色,可以存储在
<role>/defaults/main.yml
中 .group_vars/all
也是可能的 . 您也可以在yml中设置默认值 .如果未定义
hostname
或volumes
,则Ansible将回退到定义的默认值 .