我正在创建一个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文件?我怎么能这样做?
答案 0 :(得分:1)
这对于为您编写代码来说太复杂了,所以这是一个概念性的答案:
在path
的{{1}}循环中packages
本地使用find
module。
展平结果以获取名为files_before
的变量中现有文件的路径列表。
使用问题中公布的build web packages
任务。
在find
上的path
上本地使用packages
模块(与第一项任务相同)。
展平结果以获取名为files_after
的变量中现有文件的路径列表。
在synchronize
和files_after
之间的copy
module循环中使用difference(不是files_before
)。
您可以在单独的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 }}"