Ansible与通配符同步

时间:2016-06-16 20:45:59

标签: ansible ansible-playbook ansible-2.x

我尝试将文件与通配符同步:

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

我这样做是因为每次我们的版本号遭遇碰撞时我都不必更新ansible。但是,这会在运行时抛出文件未找到的异常。 ansible支持这个吗?如果是这样,我该怎么办呢?

4 个答案:

答案 0 :(得分: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 :(得分:1)

如果您已使用with_items或相关内容,则可能无法使用with_lines。例如,如果您正在尝试运行

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

当synchronize调用rsync时,它会将srcdest包装在引号中,这会破坏通配符/ glob扩展。

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

答案 2 :(得分:0)

如果文件名自动更改且未在ansiable变量中明确设置,则您需要通过其他方式识别文件的名称。我已经看到了你下载"最新"包的版本(许多存储库提供此功能)。然后,一旦你有了这个文件,你总是在本地命名它,你可以同步它 - 不需要通配符模式。

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

如果我误解了您的问题并且您打算同步与您的通配符模式匹配的多个文件,则可以同步包含src模式({{repo}}/target/)的整个目录,然后通过直接向rsync的参数使用模式进行过滤。通过synchronize module docs我看到您可以通过设置rsync直接将参数传递给rsync-opts。在我在网上找到的rsync docs中,您可以传递--include=all-services-*.jar之类的标记,将您发送的文件限制为仅匹配模式的文件。

我希望这有帮助!

答案 3 :(得分:0)

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

示例:

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