我们希望在 Ansible 中运行 Docker 1.12 的主机上执行与 Docker 1.10 不同的操作。
我如何获取我的库存中指定的 Docker 版本,以便以后可以说……
- 获取在环境测试中运行 Docker 1.10 的所有主机并运行此 Ansible 剧本。
我不知道这是否有关系,但我们主要使用在虚拟机上安装了 CoreOS 或 CentOS 的 VMware。
答案1
这是一个你可以做你想做的事情的例子:
---
- 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"
您获取 docker 版本并将其存储在变量中。然后,在正确设置条件下,您可以执行所需的任务。测试剧本的输出为:
[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
我有 docker 1.13.0。剧本在我的 Mac 上运行,但它也可以在 CentOS 上运行。根据您可能需要使用的权限sudo
。示例中的 Ansible 版本是 2.2.1.0,但它也可以在较低版本上运行。
您可以针对您的清单运行类似的剧本,并echo $HOSTNAME
针对具有所需 docker 版本的所有主机执行此操作 - 这样您就可以收集所需的信息。当然,您可以使用 grep 省略输出。
答案2
这是我选择的方法:
- 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
希望能帮助到你!
答案3
本地事实可能是一个选择:
在目标系统上创建一个文件,/etc/ansible/facts.d/apps.fact
内容如下:
[docker]
version=1.13.0
该变量应该在 Ansible 中可用,如下所示{{ ansible_local.apps.docker.version }}
您可能想要使用安装 docker 的角色来更新事实文件。