运行';docker卷创建';和Ansible?

运行';docker卷创建';和Ansible?,docker,ansible,Docker,Ansible,我通过Ansible在Docker容器中部署了一个Rails应用程序。到目前为止,我的应用程序包括三个容器: Docker卷容器(使用Docker卷创建--name dbdata创建) Postgres容器(带有来自dbdata的volumes\u) Rails应用程序容器(链接到postgres容器) 我的deployplaybook正在工作,但我必须通过SSH在服务器上运行docker volume create命令。我希望通过Ansible实现这一点,这样我就可以在一个空容器上部署一个

我通过Ansible在Docker容器中部署了一个Rails应用程序。到目前为止,我的应用程序包括三个容器:

  • Docker卷容器(使用
    Docker卷创建--name dbdata
    创建)
  • Postgres容器(带有来自dbdata的
    volumes\u)
  • Rails应用程序容器(链接到postgres容器)
我的deployplaybook正在工作,但我必须通过SSH在服务器上运行
docker volume create
命令。我希望通过Ansible实现这一点,这样我就可以在一个空容器上部署一个新的应用程序实例


有没有办法通过Ansible运行
docker volume create
,或者有其他方法?我检查了Ansible Docker模块的文档,但看起来它们还不支持
卷创建
。除非我遗漏了什么?

这里有一个选项,使用
命令
模块

- hosts: localhost
  tasks:
    - name: check if myvolume exists
      command: docker volume inspect myvolume
      register: myvolume_exists
      failed_when: false

    - name: create myvolume
      command: docker volume create --name myvolume
      when: myvolume_exists|failed

我们首先使用
docker volume inspect
检查卷是否存在。我们将该任务的结果保存在变量
myvolume\u exists
中,然后仅在
inspect
任务失败时创建卷。

您现在可以使用
-v
参数从docker run的手册页创建命名卷:

如果提供名称,Docker将使用该名称创建命名卷

mariadb data
是docker自动创建的命名卷:

$ docker volume inspect mariadb-data
[
    {
        "Name": "mariadb-data",
        "Driver": "local",
        "Mountpoint": "/var/lib/docker/volumes/mariadb-data/_data",
        "Labels": null,
        "Scope": "local"
    }
]

您可以使用Ansible自己的模块管理docker卷。版本2.4中的新功能

示例:

- name: Create a volume
  docker_volume:
    name: volume_one

- name: Remove a volume
  docker_volume:
    name: volume_one
    state: absent

- name: Create a volume with options
  docker_volume:
    name: volume_two
    driver_options:
      type: btrfs
      device: /dev/sda2

Ansible可以使用
命令
shell
模块运行任意命令,因此任何可以在命令行上运行的命令都可以通过Ansible运行。是的,我想到了这一点,但不知道如何像Docker模块对容器所做的那样执行
state=present
。虽然如果使用相同的名称运行两次
docker volume create
,第二个卷将不会执行任何操作,因为该卷已经存在。六羟甲基三聚氰胺六甲醚!
- name: Create a volume
  docker_volume:
    name: volume_one

- name: Remove a volume
  docker_volume:
    name: volume_one
    state: absent

- name: Create a volume with options
  docker_volume:
    name: volume_two
    driver_options:
      type: btrfs
      device: /dev/sda2