使用变量时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
相关产品推荐
相关产品推荐

