在 ansible 中查找 docker 卷列表的卷安装点
Finding the volume mount points for a list of docker volumes in ansible
不幸的是,目前没有 API 可以让我们使用 docker 卷。目前,如果我需要将数据复制到 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 }}"
注意:命令 returns 是这样的:
[
{
"Name": "docker_sites-enabled",
"Driver": "local",
"Mountpoint": "/var/lib/docker/volumes/docker_sites-enabled/_data",
"Labels": null,
"Scope": "local"
}
]
剧本继续:
- 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 报告错误 "The variable name '' is not valid. Variables must start with a letter or underscore character, and contain only letters, numbers and underscores.
这可能是因为我正在使用的 JSON 查询过滤器的语法,但我可以'找不到任何关于我应该如何使用它的文档。
不确定为什么要为每个卷生成 root-level 个变量。
你可以这样做:
- 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
的挂载点。
不幸的是,目前没有 API 可以让我们使用 docker 卷。目前,如果我需要将数据复制到 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 }}"
注意:命令 returns 是这样的:
[
{
"Name": "docker_sites-enabled",
"Driver": "local",
"Mountpoint": "/var/lib/docker/volumes/docker_sites-enabled/_data",
"Labels": null,
"Scope": "local"
}
]
剧本继续:
- 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 报告错误 "The variable name '' is not valid. Variables must start with a letter or underscore character, and contain only letters, numbers and underscores.
这可能是因为我正在使用的 JSON 查询过滤器的语法,但我可以'找不到任何关于我应该如何使用它的文档。
不确定为什么要为每个卷生成 root-level 个变量。
你可以这样做:
- 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
的挂载点。