Ansible:指定目录存在时赋值变量,否则赋默认值
无需stat模块实现目录存在判断的变量赋值
方案1:利用Shell Lookup(目标节点执行判断)
通过目标节点内置的test命令判断目录是否存在,无需依赖任何额外模块,适配绝大多数类Unix系统:
# java java_root: "{{ root_dir }}/java" JAVA_HOME: >- {{ (lookup('shell', 'test -d "' ~ java_root ~ '/jdk-x.0" && echo 1 || echo 0') | trim == '1') | ternary(java_root ~ '/jdk-x.0', java_root ~ '/jdk-default.version') }}
说明:
lookup('shell', ...):在目标节点执行指定shell命令,返回命令输出test -d "路径":shell内置命令,判断目录是否存在,存在则返回成功状态trim == '1':去除输出换行符后判断结果,目录存在则输出1,否则输出0ternary(值1, 值2):Ansible内置过滤器,条件为真时返回值1,否则返回值2
方案2:利用Fileglob Lookup(控制节点执行判断)
如果控制节点与目标节点文件系统一致(比如本地执行Ansible),可以用fileglob查找匹配目录:
# java java_root: "{{ root_dir }}/java" JAVA_HOME: >- {{ (lookup('fileglob', java_root ~ '/jdk-x.0', wantlist=True) | length > 0) | ternary(java_root ~ '/jdk-x.0', java_root ~ '/jdk-default.version') }}
说明:
lookup('fileglob', ..., wantlist=True):在控制节点查找匹配路径,返回列表形式结果length > 0:判断列表是否非空,非空则说明目录存在- 注意:此方法仅适用于控制节点能直接访问目标节点目录的场景(如本地部署、共享文件系统)
扩展:动态匹配最新JDK版本
如果新版本JDK目录是jdk-17.0、jdk-11.0这类格式,可自动匹配最新版本:
JAVA_HOME: >- {{ (lookup('shell', 'ls -d "' ~ java_root ~ '/jdk-[0-9]*.0" 2>/dev/null | sort -V | tail -n1') | trim != '') | ternary(lookup('shell', 'ls -d "' ~ java_root ~ '/jdk-[0-9]*.0" 2>/dev/null | sort -V | tail -n1'), java_root ~ '/jdk-default.version') }}
该命令会列出所有匹配jdk-x.0的目录,按版本号排序后取最后一个(最新版本),无匹配结果则使用默认值。
内容的提问来源于stack exchange,提问作者Raymond Chenon
相关产品推荐
相关产品推荐

