Назад | Перейти на главную страницу

Как получить докер-версию хоста в динамическом инвентаре и / или фактах Ansible?

Мы хотели бы делать разные вещи на хостах, на которых работает Docker 1.12, чем на Docker 1.10 в Ansible.

Как мне получить версию Docker, указанную в моем инвентаре, чтобы потом я мог сказать ...

Не знаю, имеет ли это значение, но в основном мы используем VMware с установленными на виртуальных машинах CoreOS или CentOS.

Вот пример того, как вы могли бы делать то, что хотите:

---
 - hosts: localhost
   remote_user: test
   tasks:
     - name: get docker version
       shell: "docker -v | cut -d ' ' -f 3 | cut -d ',' -f 1"
       register: version

     - debug: var=version.stdout

     - name: do something if version is 1.13.0
       shell: "echo it is 1.13.0"
       when: version.stdout == "1.13.0"

     - name: do nothing if version is 1.13.0
       shell: "echo nothing"
       when: version.stdout != "1.13.0"

Вы получаете версию докера и сохраняете ее в переменной. Тогда при правильно заданных условиях вы сможете выполнять нужные вам задачи. Результат тестового сценария:

[me@mac]$ ansible-playbook test.yml
 [WARNING]: Host file not found: /etc/ansible/hosts

 [WARNING]: provided hosts list is empty, only localhost is available


PLAY [localhost] ***************************************************************

TASK [setup] *******************************************************************
ok: [localhost]

TASK [get docker version] ******************************************************
changed: [localhost]

TASK [debug] *******************************************************************
ok: [localhost] => {
    "version.stdout": "1.13.0"
}

TASK [do something if version is 1.13.0] ***************************************
changed: [localhost]

TASK [do nothing if version is 1.13.0] *****************************************
skipping: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=4    changed=2    unreachable=0    failed=0

У меня докер 1.13.0. Playbook был запущен на моем Mac, но он будет работать и на CentOS. В зависимости от разрешений вам может потребоваться использовать sudo. Версия Ansible в этом примере - 2.2.1.0, но она будет работать и с более ранними версиями.

Вы можете запустить аналогичный сценарий для своего инвентаря и сделать echo $HOSTNAME для всех хостов, на которых установлена ​​нужная версия докера - таким образом вы получите необходимую информацию. Конечно, вы можете опустить вывод с помощью grep.

local_facts может быть здесь вариант:

Создайте файл в целевых системах /etc/ansible/facts.d/apps.fact с содержанием:

[docker]
version=1.13.0

Переменная должна быть доступна в Ansible как {{ ansible_local.apps.docker.version }}

Возможно, вы захотите обновить файл фактов, указав роль, используемую для установки докера.

Я выбрал такой подход:

    - name: docker server version
      shell: "docker version --format '{{ '{{' }}.Server.Version{{ '}}' }}'" 
      register: docker_server_version
      changed_when: False

В --формат опция команды docker-version позволяет выбрать ключ json, в данном случае я хотел проверить версию сервера.

Проблема в том, что команда docker-version требует использования '{{' и '}}', чтобы вы могли их избежать, один из вариантов будет следующим:

'{{ '{{' }}.Server.Version{{ '}}' }}'

Это объясняется в документации jinja2: https://jinja.palletsprojects.com/en/master/templates/#escaping

Надеюсь, поможет!