我有一个名为
a.txt
的文件,其中包含以下内容:
123
456
986
231
456
我在
/etc/file2.txt
中有另一个文件,内容如下:
test values
some values
hello world how are you
我想将文件
a.txt
的内容复制到/etc/file2.txt
,所以我这样做了:
- name: Copy from a.txt to file2.txt
copy:
src: "a.txt"
dest: "/etc/file2.txt"
但是这覆盖并替换了file2.txt中的全部内容
但我希望它是这样的:
test values
some values
hello world how are you
123
456
986
231
456
有人可以帮我吗?
那么你就不想复制该文件了。您想要将
a.txt
的内容附加到 /etc/file2.txt
。
从上面的示例中,
a.txt
位于您的控制器上,而/etc/file2.txt
位于您的目标上。
第一个快速但肮脏的方法可以直接使用 shell 模块完成:
- name: Unconditionnaly append content of a.txt to /etc/file2.txt
ansible.builtin.shell: |-
echo "{{ lookup('file', 'a.txt') }}" >> /etc/file2.txt
现在这有点脏,并且总是会追加内容,即使这已经在之前完成了。 另一种可能的方法是使用
blockinfile
模块:
- name: Make sure a.txt content is present in /etc/file2.txt
ansible.builtin.blockinfile:
path: /etc/file2.txt
block: "{{ lookup('file', 'a.txt') }}"
这已经更好了,因为只有文件内容不存在或因为文件发生更改才会添加。同时,此方法将在文件中添加块标记,您应该确保它们符合您的要求(有关更多信息,请参阅文档)
我最喜欢的方法肯定是模板。保持
a.txt
文件不变,在控制器上创建一个文件 templates/file2.txt.j2
:
test values
some values
hello world how are you
{{ lookup('file', 'a.txt') }}
从那里你需要的是:
- name: Make sure `/etc/file2.txt` is aligned to our template
ansible.builtin.template:
src: file2.txt.j2
dest: /etc/file2.txt