Ansible主机变量在file模块content参数中失效问题求助
Ansible Playbook创建文件内容为空的问题分析与解决
问题场景
Inventory文件内容
[all] 1.1.1.1 var1=vaule1 app_var2=vaule2 2.2.2.2 var1=vaule3 app_var2=vaule4
编写的Playbook任务
- name: "Creating file_with content" ansible.builtin.file: path: "path-tofile/.test.txt" state: touch content: "app_env=hostvars[inventory_hostname]['var1']" register: app_env_status
问题
文件已成功创建,但内容为空,询问变量访问方式或任务是否存在问题。
问题原因与解决方法
核心问题
ansible.builtin.file模块的state: touch参数不支持content字段。当设置state: touch时,模块仅负责创建文件(若不存在)或更新文件的修改时间,完全不会处理content参数,因此文件内容为空。
修正方案
方案一:改用copy模块(推荐)
直接使用ansible.builtin.copy模块完成“文件不存在则创建+写入内容”的需求,该模块原生支持内容写入,且可通过参数控制是否覆盖已有文件:
- name: Create file with content ansible.builtin.copy: dest: "path-tofile/.test.txt" content: "app_env={{ var1 }}" force: no # 仅当文件不存在时创建,避免覆盖已有内容 register: app_env_status
- 变量访问简化:当前场景下直接用
{{ var1 }}即可获取主机变量,无需通过hostvars[inventory_hostname]['var1'](仅跨主机引用变量时才需要后者)。 force: no确保仅在文件不存在时执行创建和写入操作,符合需求。
方案二:分两步执行
先通过file模块确保文件存在,再通过lineinfile模块写入内容:
- name: Ensure file exists ansible.builtin.file: path: "path-tofile/.test.txt" state: touch register: file_created - name: Write content to new file ansible.builtin.lineinfile: path: "path-tofile/.test.txt" line: "app_env={{ var1 }}" state: present insertbefore: BOF when: file_created.changed
- 第二步通过
when条件判断,仅在文件刚被创建时写入内容,避免重复写入。
补充说明
原写法中的hostvars[inventory_hostname]['var1']语法本身无误,但即使修正为"app_env={{ hostvars[inventory_hostname]['var1'] }}",由于file模块的touch模式不处理content参数,依然无法写入内容。
内容的提问来源于stack exchange,提问作者GoneCase123
相关产品推荐
相关产品推荐

