2016-04-29 48 views
2

是否可以创建一个Ansible库存变量,该变量与库存主机或组没有关联,但该Playbook运行的服务器层是否可用?我有一个Ansible角色,使用APT安装libffi-dev软件包,但我可能想要在每个服务器层上安装该软件包的不同版本。我为此创建了一个变量“libffi-dev_ver”。我还拥有与我的每个层级相对应的库存文件“开发”,“分段”和“生产”。如何设置Ansible特定于库存的变量?

我的角色的主要任务,这是从我的主要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中的这样的包版本变量?变量的值取决于服务器层,它向我表明它已进入清单文件,因为清单文件是服务器层特定的。但是所有库存变量似乎都必须与主机或组相关联。我已经这样做了,但角色仍然没有看到变量。我可以将任务添加到检测服务器层的角色中,并使用“when”条件相应地设置变量,但该解决方案看起来很难看,因为如果要在角色中安装多个包,则每个角色需要三个条件包版本变量。我浏览了Ansible文档并阅读了很多关于设置多层剧本的博文,但我没有看到这种特殊的情况。什么是正确的方式来声明这样的层特定变量?

+0

我没有得到你想要完成的。为什么: #角色/ misc_libs /任务/ misc_libs.yml - 名称:安装libffi-dev的 贴切:> PKG = libffi-dev的= {{libffi-dev_ver}} update_cache = YES cache_valid_time = 3600 成为:真 何时:libffi-dev_ver被定义为 不够? –

回答

3

问题是我声明的变量'libffi-dev_ver'实际上是必须遵守Python 2.x命名规则的Jinja2 identifier。根据这些规则,' - '(破折号)是无效的字符。一旦我将它改为'_'(下划线),我就不会再犯这个错误了。

此外,check_vars.yml手册实际上是不必要的。 Ansible配置变量error_on_undefined_vars会导致包含未定义变量的步骤失败。由于默认情况下它是真的,所以我不需要运行check_vars.yml,因为所有变量都已被检查。

一个声明服务器层特定变量的位置似乎在group_vars目录中的文件中,该文件与清单文件中以该层命名的组名称相同。所以在我的情况下,我的'开发'库存文件包含一个'dev'子组。该组包含我想要安装libffi-dev软件包的Web服务器。因此,我创建了一个文件'group_vars/dev',并在该文件中声明了一个名为'libffi_dev_ver'的变量,我可以在我的misc_libs.yml手册中引用该变量。

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 

不够?

+0

我可以做到这一点,但这与我的问题无关。即使我按照你的建议去做,也没有找到。我有额外的check_vars.yml,在我使用with_items指令安装了一些软件包的情况下,我在我的代码中的其他地方安装了这些指令。这样更干净。 – William

+0

好吧,如果它有效的话; - )事实上,你的check_vars loks的语法对我来说,我希望你需要一个'eval'的道德等价物来做到这一点 - 无论jinja2是否已经得到它,我不知道。 –