将源文件的内容附加到目标文件

Lia*_*amC 8 file ansible

我需要扫描/etc/fstab文件以查找条目,如果不存在,则将其他文件的内容附加到/etc/fstab.

我见过的Ansible模块似乎不允许将文件附加到另一个文件而只是添加一个特定的"文本"行.

yda*_*coR 6

lineinfile模块可如果你的使用情况进行简单地检查具体线路存在使用.

例如,如果要确保/dev/sdb1定义了分区并将其映射到/data并使用ext4文件系统,那么您可以使用:

lineinfile: dest=/etc/fstab regexp="^/dev/sdb1 " line="/dev/sdb1    /data    ext4    defaults    1  2"
Run Code Online (Sandbox Code Playgroud)

如果没有行开头/dev/sdb1那么它会将它添加到文件的末尾.有用的是,如果线的其余部分不匹配(例如,如果它被安装为ext3),那么它将把它改为提供的线.

如果你真的需要它来使用文件的全部内容,那么你可能可以使用文件查找,它可能看起来像:

lineinfile: dest=/etc/fstab regexp="^/dev/sdb1 " line="{{ lookup('file', 'files/fstabdata') }}"
Run Code Online (Sandbox Code Playgroud)

我没有测试过.

如果您的用例是围绕安装磁盘,那么您可以考虑使用可以更好地处理事情的安装模块.

如果你真的陷入困境,那么你可以随时用以下的方式解决问题:

-name: Check for line in /etc/fstab
 command: grep /dev/sdb1
 changed_when: False
 register: shell_out

-name: Append to /etc/fstab
 command: cat /home/ansible/files/fstabdata >> /etc/fstab
 when: shell_out.std_out != ''
Run Code Online (Sandbox Code Playgroud)

但是通常使用Ansible,你应该总是在使用shelling之前使用所提供的模块.


Tk_*_*Tk_ 5

您可以通过以下方式之一将文件的内容添加或附加到另一个文件

-name: Add single line from a file
  lineinfile: path=destinationFile line={{lookup('file', 'sourceFile')}} create=yes state=present
-name: Add text block from a file
  blockinfile: path=destinationFile block={{lookup('file', 'sourceFile')}} create=yes state=present
Run Code Online (Sandbox Code Playgroud)

与前面提到的使用命令或 shell 模块的解决方案相比,这样做的优势在于源文件不需要存在于远程机器上。

此外,由于 lineinfile 或 blockinfile 功能的性质,destinationFile 中 sourceFile 的内容不会在多个 ansible 执行中多次添加。

在此处查看有关文件查找用法的更多信息:https : //docs.ansible.com/ansible/latest/plugins/lookup/file.html