使用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
我在一个项目中工作,我们使用 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