Ansible如何在角色变量文件中按条件设置变量并配置默认值
问题解答
完全可以实现你的需求,以下是具体实现方案:
方案1:推荐使用字典映射(维护更便捷)
步骤1:设置version默认值
在kernel/defaults/main.yml中添加如下配置,设置version的默认值为4.3:
--- version: "4.3"
注意:默认变量要放在
defaults/main.yml而非vars/main.yml中,前者的变量优先级最低,支持被调用角色时传入的参数覆盖,符合你的需求。
步骤2:在vars/main.yml中配置版本映射
在kernel/vars/main.yml中定义版本对应关系的字典,再直接通过传入的version取值即可:
--- # 定义所有版本的配置映射 kernel_version_map: '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" '4.2': kernel_dir: "/mnt/public/kernel/4.2" kernel_headers: "linux-headers-4.2.deb" kernel_image: "linux-image-4.2.deb" kernel_libc: "linux-libc-dev_4.2.deb" kernel_version: "Ubuntu, with Linux 4.2" # 按传入的version匹配对应配置 kernel_dir: "{{ kernel_version_map[version].kernel_dir }}" kernel_headers: "{{ kernel_version_map[version].kernel_headers }}" kernel_image: "{{ kernel_version_map[version].kernel_image }}" kernel_libc: "{{ kernel_version_map[version].kernel_libc }}" kernel_version: "{{ kernel_version_map[version].kernel_version }}"
后续新增内核版本时,只需要在kernel_version_map中新增对应的键值对即可,不需要修改其他逻辑。
方案2:条件判断写法(符合你示例的逻辑)
如果你更倾向于写明确的条件判断,也可以在kernel/vars/main.yml中直接使用Jinja2的条件表达式实现:
--- kernel_dir: "{% if version == '4.3' %}/mnt/public/kernel/4.3{% elif version == '4.2' %}/mnt/public/kernel/4.2{% else %}/mnt/public/kernel/4.3{% endif %}" kernel_headers: "{% if version == '4.3' %}linux-headers-4.3.deb{% elif version == '4.2' %}linux-headers-4.2.deb{% else %}linux-headers-4.3.deb{% endif %}" # 其余变量按相同规则编写即可
该方案的缺点是每个变量都要重复写判断逻辑,新增版本时修改成本较高,更推荐方案1。
内容的提问来源于stack exchange,提问作者jessefournier
相关产品推荐
相关产品推荐

