我正在构建一个 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
问:“获取......实现某种形式的正则表达式。”
- 排除所有匹配“*”的文件
- 不排除与“*.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