5.3. 플레이북 예제 변환
예
이 예제는 작업을 실행하는 동안 파일을 읽고 쓸 수 있도록 /mydata 라는 공유 디렉터리입니다. 자동화 실행에 사용할 실행 노드에 이미 있어야 합니다.
기본 호스트에 이미 이 작업이 있으므로 aape1.local 실행 노드를 대상으로 합니다.
[awx@aape1 ~]$ ls -la /mydata/ total 4 drwxr-xr-x. 2 awx awx 41 Apr 28 09:27 . dr-xr-xr-x. 19 root root 258 Apr 11 15:16 .. -rw-r--r--. 1 awx awx 33 Apr 11 12:34 file_read -rw-r--r--. 1 awx awx 0 Apr 28 09:27 file_write
간단한 플레이북을 사용하여 절전으로 자동화를 시작하여 사용자가 액세스할 수 있도록 하고 프로세스를 이해하고 파일에 대한 읽기 및 쓰기를 시연합니다.
# vim:ft=ansible:
- hosts: all gather_facts: false ignore_errors: yes vars: period: 120 myfile: /mydata/file tasks: - name: Collect only selected facts ansible.builtin.setup: filter: - 'ansible_distribution' - 'ansible_machine_id' - 'ansible_memtotal_mb' - 'ansible_memfree_mb' - name: "I'm feeling real sleepy..." ansible.builtin.wait_for: timeout: "{{ period }}" delegate_to: localhost - ansible.builtin.debug: msg: "Isolated paths mounted into execution node: {{ AWX_ISOLATIONS_PATHS }}" - name: "Read pre-existing file..." ansible.builtin.debug: msg: "{{ lookup('file', '{{ myfile }}_read' - name: "Write to a new file..." ansible.builtin.copy: dest: "{{ myfile }}_write" content: | This is the file I've just written to. - name: "Read written out file..." ansible.builtin.debug: msg: "{{ lookup('file', '{{ myfile }}_write') }}"
Ansible Automation Platform 2 탐색 패널에서 설정을 Job settings 를 선택합니다.
. 그런 다음 작업 옵션에서격리된 작업을 노출하는 경로:
[ "/mydata:/mydata:rw" ]
볼륨 마운트는 컨테이너의 동일한 이름으로 매핑되며 읽기-쓰기 기능이 있습니다. 그러면 작업 템플릿을 시작할 때 사용됩니다.
각 실행의 수면 기간을 조정할 수 있도록 시작 시 프롬프트 를 extra_vars 로 설정해야 합니다. 기본값은 30초입니다.
시작된 후 wait_for 모듈은 sleep에 대해 호출되므로 실행 노드로 이동하여 실행 중인 항목을 확인할 수 있습니다.
실행이 성공적으로 완료되었는지 확인하려면 다음 명령을 실행하여 작업의 출력을 가져옵니다.
$ podman exec -it 'podman ps -q' /bin/bash bash-4.4#
이제 실행 중인 실행 환경 컨테이너 내부에 있습니다.
권한을 보면 awx 가 'root'가되었지만 rootless Podman을 사용하고 있기 때문에 사용자를 샌드박스와 유사한 커널 네임스페이스로 매핑하기 때문에 슈퍼유저에서와 같이 루트가 아닙니다. shadow-utils에서 rootless Podman의 작동 방식에 대해 자세히 알아보십시오.
bash-4.4# ls -la /mydata/ Total 4 drwxr-xr-x. 2 root root 41 Apr 28 09:27 . dr-xr-xr-x. 1 root root 77 Apr 28 09:40 .. -rw-r—--r–. 1 root root 33 Apr 11 12:34 file_read -rw-r—--r–. 1 root root 0 Apr 28 09:27 file_write
결과에 따르면 이 작업이 실패했습니다. 이유를 이해하려면 나머지 출력을 확인해야 합니다.
TASK [Read pre-existing file…]******************************* 10:50:12 ok: [localhost] => { “Msg”: “This is the file I am reading in.” TASK {Write to a new file...}********************************* 10:50:12 An exception occurred during task execution. To see the full traceback, use -vvv. The error was: PermissionError: [Errno 13] Permission denied: b'/mydata/.ansible_tmpazyqyqdrfile_write' -> b' /mydata/file_write' Fatal: [localhost]: FAILED! => {"changed": false, :checksum": "9f576o85d584287a3516ee8b3385cc6f69bf9ce", "msg": "Unable to make b'/root/.ansible/tmp/anisible-tim-1651139412.9808054-40-91081834383738/source' into /mydata/file_write, failed final rename from b'/mydata/.ansible_tmpazyqyqdrfile_write': [Errno 13] Permission denied: b'/mydata/.ansible_tmpazyqyqdrfile_write' -> b'/mydata/file_write} ...ignoring TASK [Read written out file...] ****************************** 10:50:13 Fatal: [localhost]: FAILED: => {"msg": "An unhandled exception occurred while running the lookup plugin 'file'. Error was a <class 'ansible.errors.AnsibleError;>, original message: could not locate file in lookup: /mydate/file_write. Vould not locate file in lookup: /mydate/file_write"} ...ignoring
:rw 가 설정되어 있어도 작업이 실패했으므로 쓰기 기능이 있어야 합니다. 프로세스에서 기존 파일을 읽을 수 있었지만 쓸 수는 없었습니다. 이는 SELinux 보호로 인해 컨테이너에 마운트된 볼륨 콘텐츠에 적절한 라벨을 배치해야 하기 때문입니다. 레이블이 없으면 SELinux에서 프로세스가 컨테이너 내에서 실행되지 않을 수 있습니다. OS에서 설정한 레이블은 Podman에서 변경하지 않습니다. 자세한 내용은 Podman 설명서를 참조하십시오.
이는 일반적인 잘못 해석이 될 수 있습니다. Podman이 공유 볼륨에서 파일 오브젝트의 레이블을 다시 지정하도록 하는 기본값을 :z 로 설정했습니다.
따라서 :z 를 추가하거나 그대로 둘 수 있습니다.
격리된 작업을 노출하는 경로:
[ "/mydata:/mydata" ]
이제 플레이북이 예상대로 작동합니다.
PLAY [all] **************************************************** 11:05:52 TASK [I'm feeling real sleepy. . .] *************************** 11:05:52 ok: [localhost] TASK [Read pre-existing file...] ****************************** 11:05:57 ok: [localhost] => { "Msg": "This is the file I'm reading in." } TASK [Write to a new file…] ********************************** 11:05:57 ok: [localhost] TASK [Read written out file…] ******************************** 11:05:58 ok: [localhost] => { “Msg”: “This is the file I’ve just written to.”
기본 실행 노드 호스트에서 다시, 새로 작성된 콘텐츠가 있습니다.
컨테이너 그룹을 사용하여 Red Hat OpenShift 내부에서 자동화 작업을 시작하는 경우 Ansible Automation Platform 2에 해당 환경에 동일한 경로를 노출하도록 지시할 수 있지만 기본값을 On
으로 전환해야 합니다.
활성화하면 이 값을 volumeMounts 및 실행에 사용할 Pod 사양 내에 삽입합니다. 다음과 같이 표시됩니다.
apiVersion: v1 kind: Pod Spec: containers: - image: registry.redhat.io/ansible-automation-platform-24/ee-minimal-rhel8 args: - ansible runner - worker - –private-data-dir=/runner volumeMounts: mountPath: /mnt2 name: volume-0 readOnly: true mountPath: /mnt3 name: volume-1 readOnly: true mountPath: /mnt4 name: volume-2 readOnly: true volumes: hostPath: path: /mnt2 type: “” name: volume-0 hostPath: path: /mnt3 type: “” name: volume-1 hostPath: path: /mnt4 type: “” name: volume-2
실행 중인 컨테이너 내부의 스토리지는 오버레이 파일 시스템을 사용하고 있습니다. 실행 중인 컨테이너 내부의 모든 수정 사항은 마운트 해제되는 tmpfs와 유사하게 작업이 완료된 후 삭제됩니다.