是否可以创建一个与库存主机或组相关联的Ansible库存变量,但是运行该游戏手册的服务器层?我有一个Ansible角色,使用APT安装libffi-dev软件包,但我可能想在每个服务器层上安装该软件包的不同版本。我创建了一个变量" libffi-dev_ver"为了这个目的。我还有库存文件"开发"," staging"和" production"对应于我的每一层。
我的角色主要任务是从我的主site.yml playbook调用,在运行角色之前检查版本变量是否存在:
# 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中声明这样的包版本控制变量的正确方法是什么?变量的值取决于服务器层,它向我指示它进入库存文件,因为库存文件是服务器层特定的。但是所有库存变量似乎都必须与主机或组相关联。我已经做到了,但角色仍然没有看到变量。我可以向检测服务器层的角色添加一个任务,并使用&#34;当&#34;有条件地相应地设置变量,但该解决方案似乎很难看,因为如果您在角色中安装多个包,则每个包版本变量需要三个条件。我查看了Ansible文档并阅读了许多关于设置多层剧本的博客文章,但我没有看到这种特殊情况。宣布像这样的特定于层的变量的正确方法是什么?
答案 0 :(得分:3)
问题是变量&#39; libffi-dev_ver&#39;我宣称实际上是一个必须遵守Python 2.x命名规则的Jinja2 identifier。 &#39; - &#39; (破折号)是根据这些规则的无效字符。一旦我把它改成了&#39; _&#39; (下划线),我不再有错误。
另外,check_vars.yml playbook实际上是不必要的。有一个Ansible配置变量error_on_undefined_vars,它将导致包含未定义变量的步骤失败。由于默认情况下它是正确的,因此我不需要运行check_vars.yml,因为所有变量都已被检查。
声明服务器层特定变量的一个地方似乎位于group_vars目录中的文件中,该文件与在库存文件中以该层命名的组具有相同的名称。所以在我的情况下我的发展&#39;库存文件包含一个&#39; dev&#39;儿童组。该组包含我要安装libffi-dev软件包的Web服务器。因此,我创建了一个文件&#39; group_vars / dev&#39;并在该文件中声明了一个名为&#39; libffi_dev_ver&#39;的变量。我可以在我的misc_libs.yml剧本中引用。
答案 1 :(得分:0)
我没有得到你想要完成的事情。为什么:
# 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
when: libffi-dev_ver is defined
还不够吗?