Ansible - 同时复制和编辑远程文件?

Ansible - 同时复制和编辑远程文件?

在 Ansible 角色中,我正在寻找一种将远程文件复制到其他位置的方法,同时替换文件的前两行。

我愿意尝试其他方法,但我的解决方案涉及使用 slurp 来检索文件,以某种方式将其转换为单独行的列表,然后使用模板将其写回。

我陷入了将 slurp 返回的字符串分割成行这一步。

Ansible 2.9,控制器和远程主机都运行 RHEL 7.8。

输入文件已在远程主机上,为 /etc/sample/inputfile.txt

Line1 something
Line2 something
Line3 stays untouched
Line4 stays untouched

/etc/sample/outputfile.txt 中所需的输出

Line1 has changed
Line2 has also changed
Line3 stays untouched
Line4 stays untouched

我想要复制的效果是以下序列会产生的效果,但幂等性,无需在每次运行时对 outputfile.txt 进行三处更改。

- copy:
    src: /etc/sample/inputfile.txt
    dest: /etc/sample/outputfile.txt
    remote_src: True

- lineinfile:
    path: /etc/sample/outputfile.txt
    regexp: '^Line1'
    line: 'Line1 has changed'

- lineinfile:
    path: /etc/sample/outputfile.txt
    regexp: '^Line2'
    line: 'Line2 has also changed'

为了使其幂等,我目前的想法是使用 slurp 来检索 inputfile.txt,然后(以某种方式)删除该变量的前两行,并使用模板创建 outputfile.txt。

- slurp:
    src: /etc/sample/inputfile.txt
  register: r_input
- set_fact:
    intermediate_var: '{{ r_input.content | b64decode }}'
- ??? How would I convert intermediate_var into a list of lines?
- template:
  vars:
    line1: 'Line1 has changed'
    line2: 'Line2 has also changed'
    body:  '??? intermediate_var without the first two lines'

但是,我还没有想出从 slurped 变量中删除前两行的方法。我知道查找插件“lines”,但还没有想出如何在这个场景中应用它。

答案1

答案比我想象的要简单。

- name: Retrieve service.txt file
  become: True
  shell: "cat /etc/sample/inputfile.txt"
  register: r_inputfile
  changed_when: False

这将使我在 r_inputfile.stdout_lines 变量中将文件很好地分成几行。

我仍在寻求改进,因为我尽量避免使用 shell 模块。

相关内容