首页 > 解决方案 > 在目录远程主机中查找 Ansible 文件

问题描述

我正在尝试以特定顺序从目录执行脚本,每次迭代间隔为 90 秒。例如,我想在 /opt/scripts/ 下启动脚本,它有(SK-1.sh、SK-2.sh、PX.sh、N1.sh、N2.sh)。我想启动SK然后PX和最后N的脚本。

- name: execute scripts A
shell: "ls -ltr {{ item }}"
args:
  chdir: "/opt/scripts/"
with_fileglob:
- "/opt/scripts/*SK*.sh"
- "/opt/scripts/*PX*.sh"
- "/opt/scripts/*N*.sh"
loop_control:
  pause: 90

但是 fileglob 将仅在控制器主机(Ansible 塔)上查找这些脚本,因此无法正常工作。是否有某种过滤器可以在远程主机而不是控制器主机上使用?

我试图避免列出以前任务中的文件并注册要处理的项目。毕竟这变成了一个两步的任务。

标签: ansible

解决方案


问:启动脚本是 SK,然后是 PX,最后是 N。

A:Ansible 模块find既不保持模式的顺序,也不对结果进行排序。您必须自己迭代 glob 列表并对结果进行排序以达到所需的顺序。例如,创建一个包含任务的文件

shell> cat find_and_execute.yml
- find:
    paths: /tmp
    patterns: "{{ eitem }}"
  register: result
- debug:
    msg: "{{ '%H:%M:%S'|strftime }} Execute {{ item }}"
  loop: "{{ result.files|map(attribute='path')|list|sort }}"
  loop_control:
    pause: 3

并在剧本中使用它。例如

shell> cat pb.yml
- hosts: test_11
  tasks:
    - include_tasks: find_and_execute.yml
      loop:
        - 'SK*.sh'
        - 'PX*.sh'
        - 'N*.sh'
      loop_control:
        loop_var: eitem

  msg: 18:19:14 Execute /tmp/SK-1.sh
  msg: 18:19:17 Execute /tmp/SK-2.sh
  msg: 18:19:21 Execute /tmp/PX.sh
  msg: 18:19:24 Execute /tmp/N1.sh
  msg: 18:19:27 Execute /tmp/N2.sh

根据您的需要调整参数。


    - find:
        paths: /tmp
        patterns:
          - 'SK*.sh'
          - 'PX*.sh'
          - 'N*.sh'
      register: result
    - debug:
        msg: "{{ result.files|map(attribute='path')|list }}"

  msg:
  - /tmp/SK-2.sh
  - /tmp/SK-1.sh
  - /tmp/N2.sh
  - /tmp/N1.sh
  - /tmp/PX.sh

推荐阅读