2017-10-16 78 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 }}" 
相关问题