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

时间:2015-07-18 06:49:58

标签: docker ansible ansible-playbook boot2docker

我使用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 个答案:

答案 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_varslocalhost的{​​{1}}个文件。你熟悉concept吗?因为我认为这是你正在寻找的。

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

  

我需要有条件地设置group_vars,只有在使用localhost库存时才需要;同样,我只想在使用生产清单文件时设置卷。

所以听起来你想在tls_hostnametls_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将回退到定义的默认值。