我试图同步使用通配符文件:
- name: Install Services jar
synchronize: src="{{repo}}/target/all-services-*.jar" dest=/opt/company
我这样做,这样我就没有ansible我们的版本号被撞到每次更新。然而,这将引发一个文件,未发现异常运行时。是否ansible支持呢?如果是的话,我该怎么办呢?
这可以用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
。
我已经能够掏出直接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
(您可能需要使用XFR的,而不是取决于你的rsync XFER)。
如果文件名自动改变,而不是在ansible变量明确设置,你会想通过其他手段来识别文件的名称。我已经看到了你下载一个包的“最新”版本(许多库提供这种能力)的模式。然后,一旦你有一个文件,你总是命名为同样的事情在当地,你可以同步的是 - 无需通配符模式。
另一种选择可能是查找最新版本的库在一些机器可读的注册表。然后使用由它的全名来引用文件和驱动器需要的确切文件名的任务。
如果我误解你的问题,你打算同步匹配您的通配符模式的多个文件,你可以同步包含您src
模式({{repo}}/target/
),然后直接将参数传递给rsync
使用模式来过滤整个目录。通过synchronize module docs我看你可以通过设置rsync
直接传递参数给rsync-opts
。在我在网上找到的,你可以通过一个标志像rsync docs限制文件--include=all-services-*.jar
送你去只是那些与模式匹配的。
我希望这有帮助!
synchronize
使用rsync
和支持定制选项rsync
通过参数rsync_opts
(自1.6)Ansible模块其可用于过滤文件。
例:
- name: sync source code
synchronize:
src: "/path/to/local/src"
dest: "{{lookup('env','HOME')}}/remote/src"
rsync_opts:
- "--include=*.py"
- "--exclude=*.pyc"
- "--delete"