Expect 모듈을 사용하여 작업에 ansible_python_interpreter를 추가하세요. make_user를 사용하여 명령을 가져올 수 없습니다.

Expect 모듈을 사용하여 작업에 ansible_python_interpreter를 추가하세요. make_user를 사용하여 명령을 가져올 수 없습니다.

저는 CentOS7즉각적인 대화가 이루어져야 하는 인벤토리 퀘스트를 작성 중인데 이것이 expectandible 모듈에 가장 적합한 후보라고 생각합니다.

- name: setup some command
  become: yes
  become_user: user1
  expect:
    command: some_command
    responses:
      'Do you want to continue? [yes/no]': 'y'

위 작업에는 pexpect인벤토리에 패키지가 필요하며 사용 가능한 버전 2.3 오류가 아래에 표시되지만 예상 버전은 >= 3.3입니다.

fatal: [target1]: FAILED! => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "msg": "Insufficient version of pexpect installed (2.3), this module requires pexpect>=3.3. Error was 'module' object has no attribute '_run'"}

해결 방법으로 인벤토리 모듈을 설치 python3하고 pexpect작업 ansible_python_interpreter에 이를 해결하도록 지정했습니다. 이번에는 명령을 찾을 수 없습니다become_user

- name: setup some command
  vars:
    ansible_python_interpreter: /usr/bin/python3
  become: yes
  become_user: user1
  expect:
    command: some_command
    responses:
      'Do you want to continue? [yes/no]': 'y'

다음은 작업에 대한 오류입니다.

An exception occurred during task execution. To see the full traceback, use -vvv. The error was: pexpect.exceptions.ExceptionPexpect: The command was not found or was not executable: some_command.
fatal: [target1]: FAILED! => {"changed": false, "msg": "The command was not found or was not executable: some_command."}

부족한 점 추천해주세요

답변1

데비안 시스템에서도 같은 문제가 있었지만 명령에 대한 전체 경로를 사용하여 작동하게 만들 수 있었습니다. which예를 들어 which some_command원격 서버에서 를 사용하여 명령의 전체 경로를 얻을 수 있습니다.

전체 경로를 사용하는 Ansible 플레이북 작업 예

- name: setup some command
  become: yes
  become_user: user1
  expect:
    command: /usr/bin/some_command
    responses:
      'Do you want to continue? [yes/no]': 'y'

더 조사한 결과 이것이 Ansible의 대량 로그인 때문이라는 것을 알게 되었습니다.

어쨌든 이는 Ansible이 실시간 로그인과 동일한 파일을 가져오지 않는 일괄 로그인을 수행하기 때문입니다. 이는 시스템 구성에 따라 다르며 두 로그인 유형 모두에 대해 동일한 PATH를 설정하여 변경할 수 있습니다. 원천

ansible <host> -m shell -a "echo $PATH"Ansible 플레이북이나 Ansible 플레이북을 사용하여 직접 시도해 볼 수 있습니다.

- name: check modinfo
  shell: |
    echo $PATH

# "stdout": "/usr/local/bin:/usr/bin:/bin:/usr/games",

관련 정보