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

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

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

  • Извлеките все хосты, которые запускают Docker 1.10 в тестировании среды, и запустите этот сборник пьес Ansible.

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

2 ответа

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

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

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

[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, В этом примере возможной версией является 2.2.1.0, но она будет работать и на более низких версиях.

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

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

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

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

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

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

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

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

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

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

[docker]
version=1.13.0

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

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

Другие вопросы по тегам