为指定的挂载点设置挂载选项

有没有一种优雅的方式来设置UUID的给定挂载点的挂载选项?

我想要完成的是一个像这样的fstab条目:

UUID=d5e3a2e2-a113-4a27-b8d7-801dbf4c6134 / ext4 errors=remount-ro,noatime,user_xattr,acl 0 1 

所以基本上我想告诉他们:“设置这些设备的选项在/上。” 但是mount模块的src参数对于当前状态是必需的,我想使用UUID作为源。

我目前的解决办法是作为下面的答案发布,但是它将遍历所有现有的坐骑,并检查path是否/否,并因此产生大量的skipping输出。


我现在做的是:

 - name: "mount options for /" mount: path: "/" src: "UUID={{ item.uuid }}" fstype: "ext4" opts: "errors=remount-ro,noatime,user_xattr,acl" state: "present" with_items: - "{{ ansible_mounts }}" when: "item.mount == '/'" 

这是我打算做的,但它检查主机的所有挂载点,并因此产生大量的skipping输出:

 TASK [node : mount options for /] ************************************************************************************************************************ ok: [node001] => (item={u'uuid': u'N/A', u'size_total': 291684016128, u'mount': u'/', u'size_available': 215996313600, u'fstype': u'ext4', u'device': u'/dev/sda2', u'options': u'rw,noatime,nodiratime,errors=remount-ro,user_xattr,acl'}) skipping: [node001] => (item={u'uuid': u'N/A', u'size_total': 527433728, u'mount': u'/boot/efi', u'size_available': 523894784, u'fstype': u'vfat', u'device': u'/dev/sda1', u'options': u'rw'}) skipping: [node001] => (item={u'uuid': u'N/A', u'size_total': 10908480831488, u'mount': u'/scr', u'size_available': 2431928762368, u'fstype': u'nfs4', u'device': u'192.168.31.3:/scratch', u'options': u'rw,vers=4,sec=sys,addr=192.168.31.3,clientaddr=192.168.31.41,_netdev'}) skipping: [node001] => (item={u'uuid': u'N/A', u'size_total': 10908480831488, u'mount': u'/homes', u'size_available': 2431928762368, u'fstype': u'nfs4', u'device': u'192.168.31.3:/u', u'options': u'rw,vers=4,sec=sys,addr=192.168.31.3,clientaddr=192.168.31.41,_netdev'}) skipping: [node001] => (item={u'uuid': u'N/A', u'size_total': 48378511622144, u'mount': u'/mnt/bigdata3', u'size_available': 5786707165184, u'fstype': u'nfs', u'device': u'192.168.31.1:/DATA3/bigdata3', u'options': u'ro,noatime,vers=3,addr=192.168.31.1,_netdev'}) skipping: [node001] => (item={u'uuid': u'N/A', u'size_total': 48378511622144, u'mount': u'/mnt/bigdata4', u'size_available': 18173101342720, u'fstype': u'nfs', u'device': u'192.168.31.1:/DATA4/bigdata4', u'options': u'ro,noatime,vers=3,addr=192.168.31.1,_netdev'}) skipping: [node001] => (item={u'uuid': u'N/A', u'size_total': 38764865912832, u'mount': u'/mnt/groupdata2', u'size_available': 7847016398848, u'fstype': u'nfs', u'device': u'192.168.31.1:/DATA2/groupdata2', u'options': u'rw,noatime,vers=3,addr=192.168.31.1,_netdev'}) skipping: [node001] => (item={u'uuid': u'N/A', u'size_total': 14776486854656, u'mount': u'/mnt/bigdata1', u'size_available': 3801819906048, u'fstype': u'nfs', u'device': u'192.168.31.1:/DATA1/bigdata1', u'options': u'ro,noatime,vers=3,addr=192.168.31.1,_netdev'}) skipping: [node001] => (item={u'uuid': u'N/A', u'size_total': 23931377418240, u'mount': u'/mnt/groupdata', u'size_available': 3801819906048, u'fstype': u'nfs', u'device': u'192.168.31.1:/DATA1/groupdata', u'options': u'rw,noatime,vers=3,addr=192.168.31.1,_netdev'}) skipping: [node001] => (item={u'uuid': u'N/A', u'size_total': 12593077944320, u'mount': u'/mnt/transfer', u'size_available': 8260916609024, u'fstype': u'nfs', u'device': u'nas:/DATA5/transfer', u'options': u'ro,noatime,vers=4.1,acl,addr=192.168.31.2,clientaddr=192.168.31.41,_netdev'}) skipping: [node001] => (item={u'uuid': u'N/A', u'size_total': 40888277401600, u'mount': u'/mnt/transfer2', u'size_available': 25068068405248, u'fstype': u'nfs', u'device': u'nas:/DATA5/transfer2', u'options': u'ro,noatime,vers=4.1,acl,addr=192.168.31.2,clientaddr=192.168.31.41,_netdev'}) 

