我需要扫描/etc/fstab
文件中的条目,如果不存在,则将另一个文件的内容附加到/etc/fstab
。
我见过的Ansible模块似乎不允许将文件附加到另一个文件而只是添加特定的"文本"线。
答案 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