如何用Ansible Playbook将远程文件内容追加到本地文件?
实现远程文件内容追加到本地文件的Ansible方案
Ansible的fetch模块无法直接实现将远程文件内容追加到本地文件的需求——它的核心作用是把远程文件完整复制到本地的主机专属目录结构中,不支持追加写入操作。要达成你想要的效果,可以用以下两种可靠方案:
方案一:用slurp读取内容后追加(推荐,纯原生模块)
通过slurp读取远程文件的Base64编码内容,解码后用模块追加到本地文件:
- name: 读取远程临时文件内容 ansible.builtin.slurp: src: /tmp/somefile.txt register: remote_file_data - name: 解码远程文件内容 ansible.builtin.set_fact: file_content: "{{ remote_file_data.content | b64decode }}" - name: 将内容追加到本地文件(不存在则自动创建) ansible.builtin.lineinfile: path: /tmp/fetched.txt line: "{{ file_content }}" insertafter: EOF create: yes delegate_to: localhost
若远程文件是多行内容,
lineinfile会把整个内容作为单行写入。要保留原文件换行格式,可改用shell模块执行追加命令:- name: 追加多行内容到本地文件 ansible.builtin.shell: 'printf "%s" "{{ file_content }}" >> /tmp/fetched.txt' delegate_to: localhost args: warn: no
方案二:临时fetch后追加再清理
先通过fetch把远程文件复制到本地临时目录,用shell命令追加到目标文件后清理临时文件:
- name: 临时复制远程文件到本地临时目录 ansible.builtin.fetch: src: /tmp/somefile.txt dest: /tmp/temp_ansible_fetched/ flat: yes # 禁用主机目录结构,直接复制文件到指定目录 - name: 将临时文件内容追加到目标文件 ansible.builtin.shell: 'cat /tmp/temp_ansible_fetched/somefile.txt >> /tmp/fetched.txt' delegate_to: localhost - name: 删除临时文件及目录 ansible.builtin.file: path: /tmp/temp_ansible_fetched state: absent delegate_to: localhost
内容的提问来源于stack exchange,提问作者a ekandem
相关产品推荐
相关产品推荐

