如果尚未创建父目录,则Ansible同步失败

时间:2017-01-31 15:29:45

标签: ansible

我在ansible中有一个同步任务:

---
- name: Copy over code - lib
  synchronize:
    src: ../lib/some/parent/directories/
    dest: ~/project/lib/some/parent/directories/

此操作失败,因为目标缺少~/project/lib/some/parent/但是否则成功。我做了以下工作:

---
- set_fact:
    directory_lib_dest: ~/project/lib/some/parent/directories/
- name: Create directories
  file: path={{ item }} state=directory
  with_items:
    - "{{ directory_lib_dest }}"
- name: Copy over code - lib
  synchronize:
    src: ../lib/some/parent/directories/
    dest: "{{ directory_lib_dest }}"

是否有一个更好的解决方案可以使用ansible synchronize module使用soley,或者避免使用set_fact,同时保持DRY和变量声明在同一角色.yml中消耗它? / p>

2 个答案:

答案 0 :(得分:1)

这就是rsync的工作原理。但是你可以阅读有关变通方法here

如果您要使用 dot-slash 技巧采用relative行为,请记住您应该在Ansible中将完整路径传递给src(否则Ansible会扩展它单独使用你的/./技巧。

如果您需要重新创建lib/some/parent/directories/,您的任务可能如下所示:

在实际使用之前进行测试!

- synchronize:
    src: '{{ playbook_dir }}/./lib/some/parent/directories/'
    dest: ~/project/
    rsync_opts: 
      - '--relative'

正如我所说src: .././lib/some/parent/dir无效,我们需要完整路径(因此我使用playbook_dir魔术变量。)

摘自rsync手册页relative

  

要限制发送的路径信息量,您有几个选项:(1)With                 发送端的现代rsync(从2.6.7开始),你可以插入一个点和一个斜杠                 源路径,如下所示:rsync -avR /foo/./bar/baz.c remote:/tmp/

答案 1 :(得分:0)

非常感谢康斯坦丁的回答,我最终使用了:

---
- name: Set name of local and remote project directory
  set_fact:
    LOCAL_PROJECT_DIRECTORY:  "{{ playbook_dir | dirname }}"
    REMOTE_PROJECT_DIRECTORY: "{{ ansible_env.HOME }}/project-remote-dir/"
- name: Create remote project directory {{ REMOTE_PROJECT_DIRECTORY }}
  file: path={{ REMOTE_PROJECT_DIRECTORY }} state=directory
- name: Copy over code
  synchronize:
    src: "{{ LOCAL_PROJECT_DIRECTORY }}/./{{ item }}"
    dest: "{{ REMOTE_PROJECT_DIRECTORY }}"
    rsync_opts:
      - "--relative"
  with_items:
    - lib/some/parent/directories/
    - src/some/other/directories/

LOCAL_PROJECT_DIRECTORY获取dirname的{​​{1}},因为项目结构如下:

playbook_dir

这是非常好的,因为它删除了myproject deploy playbook.yml roles etc... lib etc... src etc... 的重复并使一切更明确。