Ansible - 获取中的正则表达式?

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_选项:

  • 排除所有匹配“*”的文件
  • 不排除与“*.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

相关内容