如何在动态清单和/或 Ansible 事实中获取主机的 docker 版本?

如何在动态清单和/或 Ansible 事实中获取主机的 docker 版本?

我们希望在 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 的角色来更新事实文件。

相关内容