我需要扫描/etc/fstab
文件以查找条目,如果不存在,则将其他文件的内容附加到/etc/fstab
.
我见过的Ansible模块似乎不允许将文件附加到另一个文件而只是添加一个特定的"文本"行.
该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之前使用所提供的模块.
您可以通过以下方式之一将文件的内容添加或附加到另一个文件
-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