2017-10-16 77 views
0

我正在創建一個Ansible操作手冊,它構建了一些代碼並將結果複製到我的服務器。像這樣:Ansible:如何獲取由shell腳本新創建的文件?

- name: build web packages 
    local_action: 
    script build.sh 
    chdir: {{ item.path }}/build.sh 
    with_items: {{ packages }} 

- name: upload static files 
    synchronize: 
    # This should be a loop 
    src: {{ item.path }}/built_files # How to get output files 
    dest: {{ deploy_dir }}/{{ item.name }} 

除了構建文件,build目錄中還有一些其他文件,我不想複製它們。

不同的包可能會建立到不同的文件夾,所以也許我需要監視我的本地目錄和diff文件?我怎麼能這樣做?

+0

我正在努力寫循環...也許我會自己回答這個問題,如果我成功了。現在我發現「Include」指令適合我的情況。 – zstbsqx

+0

您剛剛刪除了一條重要註釋,其中指定了您不希望**複製構建之前存在的文件。你能決定你的目標是什麼嗎? – techraf

+0

好吧,我認爲我們刪除了評論以清晰地評論。我在這裏沒有找到類似的問題,所以我想分享給需要它的人。我很抱歉誤導。 – zstbsqx

回答

1

這是太複雜,編寫代碼給你,所以一個概念性的答案:

  1. 使用find module上本地path在遍歷packages

  2. 展平結果以獲取名爲files_before的變量中現有文件的路徑列表。

  3. 使用build web packages任務發佈在您的問題。

  4. 使用find本地模塊path模塊在packages(與第一個任務相同)的循環中。

  5. 展平結果以獲取名爲files_after的變量中現有文件的路徑列表。

  6. 使用copy module(未synchronize)在一個循環中通過differencefiles_afterfiles_before之間。

您可以實現在不同的set_fact任務,或直接在最後一個任務了with_items聲明壓扁。

您可能還必須使用path filters和字符串操作將路徑轉換爲相對路徑以指定目標目錄。現在


,如果你的生成過程還創建子目錄,並要保留結構,添加相當於上面那些任務,但限制find範圍目錄,並使用file module對目標機器創建它們。


如果您認爲上述看起來很複雜,但是請記住您指定了需求和工具。除此之外,整個遊戲只能運行一次(除非您在遊戲中早些時候刪除並重新創建了本地存儲庫)。

0

我也想出了一個使用時間戳的想法。

# main.yaml 
- name: build and upload packages 
    include: web.yaml  # Use include_tasks if version >= 2.4 
    with_items: 
    - name: package1 
     path: path1  # build directory 
    - name: package2 
     path: path2 
    ... 
    loop_control: 
    loop_var: package 

# web.yaml 
- name: record begin timestamp 
    local_action: command date +%s 
    register: build_begin_ts 

- name: build packages 
    local_action: 
    module: command bash build.sh  # Use script module if version >= 2.4 
    chdir: "{{ package.path }}" 

- name: record done timestamp 
    local_action: command date +%s 
    register: build_done_ts 

- name: find built files 
    local_action: 
    module: find 
    paths: "{{ package.path }}" 
    file_type: any 
    recurse: yes 
    age: "{{ (build_begin_ts.stdout | int) - (build_done_ts.stdout | int) }}s" 
    register: built_files 

- name: upload built files 
    copy: 
    src: "{{ item.path }}" 
    dest: "{{ target_path }}/{{ item.path | basename }}" 
    with_items: "{{ built_files.files }}" 
相關問題