Ansible - 정규 표현식을 가져오나요?

Ansible - 정규 표현식을 가져오나요?

이 파일의 매니페스트를 복사하여 다른 파일로 이동하기 위한 Ansible 플레이북을 작성 중입니다.

저는 앤서블을 처음 접했습니다. 처음에는 Copy 플러그인을 사용했지만 Fetch가 나에게 더 나은 동맹이 될 수 있다는 것을 알았습니다.

이것은 내 스크립트입니다.

- name: Find Checklist
  hosts: all
  tasks:
   - name: Find Checklist
     ansible.builtin.find:
       paths: /path/to/file/{{ ansible_hostname | upper }}/Checklist/
       patterns: '*.ckl'

- name: Copy Results
  hosts: all
  tasks:
   - name: Copy Results
     ansible.builtin.fetch:
             src: "/path/to/file/{{ ansible_hostname | upper }}/Checklist/*.ckl"
             dest: "/path/to/directory"

결과는 다음과 같습니다.

fatal: [fqdn]: FAILED! => {
    "changed": false,
    "invocation": {
        "module_args": {
            "src": "/path/to/file/HOSTNAME/Checklist/*.ckl"
        }
    },
    "msg": "file not found: /path/to/file/HOSTNAME/Checklist/*.ckl"
}

PLAY RECAP **********************************************************************************************************************************************************************************************************************************
fqdn    : ok=3    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0

이제 와일드카드가 지원되지 않는다는 것을 알고 있습니다. 누군가 루프를 수행해야 한다고 대답했지만 어떤 형태의 정규 표현식을 구현할 수 있는지 궁금합니다.

"src": "/path/to/file/HOSTNAME/Checklist/'RHEL8_[A-Za-z0-9]+.ckl'" 실행을 시도했지만 성공하지 못했습니다.

답변1

묻다:"...어떤 형태의 정규 표현식을 구현해 보세요."

답: 사용동기화. 내부에rsync_options:

  • "*"와 일치하는 모든 파일 제외
  • "*.ckl"과 일치하는 파일을 제외하지 마십시오.
    - ansible.posix.synchronize:
        mode: pull
        src: /tmp/ansible/{{ inventory_hostname }}/checklist/
        dest: /tmp/ansible/{{ inventory_hostname }}/checklist/
        rsync_opts:
          - "--include='*.ckl'"
          - "--exclude='*'"

예를 들어, 주어진 재고

shell> cat hosts
test_01
test_02
test_03

및 원격 파일

shell> ssh admin@test_01 ls -1 /tmp/ansible/test_01/checklist
a.ckl
b.ckl
x

shell> ssh admin@test_02 ls -1 /tmp/ansible/test_02/checklist
c.ckl
d.ckl
y

shell> ssh admin@test_03 ls -1 /tmp/ansible/test_03/checklist
e.ckl
f.ckl
z

요약된 등록 결과 제공(--check --diff로 실행)

ok: [test_01] => 
    ...
    msg: |-
      .d..tp..... ./
      >f+++++++++ a.ckl
      >f+++++++++ b.ckl
    rc: 0

ok: [test_02] => 
    ...
    msg: |-
      .d..tp..... ./
      >f+++++++++ c.ckl
      >f+++++++++ d.ckl
    rc: 0

ok: [test_03] => 
    ...
    msg: |-
      .d..tp..... ./
      >f+++++++++ e.ckl
      >f+++++++++ f.ckl
    rc: 0

이렇게 하면 파일이 컨트롤러로 "가져옵니다".

shell> tree /tmp/ansible/
/tmp/ansible/
├── test_01
│   └── checklist
│       ├── a.ckl
│       └── b.ckl
├── test_02
│   └── checklist
│       ├── c.ckl
│       └── d.ckl
└── test_03
    └── checklist
        ├── e.ckl
        └── f.ckl

테스트를 위한 완전한 플레이북 예시

- hosts: all

  tasks:

    - file:
        state: directory
        path: "/tmp/ansible/{{ item }}/checklist"
      loop: "{{ ansible_play_hosts_all }}"
      run_once: true
      delegate_to: localhost

    - ansible.posix.synchronize:
        mode: pull
        src: /tmp/ansible/{{ inventory_hostname }}/checklist/
        dest: /tmp/ansible/{{ inventory_hostname }}/checklist/
        rsync_opts:
          - "--include='*.ckl'"
          - "--exclude='*'"
      register: out
    - debug:
        var: out

관련 정보