Ansible : 플레이 북을 재생하는 동안 디버그가 아닌 "cat file"하고 출력을 화면으로 내보낼 수 있습니까?


22

사용자 당 Google OTP를 설치하고 구성하는 플레이 북을 작성했습니다.

플레이 북의 마지막 단계를 catgoogle_authenticator 구성 파일에 추가 하고 싶습니다 .

"디버그"모듈을 사용하여 화면에 데이터를 표시 할 수 있지만 디버그 메시지로만 표시 할 수 있습니다.

TASK: [debug var=details.stdout_lines] ****************************************
ok: [localhost] => {
    "details.stdout_lines": [
        "ZKMFTE2ADYA2OYCH",
        "\"RATE_LIMIT 3 30",
        "\" DISALLOW_REUSE",
        "\" TOTP_AUTH",
        "12920994",
        "88224784",
        "69464205",
        "38144121",
        "45634120"
    ]
}

온라인에서 다음과 같이 할 수 있다고 읽었습니다.

  - name: Print to screen google authenticator details
    command: /bin/cat {{ google_authenticator_secret_file_location }}
    register: details
    tags: google_2fa_user

  - debug: msg="{{ details.stdout_lines }}"

그러나 실행할 때 오류가 발생합니다.

TASK: [Print to screen google authenticator details] **************************
changed: [localhost]

TASK: [debug msg="{{details.stdout_lines}}"] **********************************
fatal: [localhost] => Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/ansible/runner/__init__.py", line 532, in _executor
    exec_rc = self._executor_internal(host, new_stdin)
  File "/usr/lib/python2.7/dist-packages/ansible/runner/__init__.py", line 629, in _executor_internal
    return self._executor_internal_inner(host, self.module_name, self.module_args, inject, port, complex_args=complex_args)
  File "/usr/lib/python2.7/dist-packages/ansible/runner/__init__.py", line 815, in _executor_internal_inner
    result = handler.run(conn, tmp, module_name, module_args, inject, complex_args)
  File "/usr/lib/python2.7/dist-packages/ansible/runner/action_plugins/debug.py", line 41, in run
    kv = utils.parse_kv(module_args)
  File "/usr/lib/python2.7/dist-packages/ansible/utils/__init__.py", line 526, in parse_kv
    vargs = [x.decode('utf-8') for x in shlex.split(args, posix=True)]
  File "/usr/lib/python2.7/shlex.py", line 279, in split
    return list(lex)
  File "/usr/lib/python2.7/shlex.py", line 269, in next
    token = self.get_token()
  File "/usr/lib/python2.7/shlex.py", line 96, in get_token
    raw = self.read_token()
  File "/usr/lib/python2.7/shlex.py", line 172, in read_token
    raise ValueError, "No closing quotation"
ValueError: No closing quotation


FATAL: all hosts have already failed -- aborting

PLAY RECAP ********************************************************************

따옴표가 있지만 "닫는 인용구가 없습니다"라는 오류가 표시됩니다. 또한 시도 :

 - debug: msg= "{{ details.stdout_lines }}"

어떤 문제가 될 수 있는지 아십니까?

답변:


3

인용 신사 필터는 인용 문제를 해결해야한다. 다음과 같이 사용하십시오.

  - debug: msg="{{ details.stdout_lines | quote }}"

다른 질문에 대해서는 debug모듈 이외의 명령문을 인쇄하는 모듈을 알지 못합니다 . 등록 된 변수를 파일로 저장이 옵션 인지 확인할 수 있습니다 . 컨트롤러 호스트에 Ansible 변수를 저장하려면 다음과 같이 할 수 있습니다 :

- local_action: copy content={{ details.stdout_lines }} dest=/path/to/destination/file

편집 조금 수정해야합니다. 이 serverfault 질문을 살펴보십시오 . callback.display함수 를 사용하여 Ansible 출력을 조정할 수 있습니다 . 링크 된 블로그 게시물을 읽는 것이 좋습니다 .


1

문제는 당신이 catinging하는 파일의 따옴표가 일치하지 않고 msg의 따옴표와 엉망이라는 것입니다. 어쩌면 시도하십시오 :

-디버그 : msg = "{{details.stdout_lines | regex_escape ()}"

또는

-디버그 : msg = "{{details.stdout_lines | regex_replace ( '"', '\ "')}"

이것은 msg 주위의 따옴표가 서로 일치하도록 msg의 따옴표를 이스케이프해야합니다.

이것은 테스트되지 않았지만 (지금 테스트 할 위치가 아닙니다) 실제로 빠르게 시도하고 볼 수 있습니다.


둘 다 시도했다 ... 작동하지 않았다.
Itai Ganot

흠, 나는 위의 제안없이 방금 실행했으며 처음에했던 것과 동일한 결과를 얻었습니다. 그러나 자신만의 로그 모듈을 작성하거나 쉘 또는 펄 스크립트 또는 다른 것으로 파이프하지 않고 디버그 이외의 형식으로 가져올 수있는 것으로 보이지 않습니다. 이 링크는 좋은 답변을
얻었습니다

1

인터넷을 자세히 살펴보고 일부 Ansible 전문가와 확인했습니다.

내가 이해하는 한 Ansible 1.8에는 명령 출력을 디버그 출력이 아닌 일반 출력으로 화면에 리디렉션하는 옵션이 없습니다.


2
Ansible 2.2에 관해서는 디버그를 사용하는 것 외에는 화면에 인쇄하는 옵션이 여전히 없습니다.
Itai Ganot

0

위의 텍스트 블록에서 몇 가지 테스트를 실행했습니다. details.stdout_lines를 사용하여 추가 한 json 따옴표를 지우고 삭제했습니다.

인증 파일의 '나쁜'텍스트가 항상 선행 텍스트 인 \"경우이 (테스트 된) 그냥 작동하여 거의 동일한 출력을 생성하지만이 문자열 대신 콜론을 사용합니다.

- debug: msg="{{ details.stdout.replace('\\"',':').split('\n') }}"

이제 이것은 매우 제한적인 유스 케이스이지만 Google auth 출력이 여기에 엄격하게 정의되어 있으며 가능한 경우 완전히 가능하면 원하는대로해야합니다.

그러나 여전히 var=details.stdout_lines콘텐츠를 얻는 것이 더 쉽고 더 좋을 것 입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.