Ansible -根据条件设置变量



我有一个角色叫kernel。在它的vars文件kernel/vars/main.yml中,是否可以根据条件设置变量的值?

例如,假设我有一个这样的剧本,它调用我的内核角色:

---
- hosts: webservers
roles:
- role: kernel
vars:
version: '4.3'

有可能在kernel/vars/main.yml中做这样的事情吗?:

---
if 'version' == '4.3':
kernel_dir:  "/mnt/public/kernel/4.3"
kernel_headers: "linux-headers-4.3.deb"
kernel_image: "linux-image-4.3.deb"
kernel_libc: "linux-libc-dev_4.3.deb"
kernel_version: "Ubuntu, with Linux 4.3"
if 'version' == '4.2':
kernel_dir: "/mnt/public/kernel/4.2"
kernel_headers: "linux-headers-4.2.deb"
.. and so on

另外,是否可以设置一个默认值,以便如果在没有version值的情况下调用角色,它将获得4,3的变量?

谢谢吧!

将这些选项放到单独的文件中,例如

shell> cat roles/kernel/vars/4.2.yml 
kernel_dir:  /mnt/public/kernel/4.2
kernel_headers: linux-headers-4.2.deb
shell> cat roles/kernel/vars/4.3.yml 
kernel_dir:  /mnt/public/kernel/4.3
kernel_headers: linux-headers-4.3.deb
然后通过版本包含变量,例如
shell> cat roles/kernel/tasks/main.yml
- include_vars: "{{ version }}.yml"
- debug:
var: kernel_dir

例如,剧本

shell> cat playbook.yml
- hosts: webservers
roles:
- role: kernel
vars:
version: '4.3'

ok: [webservers] => 
kernel_dir: /mnt/public/kernel/4.3
指出

  • 这些变量将按优先级18被包含。参见理解变量优先级

  • 不需要包含变量的路径。引用dir

如果路径是相对的,并且任务在角色中,它将查看角色的vars/子目录。

由于我过去有过类似的需求,所以我采用了以下方法

- name: Initialize VERSION
set_fact:
VERSION: "4.3"
when: VERSION == ''

由于变量已经初始化,所以不可能使用

kernel_dir: "/mnt/public/kernel/{{ VERSION }}"
kernel_headers: "linux-headers-{{ VERSION }}.deb"
kernel_image: "linux-image-{{ VERSION }}.deb"
kernel_libc: "linux-libc-dev_{{ VERSION }}.deb"
kernel_version: "Ubuntu, with Linux {{ VERSION }}"

最新更新