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

在ansible中查找docker卷列表的卷装入点,ansible,docker-volume,ansible-facts,Ansible,Docker Volume,Ansible Facts,不幸的是,目前没有允许我们使用docker卷的API。目前,如果我需要将数据复制到docker卷(注意:不是docker容器),我必须首先确保某些容器可以访问该卷,然后使用ansible运行docker cp。但对于这类任务,甚至可能没有安装卷的docker容器。这不是幂等的。这不允许ansible的绝大多数令人敬畏的API。这增加了许多额外的步骤,使过程复杂化。这不是可行的办法。如果我们只需找到感兴趣的每个卷的装入点,然后直接与主机的文件系统进行ansible对话,会怎么样 假设我们有一些将要

不幸的是,目前没有允许我们使用docker卷的API。目前,如果我需要将数据复制到docker卷(注意:不是docker容器),我必须首先确保某些容器可以访问该卷,然后使用ansible运行
docker cp
。但对于这类任务,甚至可能没有安装卷的docker容器。这不是幂等的。这不允许ansible的绝大多数令人敬畏的API。这增加了许多额外的步骤,使过程复杂化。这不是可行的办法。如果我们只需找到感兴趣的每个卷的装入点,然后直接与主机的文件系统进行ansible对话,会怎么样

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

- name: Get docker volume information
  command: "docker volume inspect {{ item }}"
  register: output
  with_items: "{{ volumes }}"
注意:命令返回如下内容:

 [
    {
        "Name": "docker_sites-enabled",
        "Driver": "local",
        "Mountpoint": "/var/lib/docker/volumes/docker_sites-enabled/_data",
        "Labels": null,
        "Scope": "local"
    }
]
- 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']
剧本继续:

- 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 }}"

然而,由于ansible报告错误
变量名“”无效。变量必须以字母或下划线字符开头,并且只包含字母、数字和下划线。
这可能是因为我使用的JSON查询筛选器的语法,但我找不到任何关于如何使用它的文档。

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

您可以这样做:

 [
    {
        "Name": "docker_sites-enabled",
        "Driver": "local",
        "Mountpoint": "/var/lib/docker/volumes/docker_sites-enabled/_data",
        "Labels": null,
        "Scope": "local"
    }
]
- 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
是一个dict,因此我们可以访问
mountpoints['vol2']
来访问
vol2
的挂载点。

而不是“类似这样的东西”,您能准确显示
输出
变量中的内容吗?您知道如何使用
调试
模块…还有
的值是多少?哪项任务失败了?您包括了
以下事实现在已经设置好了
——我是否应该假设这就是给出错误的事实?如果前一个失败了,那么将最后一个包含在问题中的目的是什么?是的,严格来说变量不需要是根级别的。谢谢你的回复!