Ansible使用ansible_mounts检查磁盘挂载,重复执行playbook格式化报错如何解决
问题根因
- 你当前的校验逻辑错误核心在于:使用
with_items循环注册的check_mount变量,无论是否匹配到/data挂载点,变量本身都是非空的对象,直接判断not check_mount永远返回false,导致格式化磁盘的任务每次都会执行,第二次运行时磁盘已经挂载就会触发mkfs的报错。 - 无需循环遍历
ansible_mounts,可直接通过Jinja2过滤器快速判断挂载点是否存在,逻辑更简洁可靠,完全符合你不使用stat模块的要求。
修正后的完整Playbook
--- # 初始化挂载状态变量,直接基于ansible_mounts计算结果 - name: 检查/data挂载状态 ansible.builtin.set_fact: data_is_mounted: "{{ '/data' in ansible_mounts | map(attribute='mount') }}" - name: Create /data directory if not exists ansible.builtin.file: path: /data state: directory owner: root group: root mode: '0751' when: not data_is_mounted - name: Create a xfs filesystem on /dev/sda5 community.general.filesystem: force: yes fstype: xfs dev: /dev/sda5 when: not data_is_mounted - name: Get the /dev/sda5's UUID shell: blkid -s UUID -o value /dev/sda5 register: blkid_out when: not data_is_mounted - name: Mount up device by UUID ansible.posix.mount: path: /data src: UUID={{ blkid_out.stdout }} fstype: xfs opts: defaults state: mounted when: not data_is_mounted
如果你不想新增单独的状态检查任务,也可以直接把判断逻辑"'/data' not in ansible_mounts | map(attribute='mount')"写到所有后续需要执行的任务的when字段中,效果完全一致。
内容的提问来源于stack exchange,提问作者j4nvkvc
相关产品推荐
相关产品推荐

