我有一个角色叫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 }}"