Ansible:如何获取shell脚本新创建的文件?

时间:2017-10-16 01:05:16

标签: python ansible

我正在创建一个Ansible playbook,它将一些代码和副本结果构建到我的服务器上。像这样:

- 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 }}

除了构建文件外,构建目录中还有一些其他文件,我不想复制。

不同的软件包可能会构建到不同的文件夹中,所以我可能需要监控本地目录和diff文件?我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

这对于为您编写代码来说太复杂了,所以这是一个概念性的答案:

  1. path的{​​{1}}循环中packages本地使用find module

  2. 展平结果以获取名为files_before的变量中现有文件的路径列表。

  3. 使用问题中公布的build web packages任务。

  4. find上的path上本地使用packages模块(与第一项任务相同)。

  5. 展平结果以获取名为files_after的变量中现有文件的路径列表。

  6. synchronizefiles_after之间的copy module循环中使用difference(不是files_before)。

  7. 您可以在单独的set_fact任务中实施展平,也可以直接在上一个任务的with_items声明中实施展平。

    您可能还必须使用path filters和字符串操作将路径转换为相对路径以指定目标目录。

    现在,如果您的构建过程也创建子目录并且您想要保留结构,请添加与上述相同的任务,但将find范围限制为目录并使用file module在目标上创建它们机等。

    如果您认为上述内容看起来很复杂,那么请记住您指定了要求和工具。

    最重要的是,整个游戏只能运行一次(除非您在游戏前面删除并重新创建了本地存储库)。

答案 1 :(得分: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 }}"