Ansible unarchive 模块 - 'src' 参数的模式匹配

Ansible unarchive module - pattern matching for 'src' parameter

build 配置中,CI 服务器构建一个 Service 包,并为其分配特定的 Version ,然后归档到文件:Service-Version.tgz.

deploy 配置中,相同的 CI 服务器下载这种可变命名的包。此配置想要复制存档、解压缩并在某个主机上部署服务。

在 Ansible 代码中表达:

 - name: Unpack Service on remote host
   unarchive: src="{{ src_dir }}/Service-*.tgz" dest="{{ host_dest_dir }}"

理想情况下:Ansible 会尝试匹配模式中包含文件名的任何内容。

实际上,这是行不通的:

fatal: [127.0.0.1]: FAILED! => {"changed": false, "failed": true, "msg": "Unable to find '(...)/deploy/Service-*.tgz' in expected paths."}

如何让 Ansible 接受 'src' 的可变名称?

(我想我可以通过 grepping 目录创建一个注册真实姓名的任务,但也许这可以在 Ansible 本身中完成?)

如果您的 CI 服务器知道文件名并且 运行 是可靠的,那么您可以在命令行上设置文件名的版本,然后在您的任务中引用它:

ansible-playbook play.yml --extra-vars "version=${VERSION_FROM_CI_SERVER}"

正如前面对您的问题的评论所指出的,另一种方法(假设 Ansible 2+)是使用 find 模块。这看起来类似于:

- name: Find Service package
  find: paths="{{ src_dir }}" patterns="Service-*.tgz"
  register: find_result
- name: Unpack service on remote host
  unarchive: src="{{ item.path }}" dest="{{ host_dest_dir }}"
  with_items: "{{ find_result.files }}"