我们有多个版本的 ansible(2.3,2.3.0,2.8.6),我们想使用特定版本“2.8.6”。
但是每当 ansible 执行开始时,它都会使用不同的版本 2.4.2.0。如果我们检查 ansible --version 它是 ansible-playbook 2.4.2.0。
ansible 和 ansible-playbook 版本是否相同? 如何在ansible执行中强制执行某个版本?
请提供您的意见。
最佳答案
众所周知,Ansible 会巧妙地破坏变量、角色、包含和委托(delegate)的兼容性。因此,在执行任何操作之前在 playbook 中断言 Ansible 版本被认为是最佳实践。
有几件事需要保证:
- 这些检查应该保留 --tags 选项。
- 这些检查应该保留 --limit
- 这些检查应该相对较快,并尽可能减少冗长。
我当前的解决方案是:
- 创建剧本
version_check.yaml
- import_playbook: version_check.yaml
位于每个 playbook 的开头。 (每个,这很重要,相信我)。
version_check.yaml 内容(ansible 2.5+):
- hosts: all, localhost
gather_facts: false
run_once: true
tasks:
- name: Check ansible version
assert:
that:
- "ansible_version.full is version('2.8.0', '>=')"
- "ansible_version.full is version('2.9.0', '<')"
msg: >
Use Ansible to 2.8 to run this playbook
delegate_to: localhost
tags:
- always
如您所见,这里有很多内容。
- run_once 每次 Ansible 运行都会执行一次此操作。
- gather_facts: false 加快速度。
- 它被分配给“all, localhost”,基本上保证它位于 Ansible 运行列表中,无论任何
--limit
- 它有标签
always
,几乎保证在使用--tags
的情况下运行。这里唯一未被发现的漏洞是使用--skip always
(这很疯狂)。
有一个较旧的答案,其版本语法较旧(2.5 以下):
- hosts: all, localhost
gather_facts: false
run_once: true
tasks:
- name: Check ansible version
assert:
that:
- "ansible_version.full | version_compare('2.8.0', '>=')"
- "ansible_version.full | version_compare('2.9.0', '<')"
msg: >
Use Ansible to 2.8 to run this playbook
delegate_to: localhost
tags:
- always
很难说该使用哪个版本。如果您害怕非常旧的 ansible,version_compare
比 version
更好,但如果您确定它至少是 2.5+,您可以使用更新的 version
语法。
关于Ansible 版本强制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58930469/