使用Ansible expect模块向Delinea adedit发送多命令失败问题排查
问题:Ansible expect模块执行Delinea adedit命令未按预期依次执行
我正在使用Delinea adedit命令,在Linux命令行中执行adedit后会出现>提示符,需要依次输入以下命令:
>bind acme.com administrator password123 >package require ade_lib >add_user_to_group ... >quit
注:password123为测试密码。
我尝试用Ansible的expect模块编写如下代码:
- name: Delinea adedit generic prompt with multiple different responses ansible.builtin.expect: command: adedit responses: ">": - bind "{{domain_name}} {{ lookup('aws_ssm', '/ansible/windows/username', region='us-east-1') }} {{ lookup('aws_ssm', '/ansible/windows/password', region='us-east-1') }}" - package require ade_lib - add_user_to_group "{{instance_name}}$@{{domain_name}} \"CN=SG-CFY-Delinea MFA Servers,OU=Computer Roles,OU=Centrify,DC=acme,DC=local\"" - quit
但执行后得到如下Ansible响应:
changed: [SERVER01] => {"changed": true, "cmd": "adedit", "delta": "0:00:00.193347", "end": "2024-09-11 14:49:15.510734", "rc": 0, "start": "2024-09-11 14:49:15.317387", "stdout": "No entry for terminal type \"unknown\";\r\nusing dumb terminal settings.\r\n>bind \"acme.local administrator password123\"", "stdout_lines": ["No entry for terminal type \"unknown\";", "using dumb terminal settings.", ">bind \"acme.local administrator password123\""]}
看起来四条命令并未依次执行,请问我的Ansible代码存在什么错误?
问题分析与解决方法
错误原因
expect模块responses匹配逻辑误用
你当前把所有命令都放在同一个>匹配规则的列表中,但expect模块的默认行为是:对每个匹配到的提示符,仅发送列表中的第一个响应,不会自动循环匹配后续的提示符来发送剩余命令。也就是说,第一次匹配到>时发送bind命令,但执行完bind后adedit再次输出>,expect不会主动发送第二个命令,因为它认为该匹配规则的响应已经处理完毕。多余的命令引号嵌套
bind命令中额外嵌套了双引号,导致实际执行的是bind "acme.local administrator password123",而非预期的bind acme.local administrator password123。这种格式错误会导致bind命令执行失败,后续的提示符也无法正常触发。终端类型未设置
输出中的"No entry for terminal type 'unknown'"提示,可能导致adedit的交互行为异常,影响后续提示符的输出。
修正后的Ansible代码
- name: Execute sequential adedit commands via expect ansible.builtin.expect: command: adedit # 设置TERM环境变量解决终端类型问题 environment: TERM: xterm responses: # 逐个匹配提示符,按顺序发送命令 ">": "bind {{domain_name}} {{ lookup('aws_ssm', '/ansible/windows/username', region='us-east-1') }} {{ lookup('aws_ssm', '/ansible/windows/password', region='us-east-1') }}" ">": "package require ade_lib" ">": "add_user_to_group {{instance_name}}$@{{domain_name}} \"CN=SG-CFY-Delinea MFA Servers,OU=Computer Roles,OU=Centrify,DC=acme,DC=local\"" ">": "quit" # 设置超时时间,避免命令执行超时 timeout: 30
关键说明
- 逐个匹配响应:每个
>匹配规则对应一条命令,expect会按顺序处理每个匹配项,每匹配一次就发送对应的响应,直到所有命令执行完成。 - 移除多余引号:bind命令不需要额外嵌套双引号,确保命令参数传递正确。
- TERM环境变量:设置为
xterm解决终端类型未知的问题,保证adedit交互正常。
内容的提问来源于stack exchange,提问作者Brian G
相关产品推荐
相关产品推荐

