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

时间:2015-10-14 13:57:25

标签: file ansible

我需要扫描/etc/fstab文件中的条目,如果不存在,则将另一个文件的内容附加到/etc/fstab

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

2 个答案:

答案 0 :(得分:6)

如果您的用例只是检查特定行是否存在,则可以使用lineinfile模块。

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

lineinfile: dest=/etc/fstab regexp="^/dev/sdb1 " line="/dev/sdb1    /data    ext4    defaults    1  2"

如果没有以/dev/sdb1开头的行,那么它会将其添加到文件的末尾。有帮助的是,如果该行的其余部分不匹配(例如,如果它被挂载为ext3),那么它会将其更改为提供的行。

如果您真的需要它来使用文件的全部内容,那么您可以使用file lookup,这可能看起来像:

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

虽然我没有测试过。

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

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

-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 != ''

但是一般来说,在使用Ansible之前,你应该始终使用所提供的模块,然后再进行炮轰。

答案 1 :(得分:1)

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

-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

相对于前面提到的使用命令或shell模块的解决方案,此方法的优势在于,不需要在远程计算机上显示源文件。

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

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