You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用变量时ansible.posix.mount模块DNS解析失败求助

Ansible挂载存储变量引用导致DNS解析失败问题

我编写了一个用于挂载不同类型存储的测试Playbook,当直接写死参数值时可正常运行,但通过变量指定参数时会出现DNS解析失败的情况,不清楚原因。

原Playbook代码

---
- hosts: all
  become: true
  gather_facts: yes
  vars:
    shares:
      - environments:
        - environment: test 
          mounts:
             - dest: '/mnt/cifs/share2'
               src: //windows.example.com/share2
               opts: 'x-systemd.automount,rw,vers=2.1,sec=krb5i,user=test@EXAMPLE.COM,uid=test,gid=test,file_mode=0770,dir_mode=0770,rsize=32768,wsize=32768'
               type: 'cifs'
             - dest: /mnt/efs/share2
               src: fs-0e7af4f4f58ff4dcd.efs.us-east-2.amazonaws.com
               type: efs
               opts: 'x-systemd.automount,_netdev,tls,accesspoint=fsap-0395b37eaf8cbbf9e'
  tasks:
    - name: Mount CIFS Share
      ansible.posix.mount:
        src: fs-0e7af4f4f58ff4dcd.efs.us-east-2.amazonaws.com 
        path: /mnt/efs/share1
        fstype: efs 
        opts: 'x-systemd.automount,_netdev,tls,accesspoint=fsap-e9fbbc8ae74b5930'
        state: mounted

    - name: Mount EFS Share 
      ansible.posix.mount:
        src: //windows.example.com/share1
        path: /mnt/cifs/share1
        fstype: cifs
        opts: 'x-systemd.automount,rw,vers=2.1,sec=krb5i,user=test@EXAMPLE.COM,uid=test,gid=test,file_mode=0770,dir_mode=0770,rsize=32768,wsize=32768'
        state: mounted

    - name: Mount Shares
      ansible.posix.mount:
        src: |-
          {%- if item.1.type == "cifs" -%}
          \ "{{item.1.src}}"
          {%- else -%}
          "{{item.1.src}}"
          {%- endif -%}
        path: "{{item.1.dest}}"
        fstype: "{{item.1.type}}"  
        opts: "{{item.1.opts}}"  
        state: mounted
      with_subelements:
        - "{{ shares | map(attribute='environments') | list | sum(start=[]) }}"
        - mounts
      when: item.0.environment == 'test'

执行报错结果

[mose@lab ~/ansible]$ ansible-playbook -Ki hosts test-mounts.yml 
BECOME password: 

PLAY [all] ***********************************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************************************************************************************************************************
ok: [server.example.com]

TASK [Mount CIFS Share] **********************************************************************************************************************************************************************************************************************
ok: [server.example.com]

TASK [Mount EFS Share] ***********************************************************************************************************************************************************************************************************************
ok: [server.example.com]

TASK [Mount Shares] **************************************************************************************************************************************************************************************************************************
failed: [server.example.com] (item=[{'environment': 'test'}, {'dest': '/mnt/cifs/share2', 'src': 'server.example.com/mnt/cifs/share2', 'opts': 'x-systemd.automount,rw,vers=2.1,sec=krb5i,user=test@EXAMPLE.COM,uid=test,gid=test,file_mode=0770,dir_mode=0770,rsize=32768,wsize=32768', 'type': 'cifs'}]) => {"ansible_loop_var": "item", "changed": false, "item": [{"environment": "test"}, {"dest": "/mnt/cifs/share2", "opts": "x-systemd.automount,rw,vers=2.1,sec=krb5i,user=test@EXAMPLE.COM,uid=test,gid=test,file_mode=0770,dir_mode=0770,rsize=32768,wsize=32768", "src": "server.example.com/mnt/cifs/share2", "type": "cifs"}], "msg": "Error mounting /mnt/cifs/share2: mount error: could not resolve address for  \"server.example.com: Unknown error
"}
failed: [server.example.com] (item=[{'environment': 'test'}, {'dest': '/mnt/efs/share2', 'src': 'fs-0e7af4f4f58ff4dcd.efs.us-east-2.amazonaws.com', 'type': 'efs', 'opts': 'x-systemd.automount,_netdev,tls,accesspoint=fsap-e9fbbc8fae73b5930'}]) => {"ansible_loop_var": "item", "changed": false, "item": [{"environment": "test"}, {"dest": "/mnt/efs/share2", "opts": "x-systemd.automount,_netdev,tls,accesspoint=fsap-e9fbbc8fae73b5930", "src": "fs-0e7af4f4f58ff4dcd.efs.us-east-2.amazonaws.com", "type": "efs"}], "msg": "Error mounting /mnt/efs/share2: Failed to resolve \"\"fs-0e7af4f4f58ff4dcd.efs.us-east-2.amazonaws.com\"\" - check that the specified DNS name is a CNAME record resolving to a valid EFS DNS name
"}

PLAY RECAP ***********************************************************************************************************************************************************************************************************************************
server.example.com   : ok=3    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0

环境信息

[mose@lab ~/ansible]$ ansible --version
ansible [core 2.14.14]
  config file = /home/mose/ansible/ansible.cfg
  configured module search path = ['/home/mose/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3.9/site-packages/ansible
  ansible collection location = /home/mose/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/bin/ansible
  python version = 3.9.18 (main, Jan 24 2024, 00:00:00) [GCC 11.4.1 20231218 (Red Hat 11.4.1-3)] (/usr/bin/python3)
  jinja version = 3.1.2
  libyaml = True
[mose@lab ~/ansible]$ cat /etc/redhat-release 
Red Hat Enterprise Linux release 9.4 (Plow)

问题原因及修复方案

原因分析

从报错信息能明显看出,变量渲染后的src值被添加了不必要的引号和转义字符:

  • EFS的地址变成了"fs-0e7af4f4f58ff4dcd.efs.us-east-2.amazonaws.com",多余的双引号被当成了地址的一部分,导致DNS解析失败
  • CIFS的地址还多了前导的\ (反斜杠加空格),同样被解析为地址的一部分,自然无法找到对应的服务器

这些问题完全来自Mount Shares任务里的Jinja2模板写法错误:手动给src添加了引号,还为CIFS类型额外加了无意义的转义空格。ansible.posix.mount模块不需要手动给路径/地址添加引号,直接传入原始值即可。

修复后的任务代码

把Mount Shares任务的src字段修改为直接引用变量,去掉所有多余的引号和转义:

- name: Mount Shares
  ansible.posix.mount:
    src: "{{ item.1.src }}"
    path: "{{ item.1.dest }}"
    fstype: "{{ item.1.type }}"  
    opts: "{{ item.1.opts }}"  
    state: mounted
  with_subelements:
    - "{{ shares | map(attribute='environments') | list | sum(start=[]) }}"
    - mounts
  when: item.0.environment == 'test'

说明

你的vars中已经正确定义了各类存储的src格式:CIFS地址带//前缀,EFS地址是正确的域名,直接引用变量即可,模块会自动处理参数的格式要求,不需要额外添加任何引号或转义字符。

内容的提问来源于stack exchange,提问作者Mose

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 16:07:03