Ansible 플레이북 출력을 올바른 형식으로 표시합니다.

Ansible 플레이북 출력을 올바른 형식으로 표시합니다.

Ansible 실행 작업의 표준 스트림 출력 형식을 올바르게 지정하려면 어떤 구성이 필요합니까 ansible-playbook?

작업의 출력을 실행하는 내용에는 ansible-playbook foo.yaml표준 스트림( stdout, stderr) 콘텐츠가 포함됩니다. 그러나 이들의 표시는 큰 JSON 단일 행 Blob에 있으며 스트림으로 전송된 형식화된 행으로 인쇄되지 않습니다.

TASK [Django: Collect media fixture files] ******************************************************************************
ok: [lorem]

TASK [Django: Create superuser] ******************************************************************************
fatal: [lorem]: FAILED! => {"changed": false, "cmd": "python3 -m django createsuperuser\n  --noinput\n  --username \"admin\"\n  --email \"[email protected]\"", "msg": "\n:stderr: CommandError: You must use --full_name with --noinput.\n", "path": "/var/local/dolor/virtualenv/rectory/venv.py3.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/games", "syspath": ["/tmp/ansible_django_manage_payload_uj9f3le8/ansible_django_manage_payload.zip", "/usr/lib/python37.zip", "/usr/lib/python3.7", "/usr/lib/python3.7/lib-dynload", "/usr/local/lib/python3.7/dist-packages", "/usr/lib/python3/dist-packages"]}

원치 않는 출력 형식의 원인은 무엇입니까?표시를 위해 항상 스트림 출력 형식을 올바르게 지정하도록 Ansible에 지시하려면 어떻게 해야 합니까?출력 에서 ansible-playbook?

답변1

Ansible은 기본적으로 기계가 읽을 수 있는 JSON 출력을 사용하며 사람이 읽는 데는 적합하지 않습니다. 그러나 다른 것도 있습니다"콜백" 모듈 사용 가능, 그 중 일부는 스트림 출력 형식을 지정할 수 있습니다.

  • 오해의 소지가 있는 이름debug기준 치수인간이 보기에 더 적합합니다.
  • 최근에는yaml기준 치수스트림 출력을 읽기 쉬운 YAML 문서로 형식화합니다.

따라서 ANSIBLE_STDOUT_CALLBACK환경 변수를 사용하면 다음과 같습니다.

$ ANSIBLE_STDOUT_CALLBACK=yaml ansible-playbook ansible/deploy.yaml

스트림 출력의 형식이 변경됩니다.

[…]
TASK [Django: Collect media fixture files] ******************************************************************************
ok: [lorem]

TASK [Django: Create superuser] ******************************************************************************
fatal: [lorem]: FAILED! => changed=false
  cmd: |-
    python3 -m django createsuperuser
      --noinput
      --username "admin"
      --email "[email protected]
  msg: |-
    stderr: |-
      CommandError: You must use --full_name with --noinput.
    path: "/var/local/dolor/virtualenv/rectory/venv.py3.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/games"
    syspath: 
    - /tmp/ansible_django_manage_payload_uj9f3le8/ansible_django_manage_payload.zip
    - /usr/lib/python37.zip
    - /usr/lib/python3.7
    - /usr/lib/python3.7/lib-dynload
    - /usr/local/lib/python3.7/dist-packages
    - /usr/lib/python3/dist-packages

답변2

1. 구성 파일 생성

Ansible 플레이북 출력을 깔끔한 JSON 형식으로 얻으려면 구성 파일을 생성하세요.

  • 또는 ansible.cfgAnsible 플레이북 파일과 동일한 디렉터리에 있음
  • 또는 점으로 시작하는 홈 디렉토리에서~/.ansible.cfg
  • 또는/etc/ansible/ansible.cfg

원천:https://docs.ansible.com/ansible/latest/reference_appendices/config.html

보너스: debug또한 꽤 준다표준 출력,표준 오류그리고메시지.

파일 내용:

[defaults]
stdout_callback=debug

2. 플레이북 실행

이전과 똑같은 방식으로 플레이북을 실행합니다.

ansible-playbook foo.yaml

비교

전에:

TASK [Django: Collect media fixture files] ******************************************************************************
ok: [lorem]

TASK [Django: Create superuser] ******************************************************************************
fatal: [lorem]: FAILED! => {"changed": false, "cmd": "python3 -m django createsuperuser\n  --noinput\n  --username \"admin\"\n  --email \"[email protected]\"", "msg": "\n:stderr: CommandError: You must use --full_name with --noinput.\n", "path": "/var/local/dolor/virtualenv/rectory/venv.py3.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/games", "syspath": ["/tmp/ansible_django_manage_payload_uj9f3le8/ansible_django_manage_payload.zip", "/usr/lib/python37.zip", "/usr/lib/python3.7", "/usr/lib/python3.7/lib-dynload", "/usr/local/lib/python3.7/dist-packages", "/usr/lib/python3/dist-packages"]}

후에:

TASK [Django: Collect media fixture files] ******************************************************************************
ok: [lorem]

TASK [Django: Create superuser] ******************************************************************************
fatal: [lorem]: FAILED! => {
  "changed": false,
  "cmd": "python3 -m django createsuperuser\n  --noinput\n  --username \"admin\"\n  --email \"[email protected]\"",
  "msg": "\n:stderr: CommandError: You must use --full_name with --noinput.\n",
  "path": "/var/local/dolor/virtualenv/rectory/venv.py3.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/games",
  "syspath": [
    "/tmp/ansible_django_manage_payload_uj9f3le8/ansible_django_manage_payload.zip",
    "/usr/lib/python37.zip",
    "/usr/lib/python3.7",
    "/usr/lib/python3.7/lib-dynload",
    "/usr/local/lib/python3.7/dist-packages",
    "/usr/lib/python3/dist-packages"
  ]
}

STDERR:

CommandError: You must use --full_name with --noinput.



MSG:

CommandError: You must use --full_name with --noinput.

관련 정보