Ansible变量文件中能否引用自身定义的变量?
Ansible同vars文件内引用自身变量的解决方法
当你用ansible.builtin.include_vars的name参数把整个vars文件加载到指定命名空间时,文件内定义的timestamp会被包裹在该命名空间下(比如示例里的users变量)。而在解析users.a_user.expires的{{timestamp.sep2023}}时,Ansible会在全局变量空间查找timestamp,此时它还未被暴露到全局,因此会触发“‘timestamp’ is undefined”的错误。
以下是几种可行的解决方法:
方案1:移除name参数,直接加载到全局变量
修改任务代码,去掉name参数后,timestamp和users都会成为全局变量,内部的变量引用就能正常解析:
tasks: - name: load user base ansible.builtin.include_vars: users.yml
方案2:用Jinja2的set提前定义变量
在vars文件开头用Jinja2的set指令预先定义变量,这样YAML解析前就能完成变量赋值,内部直接引用定义好的变量名即可:
--- # file vars/users.yml {% set sep2023_timestamp = 1693864800 %} # date --date=09/05/2023 +%s users: a_user: name: a_user passwd: $6$FF.DN/vbue.2i9/vla6h8xpZhx4L/dppBbnnCWN8hZ0 uid: 3007 comment: log receiver expires: '{{sep2023_timestamp}}'
这种方式下,依然可以保留include_vars的name参数,因为变量是Jinja提前处理的,不受命名空间限制。
方案3:拆分vars文件,分阶段加载
把timestamp单独放到一个独立的vars文件中,先加载这个文件,再加载包含用户配置的users.yml,此时users.yml里就能正常引用全局的timestamp变量:
vars/timestamps.yml内容:
--- timestamp: sep2023: 1693864800 # date --date=09/05/2023 +%s
- 任务代码:
tasks: - name: load timestamps ansible.builtin.include_vars: timestamps.yml - name: load user base ansible.builtin.include_vars: file: users.yml name: users
方案4:加载后用set_fact补全变量值
先把整个vars文件加载到users命名空间,再用set_fact指令修改expires字段,直接引用users.timestamp.sep2023的值:
tasks: - name: load user base ansible.builtin.include_vars: file: users.yml name: users - name: set user expire timestamp ansible.builtin.set_fact: users: "{{ users | combine({'a_user': {'expires': users.timestamp.sep2023}}, recursive=True) }}"
内容的提问来源于stack exchange,提问作者Jacquelin Ch
相关产品推荐
相关产品推荐

