使用ansible复制本地文件(如果存在)

Copy local file if exists, using ansible

我在一个项目中工作,我们使用 ansible 创建部署服务器集群。 我必须实现的任务之一是将本地文件复制到远程主机,前提是该文件在本地存在。 现在我正在尝试使用这个

来解决这个问题
- hosts: 127.0.0.1 
  connection: local
  tasks:
    - name: copy local filetocopy.zip to remote if exists
    - shell: if [[ -f "../filetocopy.zip" ]]; then /bin/true; else /bin/false; fi;
      register: result    
    - copy: src=../filetocopy.zip dest=/tmp/filetocopy.zip
      when: result|success

但这是失败的,并显示以下消息: 错误:任务 "copy local filetocopy.zip to remote if exists"

中缺少 'action' 或 'local_action' 属性

我试过用命令任务创建这个。 我已经尝试使用 local_action 创建此任务,但无法成功。 我发现的所有示例都没有将 shell 考虑为 local_action,只有命令示例,除了命令之外,它们都没有其他任何内容。 有没有办法使用 ansible 来完成这个任务?

将您的第一步更改为以下步骤
- name: copy local filetocopy.zip to remote if exists
  local_action: stat path="../filetocopy.zip"
  register: result    

更全面的回答:

如果您想在执行某些任务之前检查 local 文件是否存在,这里是完整的片段:

- name: get file stat to be able to perform a check in the following task
  local_action: stat path=/path/to/file
  register: file

- name: copy file if it exists
  copy: src=/path/to/file dest=/destination/path
  when: file.stat.exists

如果您想在执行某些任务之前检查 远程 文件是否存在,可以这样做:

- name: get file stat to be able to perform check in the following task
  stat: path=/path/to/file
  register: file

- name: copy file if it exists
  copy: src=/path/to/file dest=/destination/path
  when: file.stat.exists

这个怎么样?

tasks:
- copy: src=../filetocopy.zip dest=/tmp/filetocopy.zip
  failed_when: false

这会将文件复制到目标(如果本地存在)。如果它不存在,它什么都不做,因为错误被忽略了。

Fileglob 允许查找最终存在的文件。

- name: copy file if it exists
  copy: src="{{ item }}" dest=/destination/path
  with_fileglob: "/path/to/file"

如果您不习惯设置两个任务,您可以使用'is file'检查本地文件是否存在:

tasks:
- copy: src=/a/b/filetocopy.zip dest=/tmp/filetocopy.zip
  when: '/a/b/filetocopy.zip' is file

该路径是相对于 playbook 目录的,因此如果您引用角色目录中的文件,建议使用魔术变量 role_path。

参考:http://docs.ansible.com/ansible/latest/playbooks_tests.html#testing-paths