如何在 Ansible 中将文件内容复制到另一个文件而不覆盖第二个文件

问题描述 投票:0回答:1

我有一个名为

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

有人可以帮我吗?

ansible
1个回答
6
投票

那么你就不想复制该文件了。您想要将

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
© www.soinside.com 2019 - 2024. All rights reserved.