Мы хотели бы делать разные вещи на хостах, на которых работает 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
Надеюсь, поможет!