首页 文章

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

提问于
浏览
4

我正在使用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 回答

  • 2

    从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:
        - ...
    
  • 5

    我看到你确实有 localhostproductiongroup_vars 文件 . 你熟悉concept吗?因为我认为这就是你要找的东西 .

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

    我需要有条件地设置tls_hostname,仅在使用localhost清单时;同样,我只想在使用 生产环境 库存文件时设置卷 .

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

    (并保留默认设置)

    默认值可以存储在多个位置 . 如果您有角色,可以存储在 <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将回退到定义的默认值 .

相关问题