我在遥控器上有一个如下所示的文件夹。
> ls -la
-rw-rw-r--. 1 postgres postgres 469 15. Aug 12:37 220815.sql
-rwxr-xr-x. 1 postgres postgres 82 30. Dez 2015 client-postgres
-rw-------. 1 postgres postgres 2327 16. Sep 14:26 logfile
-rw-rw-r--. 1 postgres postgres 0 10. Aug 08:46 new_bindir
-rwxr-xr-x. 1 postgres postgres 497 2. Mär 2021 .pg.env
-rw-------. 1 postgres postgres 680 16. Sep 13:07 .pg-service10.env
-rw-------. 1 postgres postgres 680 16. Sep 13:08 .pg-service11.env
-rw-------. 1 postgres postgres 680 16. Sep 16:25 .pg-service15.env
-rw-------. 1 postgres postgres 708 16. Sep 11:27 .pg-service_name.env
-rw-------. 1 postgres postgres 692 16. Sep 12:36 .pg-servicename.env
-rw-------. 1 postgres postgres 1050 16. Sep 11:27 .pg-service_name.env.bak
-rw-r--r--. 1 postgres postgres 797 18. Okt 2021 postgresql_rpm.service
-rw-r--r--. 1 postgres postgres 855 28. Okt 2021 postgresql.service
现在我需要从该文件夹中获取与以下项匹配的所有文件.pg-*.服务模式(根据此示例,结果将获取 6 个文件)。剧本针对单个主机运行。
然而,它看起来像是逻辑,即语言环境 cat(cat pg*.env
)不能被 ansible 正确解释。并且下面的操作不起作用,因为名为的文件/opt/db/postgres/bin/.pg*env
不存在。
- name: fetch all .env files to fetched
ansible.builtin.fetch:
src: /opt/db/postgres/bin/.pg*env
dest: fetched/
flat: true
become: yes
我不能使用循环,因为我无法预测明确的文件名。我只知道它们的名称遵循上面提到的模式。
这里有什么诀窍呢?
答案1
这是我通过 3 个步骤完成这项工作的方法(在 Ansible 邮件列表(包括 @Vladimir Botka)的大量帮助下)
- 查找所有相关文件(
find
模块) - 列出这些发现的清单(
set_fact
) - 根据该列表获取文件(
fetch
模块)
- name: finding all .pg-*.env files on the server
ansible.builtin.find:
paths: "/opt/db/postgres/bin"
hidden: true
recurse: true
file_type: any
patterns: '.pg*env'
register: found_files
become: true
- name: creating a list with the filenames
set_fact:
env_files: "{{ found_files.files | map(attribute='path') }}"
- name: fetch all .env files to fetched, based on the list created above
ansible.builtin.fetch:
src: "/opt/db/postgres/bin/{{ item }}"
dest: fetched/
flat: true
become: yes
loop: "{{ found_files.files | map(attribute='path') | map('basename') | list }}"