手动可执行的密码查询命令在Ansible中执行失败,求解决方案
在Ansible中从Solaris环境变量文件提取密码的解决方法
方案一:修复shell模块的执行问题
手动执行正常但Ansible失败,通常是shell环境差异、命令路径缺失或文件权限不足导致的,按以下方式调整playbook:
- name: 提取ap0085的密码 hosts: solaris_hosts tasks: - name: 执行nawk命令获取密码 shell: /usr/bin/nawk -F'=' '/export.*ap0085/ {gsub(/["]/, "", $2); print $2}' /u/mybank/UNX/config/.unx_env register: pass_result args: executable: /bin/bash # 对齐手动登录的shell环境 become: yes # 若文件需高权限读取,添加此参数切换用户 - name: 输出测试结果 debug: msg: "提取到的密码: {{ pass_result.stdout.strip() }}"
关键调整点:
- 用
/usr/bin/nawk完整路径:Solaris中nawk默认位于该路径,避免Ansible环境PATH未包含此路径导致命令找不到 - 指定
executable: /bin/bash:确保Ansible使用与手动登录一致的shell,避免sh环境下的语法或行为差异 - 添加
gsub(/["]/, "", $2):如果密码带有双引号,自动去除引号 - 若文件属主/权限限制普通用户读取,加上
become: yes切换到有权限的用户(如root)
方案二:正确使用slurp模块+正则提取
之前slurp方案报错多是因为未解码base64内容或正则匹配错误,以下是修正后的实现:
- name: 通过slurp提取密码 hosts: solaris_hosts tasks: - name: 读取环境变量文件 slurp: src: /u/mybank/UNX/config/.unx_env register: env_file_content - name: 解码并提取密码 set_fact: ap0085_password: "{{ (env_file_content.content | b64decode) | regex_search('export.*ap0085=\"?([^\"]+)\"?', '\\1') | first | default('未找到匹配密码') }}" - name: 输出测试结果 debug: msg: "提取到的密码: {{ ap0085_password }}"
关键调整点:
- 必须用
b64decode解码:slurp模块返回的content是base64编码格式,直接正则会匹配失败 - 优化正则表达式:
export.*ap0085=\"?([^\"]+)\"?适配带/不带双引号的密码格式,确保能正确捕获密码值 - 添加
default('未找到匹配密码'):避免正则匹配不到时触发报错
常见排查步骤
- 检查文件权限:执行
shell: ls -l /u/mybank/UNX/config/.unx_env确认Ansible执行用户是否有读取权限 - 对比PATH差异:手动执行
echo $PATH,Ansible中执行shell: echo $PATH,确保nawk所在路径被包含 - 验证正则准确性:在目标主机上手动执行
grep -E 'export.*ap0085' /u/mybank/UNX/config/.unx_env,确认正则能匹配到目标行
内容的提问来源于stack exchange,提问作者Ashar
相关产品推荐
相关产品推荐

