Ansible同步通配符

问题描述 投票:4回答:4

我试图同步使用通配符文件:

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

我这样做,这样我就没有ansible我们的版本号被撞到每次更新。然而,这将引发一个文件,未发现异常运行时。是否ansible支持呢?如果是的话,我该怎么办呢?

ansible ansible-playbook ansible-2.x
4个回答
2
投票

这可以用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"

1
投票

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

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

当同步调用rsync的,它包装在引号打破了通配符/水珠扩张srcdest

我已经能够掏出直接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)。


0
投票

如果文件名自动改变,而不是在ansible变量明确设置,你会想通过其他手段来识别文件的名称。我已经看到了你下载一个包的“最新”版本(许多库提供这种能力)的模式。然后,一旦你有一个文件,你总是命名为同样的事情在当地,你可以同步的是 - 无需通配符模式。

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

如果我误解你的问题,你打算同步匹配您的通配符模式的多个文件,你可以同步包含您src模式({{repo}}/target/),然后直接将参数传递给rsync使用模式来过滤整个目录。通过synchronize module docs我看你可以通过设置rsync直接传递参数给rsync-opts。在我在网上找到的,你可以通过一个标志像rsync docs限制文件--include=all-services-*.jar送你去只是那些与模式匹配的。

我希望这有帮助!


0
投票

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"
© www.soinside.com 2019 - 2024. All rights reserved.