使用 ansible 将挂载点设置为不可变会导致挂载的卷无法写入,而手动操作则可行

使用 ansible 将挂载点设置为不可变会导致挂载的卷无法写入,而手动操作则可行

过去,在 NAS 故障期间丢失了数百 TB 的数据,出于习惯,我总是将服务器上的挂载点设置为不可变。这样可以防止对挂载点下的磁盘结构进行任何更改。这样可以防止挂载在该挂载点的磁盘断开连接,内核反而开始将这些文件写入挂载点。将其设置为不可变可以防止根卷填满,并导致安全警钟开始响起,这有助于我们更快地注意到问题。

正常情况下,这很好用。如果我创建 /mnt/mountpoint,并使其不可变,则无法以 root 身份在那里创建任何文件。如果我在 /mnt/mountpoint 上安装卷,则可以毫无问题地在那里创建测试文件。

[root@test-vm-1 ~]# mkdir /mnt/test
[root@test-vm-1 ~]# touch /mnt/test/testfile
[root@test-vm-1 ~]# ls /mnt/test/testfile
/mnt/test/testfile
[root@test-vm-1 ~]# rm -f /mnt/test/testfile
[root@test-vm-1 ~]# chattr +i /mnt/test/
[root@test-vm-1 ~]# touch /mnt/test/testfile
touch: cannot touch `/mnt/test/testfile': Permission denied
[root@bcv-ub-test-vm-1 ~]# mkfs.ext4 /dev/sdb1
mke2fs 1.41.12 (17-May-2010)
TEXT OMMITTED
[root@test-vm-1 ~]# mount /dev/sdb1 /mnt/test/
[root@test-vm-1 ~]# touch /mnt/test/testfile
[root@test-vm-1 ~]# umount /mnt/test
[root@test-vm-1 ~]# umount /mnt/test/testfile
umount: /mnt/test/testfile: not found
[root@test-vm-1 ~]# touch /mnt/test/testfile
touch: cannot touch `/mnt/test/testfile': Permission denied

因此,除非在那里安装了卷,否则您无法写入安装点。

但是,我使用剧本在 ansible 中运行以下命令:

- name: Validate that VIVALogger volume group is created and added
  stat:
    path: /dev/sdb1
  register: stat_result

- name: Configure export volume - add mountpoint
  file:
    path: /mnt/test
    state: directory

- name: Make test mountpoint immutable
  command: "chattr +i /mnt/test"

- name: Configure export volume - mount export volume
  mount:
    path: /mnt/test
    src: /dev/sdb1
    fstype: xfs
    state: mounted
    opts: inode64,nobarrier
    dump: 0
    passno: 2
  when: stat_result.stat.exists

- name: Pause for 30 seconds for volume to mount properly
  pause:
    seconds: 30

- name: Create testfile
  command: "touch /mnt/test/testfile"

无法将任何文件写入已挂载的卷。似乎不可变性正在递归应用于该卷的所有子目录。

我也尝试过使用文件模块来配置不变性,其行为是一样的。

有人见过这种行为吗? 我正在针对 RHEL 5、6 和 7 使用 ansible 2.6.3。

相关内容