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 时,它将 src
和 dest
括在引号中,这会破坏 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"
我正在尝试使用通配符同步文件:
- 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 时,它将 src
和 dest
括在引号中,这会破坏 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"