Ansible 与通配符同步

Ansible Synchronize With Wildcard

我正在尝试使用通配符同步文件:

- name: Install Services jar
  synchronize: src="{{repo}}/target/all-services-*.jar" dest=/opt/company

我这样做是为了不必每次我们的版本号增加时都更新 ansible。但是,当它是 运行 时,这将引发文件未找到异常。 ansible 支持这个吗?如果是这样,我该怎么做?

如果文件名自动更改并且未在 ansible 变量中明确设置,您将希望通过其他方式识别文件名。我见过您下载包的 "latest" 版本的模式(许多存储库提供此功能)。然后一旦你有了这个文件,你总是在本地给它命名,你可以同步它——不需要通配符模式。

另一种选择是在某些机器可读注册表中查找最新版本的库。然后使用它通过全名引用文件并驱动需要确切文件名的任务。

如果我误解了你的问题,而你打算同步多个与你的通配符模式匹配的文件,你可以同步包含你的 src 模式 ({{repo}}/target/) 的整个目录,然后通过参数直接传给 rsync 以使用模式进行过滤。通过 synchronize module docs I see you can pass arguments directly to rsync by setting rsync-opts. In the rsync docs 我在网上发现你可以传递一个像 --include=all-services-*.jar 这样的标志来限制你发送的文件只发送那些匹配模式的文件。

希望对您有所帮助!

这可以通过ansible的with_lines来完成:

- name: Install services jar
  synchronize: src="{{item}}" dest=/opt/company/
  with_lines: "find {{ core_repo }}/service-packaging/target/ -name all-services*.jar | grep -v original"

如果您已经在使用 with_items 或相关的,那么您可能无法改用 with_lines。例如,如果您要 运行

- name: Install Services jar
  synchronize: src="{{repo}}/target/{{ item }}-*.jar" dest=/opt/company
  with_items:
    - service1
    - service2

当同步调用 rsync 时,它将 srcdest 括在引号中,这会破坏 wildcard/glob 扩展。

我已经能够 shell 直接通过 rsync 绕过此行为。

- name: Install Services jar
  shell: rsync -azPihv {{repo}}/target/{{ item }}-*.jar {{ inventory_hostname }}:/opt/company
  register: rsync_cmd
  changed_when: rsync_cmd.stdout.find('xfer') != -1
  with_items:
    - service1
    - service2

(根据您的 rsync,您可能需要使用 xfr 而不是 xfer。)

Ansible 模块 synchronize 使用 rsync 并通过参数 rsync_opts(自 1.6 起)支持 rsync 的自定义选项,可用于过滤文件。

示例:

- name: sync source code
  synchronize:
  src: "/path/to/local/src"
  dest: "{{lookup('env','HOME')}}/remote/src"
  rsync_opts:
  - "--include=*.py"
  - "--exclude=*.pyc"
  - "--delete"