검색

6장. AAP2용 플레이북 변환

download PDF

Ansible Automation Platform 2 및 컨테이너화된 실행 환경을 사용하면 localhost 의 사용이 변경되었습니다. 이전 버전의 Ansible Automation Platform에서는 작업이 기본 자동화 컨트롤러 호스트에서 실행 중으로 변환된 localhost 에 대해 실행되었습니다. 이는 데이터 및 영구 아티팩트를 저장하는 데 사용할 수 있습니다.

Ansible Automation Platform 2를 사용하면 localhost가 컨테이너 내에서 실행 중임을 의미하며, 이는 본질적으로 임시적입니다. localhost 는 더 이상 특정 호스트에 연결되지 않으며 이식 가능한 실행 환경에서 이미 실행 환경 및 소프트웨어 사전 요구 사항이 포함된 올바른 환경 및 소프트웨어 사전 요구 사항으로 실행할 수 있습니다.

6.1. 자동 실행에서 데이터 유지

데이터가 해당 호스트에 연결되므로 로컬 자동화 컨트롤러 파일 시스템을 비생산적인 것으로 간주합니다. 다중 노드 클러스터가 있는 경우 매번 다른 호스트에 연결하여 서로 다른 워크플로우를 생성하는 경우 문제가 발생할 수 있습니다. 예를 들어 다른 노드가 플레이북을 실행하는 동안 한 노드에서만 디렉터리가 생성된 경우 결과가 일치하지 않습니다.

솔루션은 Amazon S3, Gist 또는 데이터를 데이터 끝점에 rsync 역할과 같은 공유 스토리지 솔루션의 일부 형식을 사용하는 것입니다.

옵션은 런타임 시 컨테이너에 데이터 또는 구성을 삽입하는 데 있습니다. 이를 위해 자동화 컨트롤러의 분리된 작업 경로 옵션을 사용할 수 있습니다.

이를 통해 런타임 시 디렉터리 및 파일을 실행 환경에 마운트할 수 있습니다. 이 작업은 ansible-runner를 사용하여 Podman 컨테이너에 삽입하여 자동화를 시작하는 자동화 메시를 통해 수행됩니다. 다음은 격리된 작업 경로를 사용하는 몇 가지 사용 사례입니다.

  • 실행 환경으로 배치하는 대신 런타임에 SSL 인증서를 제공합니다.
  • SSH 구성 설정과 같은 런타임 구성 데이터를 전달하지만 자동화 중에 사용하려는 모든 항목이 될 수 있습니다.
  • 자동화 실행 전, 도중 및 후에 사용된 파일 읽기 및 쓰기.

사용할 수 있는 경고는 다음과 같습니다.

  • 볼륨 마운트는 자동화할 수 있는 모든 노드(하이브리드 컨트롤 플레인 노드 및 모든 실행 노드)에서 미리 표시되어야 합니다.
  • SELinux가 활성화되어 있는 경우 (Ansible Automation Platform 기본값) 파일 권한에 주의하십시오.

    • rootless Podman은 OCP 기반이 아닌 설치에서 실행되기 때문에 중요합니다.

경고는 신중하게 관찰해야합니다. Ansible Automation Platform 2 내에서 사용되는 작업 경로의 [:OPTIONS] 부분인 rootless Podman 및 Podman 볼륨 마운트 런타임 옵션을 읽는 것이 좋습니다.

6.1.1. 플레이북 예제 변환

이 예제는 작업을 실행하는 동안 파일을 읽고 쓸 수 있도록 /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와 유사하게 작업이 완료된 후 삭제됩니다.

Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.