2

我有一个可以通过 ssh 进入的 DataDomain 系统。我需要在 DataDomain 上自动执行一个过程,该过程在命令后提出一个问题:

storage add tier active dev3

Object-store is not enabled. Filesystem will use block storage for user data.
    Do you want to continue? (yes|no) [no]: yes

我确实尝试使用 Ansible 并使用原始模块

- name:  add dev3 active tier
  raw: storage add tier active dev3
  register: RESULT

这是失败的:

TASK [add dev3 active tier] *******************************************************************************************************************************************************************
fatal: [3.127.218.96]: FAILED! => {"changed": true, "msg": "non-zero return code", "rc": 9, "stderr": "Shared connection to 3.127.218.96 closed.\r\n", "stderr_lines": ["Shared connection to 3.127.218.96 closed."], "stdout": "\r\n**** Could not add storage: system capacity exceeds the limit allowable by the license.\r\n\r\n", "stdout_lines": ["", "**** Could not add storage: system capacity exceeds the limit allowable by the license.", ""]}

以下 ansible-playbook 也失败了:

- name:  add dev3 active tier
  raw: | 
    yes | storage add tier active dev3
  register: RESULT

期望模块不接受原始并且也失败了。

 - name expect for add dev3 active tier
      expect:
        raw: storage add tier active dev3
        responses:
          Question:
            - Do you want to continue? (yes|no) [no]: y
        timeout: 30 
      register: RESULT

知道如何回答问题并回答“是”吗?

4

2 回答 2

2

您的expect任务问题来自两件事:

首先,事实是:

响应下的问题或关键是 python 正则表达式匹配。

来源:https ://docs.ansible.com/ansible/latest/collections/ansible/builtin/expect_module.html#notes

因此,您将不得不转义每个可能在正则表达式中有意义的符号。在您的情况下,
这些符号是?, (, |,和。注意:这些类型或行为很容易在像这样的正则表达式工具中测试:https ://regex101.com/r/ubtVfH/1/)[]

其次,responses密钥具有您在此处混合的两种格式。

  • 要么你有
    responses:
        Question:
          - response1
          - response2
          - response3
    
    您不指定脚本中的问题,而是指定答案的顺序列表。当然,这只有在问题和响应总是以相同的顺序出现时才有效。
  • 要么你使用
    responses:
      This is the prompt of the question in the script: that is the answer
      This is another question: and here is the corresponding answer
    
    在这里,您可以确定您正确地将每个答案映射到相应的问题。请注意,这本字典中没有Question键,答案是字典的键,而不是列表。

因此,对于您的用例,expect 的正确使用是:

- expect:
    command: storage add tier active dev3
    responses:
      Do you want to continue\? \(yes\|no\) \[no\]: 'yes'
    timeout: 30 
  register: result
于 2021-01-25T23:03:46.840 回答
0

yes命令默认发送一个y。但是您的命令需要一个yes. 您可以将字符串传递给yes命令以重复。

- name: add dev3 active tier
  shell:
    cmd: yes yes | storage add tier active dev3
  register: RESULT
于 2021-01-25T13:36:00.170 回答