copy 模块
Ansible 的 copy 模块用于将本地文件复制到目标主机上。可以通过 copy 模块轻松地将单个文件或目录从控制机(Ansible 控制节点)复制到目标节点(受管节点)。copy 模块支持多种选项,允许你控制文件的权限、所有者、组等属性。
基本语法
命令行使用:
1
ansible centos -m copy -a "src=./install_python3/CentOS-Base.repo dest=/etc/yum.repos.d/CentOS-Base.repo"
在 Playbook 中使用
1
2
3
4
5---
- name: Copy a file to the target machine
copy:
src: ./install_python3/CentOS-Base.repo
dest: /etc/yum.repos.d/CentOS-Base.repo
常用选项
- src: 要复制的本地文件路径。这个文件位于控制机(本地机器)上。
- dest: 目标主机上要放置文件的路径。可以是一个文件,也可以是一个目录。如果目标是一个目录,文件将使用其源文件名进行保存。
- owner: 设置目标文件的所有者。可以是用户名或用户ID(UID)。
- group: 设置目标文件的所属组。可以是组名或组ID(GID)。
- mode: 设置文件的权限。格式为 UNIX 文件权限格式(如 0755)。
- backup: 如果为 yes,则在覆盖目标文件之前备份文件。备份文件将被放在默认的备份目录(通常是 /tmp)中。可以指定自定义备份目录。
- content: 如果指定了 content,则将 content 的值直接作为目标文件的内容,而不使用 src 文件进行复制。通常用于直接传递小的文本文件内容。
- force: 如果为
yes
,则即使目标文件已经存在,也会强制覆盖文件。默认为yes
。如果设置为no
,则只有在目标文件不存在时才会复制。 - remote_src: 如果源文件已经在目标主机上,可以将此选项设置为 yes,这样源文件就不会从控制机复制,而是从目标主机的路径中复制文件。此选项默认为 no
- delimiter: 当使用
content
参数时,可以指定一个定界符来分割多个文件内容
示例
复制单个文件,将本地的 myfile.txt 复制到目标主机的 /etc 目录下:
1
2
3
4- name: Copy myfile.txt to /etc
copy:
src: /home/user/myfile.txt
dest: /etc/myfile.txt复制文件并设置权限和所有者,将本地文件 myfile.txt 复制到目标主机,并设置文件的所有者、所属组和权限:
1
2
3
4
5
6
7- name: Copy myfile.txt and set permissions
copy:
src: /home/user/myfile.txt
dest: /etc/myfile.txt
owner: root
group: root
mode: '0644'使用 content 直接写入文件内容
1
2
3
4
5
6
7- name: Create a file with content
copy:
content: |
This is a test file.
It is created by Ansible.
dest: /tmp/testfile.txt
mode: '0644'复制目录中的所有文件
如果需要将目录中的所有文件复制到目标主机,可以使用
ansible.builtin.fetch
或synchronize
模块,copy
模块本身不支持递归复制目录。要将单个文件复制到目标主机的某个目录,可以使用1
2
3
4
5- name: Copy all files from local directory to remote directory
copy:
src: /home/user/mydir/
dest: /etc/mydir/
remote_src: yes备份并覆盖文件,如果要备份目标文件并确保它在复制后被覆盖:
1
2
3
4
5- name: Backup and copy file
copy:
src: /home/user/myfile.txt
dest: /etc/myfile.txt
backup: yes
总结
copy 模块在 Ansible 中非常有用,尤其是在部署配置文件、脚本或其他静态文件时。通过设置不同的选项,copy 可以满足大部分文件复制的需求,比如设置文件权限、所有者、是否备份等功能。