이 파일의 매니페스트를 복사하여 다른 파일로 이동하기 위한 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