Поиск точек монтирования томов для списка томов докеров в анзибле

К сожалению, в настоящее время нет API, который позволил бы нам работать с томами докеров. На данный момент, если мне нужно скопировать данные в том докера (примечание: не в контейнер), я должен сначала убедиться, что какой-то контейнер может получить доступ к тому, а затем использовать ansible для запуска docker cp. Но для такого рода задач может не быть даже докер-контейнеров с смонтированным томом. Это не идемпотент. Это запрещает подавляющее большинство замечательных API ansible. Это усложняет процесс, добавляя множество дополнительных шагов. Это не доступный способ. Что, если бы мы могли просто найти точки монтирования для каждого интересующего нас тома, а затем напрямую разговаривать с файловой системой хоста?

Итак, допустим, у нас есть список имен некоторых томов докеров, которые мы будем использовать. Для каждого элемента в списке мы хотели бы проверить его с помощью демона docker, а затем использовать ansible, чтобы установить факт о его точке монтирования. Вот что у меня есть на данный момент:

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

NB: Команда возвращает что-то вроде этого:

 [
    {
        "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, но я не могу найти никакой документации о том, как я должен использовать его.


person DMCoding    schedule 07.02.2017    source источник
comment
Можно ли вместо чего-то вроде этого показать точно, что находится в переменной output? Вы умеете пользоваться debug модулем ...   -  person techraf    schedule 07.02.2017
comment
И каково значение volumes? И какая задача не удается? Вы включили The following facts are now set - я предполагаю, что это тот, который дает ошибку? Если предыдущий не прошел, с какой целью был включен последний в вопрос?   -  person techraf    schedule 07.02.2017


Ответы (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 - это dict, поэтому мы можем получить доступ к mountpoints['vol2'] для доступа к точке монтирования vol2.

person Konstantin Suvorov    schedule 07.02.2017
comment
Да, строго говоря, не обязательно, чтобы переменные были корневого уровня. Спасибо за ответ! - person DMCoding; 07.02.2017