ansible - 在目录远程主机中查找 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 塔)上查找这些脚本,因此无法正常工作。是否有某种过滤器可以在远程主机而不是控制器主机上使用?
我试图避免列出以前任务中的文件并注册要处理的项目。毕竟这变成了一个两步的任务。
解决方案
问:“启动脚本是 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
推荐阅读
- c++ - int **arr =new int [ n] 之间的不同;和int a[i][j]?
- r - 不能用小标题分组
- r - R 编程中奇怪的 _for_ 循环行为
- tensorflow - 使用 ADAM 优化器时真的有必要调整/优化学习率吗?
- c# - MessageAppService 类不能有多个基类“Hub”和“AsyncCrudAppService”
- matlab - 出现错误时立即添加调试点 MATLAB
- python - 在某个选项之后终止选项列表
- javascript - 如何自定义 Yandex 地图 api 控件?
- docker-machine - docker-machine 时间比我的 macbook 提前 4 小时:容器 - UTC,macbook - EDT
- rest - 当 SOAP 和 RESTful 战争都捆绑在单个 EAR 中并部署在 WebSphere 中时,WebServiceContext 为空