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

使用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代码存在什么错误?


问题分析与解决方法

错误原因

  1. expect模块responses匹配逻辑误用
    你当前把所有命令都放在同一个>匹配规则的列表中,但expect模块的默认行为是:对每个匹配到的提示符,仅发送列表中的第一个响应,不会自动循环匹配后续的提示符来发送剩余命令。也就是说,第一次匹配到>时发送bind命令,但执行完bind后adedit再次输出>,expect不会主动发送第二个命令,因为它认为该匹配规则的响应已经处理完毕。

  2. 多余的命令引号嵌套
    bind命令中额外嵌套了双引号,导致实际执行的是bind "acme.local administrator password123",而非预期的bind acme.local administrator password123。这种格式错误会导致bind命令执行失败,后续的提示符也无法正常触发。

  3. 终端类型未设置
    输出中的"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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 12:06:11