在 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 模块。