Как получить докер версию хоста в динамическом инвентаре и / или 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 }}
Возможно, вы захотите обновить файл фактов с ролью, используемой для установки докера.