使用 Ansible 根据命名模式从主机获取多个文件

使用 Ansible 根据命名模式从主机获取多个文件

我在遥控器上有一个如下所示的文件夹。

> 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)的大量帮助下)

  1. 查找所有相关文件(find模块)
  2. 列出这些发现的清单(set_fact
  3. 根据该列表获取文件(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 }}"

相关内容