【问题标题】:Ansible Synchronize With WildcardAnsible 与通配符同步
【发布时间】:2019-02-07 22:30:13
【问题描述】:

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

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

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

【问题讨论】:

  • 我认为这是逃避 * src="{{repo}}/target/all-services-{{ '*' }}.jar" 的问题,我认为这可能有效。
  • @rayray84 不幸的是,不。似乎,当 ansible 调用 rsync 时,路径用双引号括起来,例如“foo/target/all-services-*.jar”,这会破坏通配符扩展

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


【解决方案1】:

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"

【讨论】:

    【解决方案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"
    

    【讨论】:

    • 如果要保留目录结构,使用 find 会出现问题。
    【解决方案3】:

    如果您已经在使用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。)

    【讨论】:

      【解决方案4】:

      如果文件名自动更改并且未在 ansible 变量中显式设置,则您需要通过其他方式识别文件名。我已经看到了下载“最新”版本包的模式(许多存储库都提供了这种能力)。然后,一旦您拥有该文件,您始终可以在本地将其命名为相同的名称,并且您可以同步该文件 - 不需要通配符模式。

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

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

      我希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-13
        • 2019-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-12
        相关资源
        最近更新 更多