【问题标题】:Ansible unarchive module - pattern matching for 'src' parameterAnsible unarchive 模块 - 'src' 参数的模式匹配
【发布时间】:2017-03-08 16:21:33
【问题描述】:

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 本身内完成?)

【问题讨论】:

  • 是的,您需要使用find 任务获取文件名并使用其结果。

标签: deployment ansible continuous-deployment


【解决方案1】:

正如前面对您的问题的评论所指出的那样,另一种方法(假设 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 }}"

【讨论】:

  • 同意了 - 似乎是最好的选择。我还添加了一个完整性检查,以确保只匹配一个包:- name: ensure only a single service package is available fail: msg="the number of packages matching the service name pattern 'Service-*.tgz' must be exactly equal 1" when: "{{ find_result.files | length }} != 1"
【解决方案2】:

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

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

【讨论】:

  • 在 CI 中似乎是合理的,但是,这样的包在 CI 之外将无法使用。既然它解决了这个问题,我会接受它,如果没有更好的答案出现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-16
  • 1970-01-01
相关资源
最近更新 更多