查找ansible中docker卷列表的卷装入点

时间:2017-02-07 02:30:04

标签: ansible docker-volume ansible-facts

不幸的是,目前没有API可以让我们使用docker卷。目前,如果我需要将数据复制到docker卷(NB:不是docker 容器),我必须首先确保某个容器可以访问该卷,然后使用ansible运行{{1} }。但是对于这些类型的任务,甚至可能没有装有卷的docker容器。这不是幂等的。这不允许绝大多数ansible通常很棒的API。这通过添加许多额外步骤使该过程复杂化。这不是一种可行的方式。如果我们可以简单地找到我们感兴趣的每个卷的挂载点,然后直接与主机的文件系统进行协商,那该怎么办?

所以,假设我们有一些我们将要使用的docker卷的名称列表。对于列表中的每个项目,我们想使用docker守护程序检查它,然后使用ansible设置有关其mountpoint的事实。这就是我到目前为止所做的:

docker cp

注意:Command会返回如下内容:

- name: Get docker volume information
  command: "docker volume inspect {{ item }}"
  register: output
  with_items: "{{ volumes }}"

Playbook继续:

 [
    {
        "Name": "docker_sites-enabled",
        "Driver": "local",
        "Mountpoint": "/var/lib/docker/volumes/docker_sites-enabled/_data",
        "Labels": null,
        "Scope": "local"
    }
]

然而,这不起作用,因为我期望它作为ansible报告错误- name: Set volume facts set_fact: "{{ item.stdout|from_json|json_query('Name') }}": "{{ item.stdout|from_json|json_query('Mountpoint') }}" with_items: "{{ output.results }}" - name: The following facts are now set debug: var: "{{ item }}" with_items: - "{{ volumes }}" 这可能是因为我使用的JSON查询过滤器的语法,但我找不到任何关于如何我使用它。

1 个答案:

答案 0 :(得分:1)

不确定为什么要为每个卷生成根级变量。

你可以这样做:

- hosts: docker_host
  become: true
  gather_facts: false
  vars:
    volumes:
      - vol1
      - vol2
      - vol4
  tasks:
    - shell: docker volume inspect {{ volumes | join(' ') }}
      register: vlm_res

    - set_fact: mountpoints={{ dict(vlm_res.stdout | from_json | json_query('[].[Name,Mountpoint]')) }}

    - debug: var=mountpoints['vol2']

mountpoints是一个词典,因此我们可以访问mountpoints['vol2']来访问vol2的挂载点。