2017-01-31 2 views
0

У меня есть задача синхронизации в анзибле:анзибль синхронизации не выполняется, если родительские каталоги не создало

--- 
- 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 и или избегает меня, используя set_fact в то время сохраняя его DRY и переменный, объявленные в тех же ролях, что .yml потребляют Это?

ответ

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/ 

The LOCAL_PROJECT_DIRECTORY взял dirname в playbook_dir как проект построен как:

myproject 
    deploy 
     playbook.yml 
     roles 
      etc... 
    lib 
     etc... 
    src 
     etc... 

Это вдвойне приятно, как он удален повторение some/parent/directories и сделал все, что гораздо более явным.

1

Вот как работает rsync. Но вы можете прочитать об обходных решениях here.

Если вы собираетесь принять relative поведение с дот-слэш трюк, иметь в виду, что вы должны пройти полный путь к src в анзибль (иначе анзибль расширит его самостоятельно и ваш /./ трюк будет устранена).

Если вам необходимо восстановить 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) С современный Rsync на передающей стороне (начиная с 2.6.7), вы можете вставить точку и слэш в пути к источника, например: rsync -avR /foo/./bar/baz.c remote:/tmp/

+0

Эй, @ Константин, если вы хотите скопировать мой ответ в свой, я помету ваш как правильный и удалю мой и этот комментарий, вплоть до вас. Большое спасибо за ваш ответ! Это действительно помогло. – AJP

+0

@ AJP, спасибо, но я бы предпочел не. Я хочу сохранить текст ответа неповрежденным. –