Ansible 版本强制

标签 ansible

我们有多个版本的 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 版本被认为是最佳实践。

有几件事需要保证:

  1. 这些检查应该保留 --tags 选项。
  2. 这些检查应该保留 --limit
  3. 这些检查应该相对较快,并尽可能减少冗长。

我当前的解决方案是:

  1. 创建剧本version_check.yaml
  2. - 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

如您所见,这里有很多内容。

  1. run_once 每次 Ansible 运行都会执行一次此操作。
  2. gather_facts: false 加快速度。
  3. 它被分配给“all, localhost”,基本上保证它位于 Ansible 运行列表中,无论任何 --limit
  4. 它有标签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_compareversion 更好,但如果您确定它至少是 2.5+,您可以使用更新的 version 语法。

关于Ansible 版本强制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58930469/

相关文章:

windows - 如何使用 Ansible 对 Windows Docker Windows 容器内运行的 Spring Boot 应用程序进行运行状况检查?

git - 使用 Ansible 进行 SSH 代理转发

scope - 在以 playbook 为目标的 ansible 主机中使用变量

docker - Ansible Docker 容器 - 克隆私有(private)仓库

amazon-web-services - 从ansible中注册的变量中检索键的值

ios - Mac 中 Ansible 的库在哪里

ansible - 避免 Ansible 任务列表中多个命令的重复

loops - 如何在 Ansible 中获取子组列表?

testing - 为什么我们不能只使用 Ansible 而不是 Chef inspect?

mysql_user 与 priv 的问题