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 }}"
在 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 }}"