是否可以创建一个不与清单主机或组关联但运行剧本的服务器层的 Ansible 清单变量?我有一个使用 APT 安装 libffi-dev 包的 Ansible 角色,但我可能想在每个服务器层上安装该包的不同版本。为此,我创建了一个变量“libffi-dev_ver”。我还有与我的每个层对应的库存文件“开发”、“暂存”和“生产”。
我的角色的主要任务(从我的主 site.yml 剧本调用)在运行角色之前检查版本变量是否存在:
# roles/misc_libs/tasks/main.yml
- include: check_vars.yml tags=misc_libs
- include: misc_libs.yml tags=misc_libs
check_vars.yml 检查以确保包版本变量存在:
# roles/misc_libs_tasks/check_vars.yml
- name: check that required role variables are set
fail: msg="{{ item }} is not defined"
when: not {{ item }}
with_items:
- libffi-dev_ver
misc_libs 角色实际上使用该变量来安装包:
# roles/misc_libs/tasks/misc_libs.yml
- name: install libffi-dev
apt: >
pkg=libffi-dev={{ libffi-dev_ver }}
update_cache=yes
cache_valid_time=3600
become: True
我的开发清单文件如下所示:
# development
[webservers]
web01.example.com ansible_ssh_host=<ip_address>
[dev:children]
webservers
[webservers:vars]
libffi-dev_ver="3.1-2+b2"
当我运行这个命令时:
ansible-playbook -i development site.yml -l webservers
我收到这个 Ansible 错误:
fatal: [web01.example.com] => error while evaluating conditional: not libffi-dev_ver
在 Ansible 中声明这样的包版本控制变量的正确方法是什么?该变量的值取决于服务器层,这向我表明它位于库存文件中,因为库存文件是特定于服务器层的。但是所有库存变量似乎都必须与主机或组相关联。我已经这样做了,但角色仍然看不到变量。我可以向角色添加一个任务来检测服务器层并使用“何时”条件来相应地设置变量,但该解决方案看起来很难看,因为如果您在一个角色中安装多个包,则每个角色都需要三个条件包版本变量。我查看了 Ansible 文档并阅读了许多关于设置多层剧本的博客文章,但我没有看到这种特殊情况得到解决。