我在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>
答案 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...
的重复并使一切更明确。