这在我看来是丑陋的,我想知道是否有更好的方法来做到这一点。


编辑

我发现filterjson_query应该能够做我想要的。 然而,我无法得到它的工作。

在这个例子网站上,我尝试了这个数据结构(从ansible_facts复制):

 { "ansible_mounts": [ { "device": "/dev/sda2", "fstype": "ext4", "mount": "/", "options": "rw,noatime,nodiratime,errors=remount-ro,user_xattr,acl", "size_available": 215995777024, "size_total": 291684016128, "uuid": "N/A" }, { "device": "/dev/sda1", "fstype": "vfat", "mount": "/boot/efi", "options": "rw", "size_available": 523894784, "size_total": 527433728, "uuid": "N/A" } ] } 

与此查询:

 ansible_mounts[?mount == `/`] 

并获得了所需的输出:

 [ { "device": "/dev/sda2", "fstype": "ext4", "mount": "/", "options": "rw,noatime,nodiratime,errors=remount-ro,user_xattr,acl", "size_available": 215995777024, "size_total": 291684016128, "uuid": "N/A" } ] 

所以我在剧本中尝试了这个:

  src: "UUID={{ item.uuid }}" with_items: - "{{ ansible_mounts|json_query('ansible_mounts[?mount == `/`]') }}" 

但是这个消息失败了:

 The error was: 'ansible.vars.unsafe_proxy.AnsibleUnsafeText object' has no attribute 'uuid' 

  • 操作系统在整个磁盘encryption的计算机上重新安装
  • Firefox和Thunderbird的自定义(预configuration)安装程序
  • 如何将Sun JRE私人安装到我的应用程序中?
  • 如何自动启动Apache服务器?
  • 你如何制作一个WinXP可启动的USB驱动器?
  • 为什么我的curlftpfs只写?
  • 2 Solutions collect form web for “为指定的挂载点设置挂载选项”

    我设法得到我想要的json_queryfilter:

     - name: "mount options for /" mount: path: "/" src: "UUID={{ ansible_mounts | json_query('[?mount == `/`] | [0].uuid') }}" fstype: "ext4" opts: "errors=remount-ro,noatime,user_xattr,acl" state: "present" 

    您将需要安装包python-jmespath

    Ansible的输出是打算的。 您指示Ansible循环遍历ansible_mounts列出的ansible_mounts 。 我看到的唯一选项是grep根设备的UUID并注册输出。 像这样的事情应该做的伎俩:

     - name: Get root device UUID. shell: cat /etc/fstab | grep "/\s" | cut -f1 | cut -d = -f2 register: root_uuid - debug: msg: "{{ root_uuid.stdout }}" - name: "mount options for /" mount: path: "/" src: "{{ root_uuid }}" fstype: "ext4" opts: "errors=remount-ro,noatime,user_xattr,acl" state: "present" 

    但是这个尝试可能不太稳定,为了减lessAnsible的输出噪音,我不会推荐做这样的事情。

    服务器问题集锦,包括 Linux(Ubuntu, Centos,Debian等)和Windows Server服务器.