在Ansible中执行PowerShell命令的转义问题求助
解决Ansible执行PowerShell远程邮箱地址移除的转义问题
直接给你两种经过验证的可行方案:
方法一:使用win_powershell模块(推荐)
这个模块专门适配PowerShell场景,能直接传递参数,彻底绕开转义麻烦:
vars: _name: Test.User _email: "{{ _name }}@test.e-test.net" tasks: - name: 移除远程邮箱的指定地址 ansible.windows.win_powershell: script: | Set-RemoteMailbox -Identity $args[0] -EmailAddresses @{Remove = $args[1]} args: - "{{ _name }}" - "{{ _email }}"
原理很简单:通过args参数把Ansible变量直接传给PowerShell的$args数组,不用在脚本字符串里折腾引号转义,PowerShell能直接识别参数内容。
方法二:修正win_shell的转义写法
如果一定要用win_shell,去掉多余的转义字符即可,之前的问题是加了没必要的反斜杠和单引号:
vars: _name: Test.User tasks: - name: 移除远程邮箱的指定地址 ansible.windows.win_shell: | Set-RemoteMailbox "{{ _name }}" -EmailAddresses @{Remove="{{ _name }}@test.e-test.net"}
Ansible的Jinja2会先把{{ _name }}替换成实际值,最终传给PowerShell的就是正确的@{Remove="Test.User@test.e-test.net"}结构,完全不需要额外转义。
额外提示
- 尽量提前用变量拼接好完整的邮箱地址(比如方法一里的
_email),能减少脚本里的字符串拼接,降低出错概率 - 优先用win_powershell模块处理PowerShell相关任务,它比win_shell更贴合PowerShell的执行逻辑,后续维护也更省心
内容的提问来源于stack exchange,提问作者NB art
相关产品推荐
相关产品推荐

