转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。
接《关于Ansible的模块 ①-CSDN博客》,继续学习和梳理Ansible的常用文件类模块
1. copy模块
从当前机器上复制文件到远程节点上,并且设置合理的文件权限。
参数 | 含义 |
src | 指定要copy的文件源路径 |
dest | 指定copy文件的目标路径,必须有 |
content | 当不使用src指定拷贝的文件时,可以使用content直接指定文件内容,与src二者必选一 |
force | 当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,可加force参数表示是否强制覆盖文件,可选值有yes和no。默认值为yes,表示覆盖;如果设置为no,则不会执行覆盖拷贝操作,远程主机中的文件保持不变。 |
backup | 当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否对远程主机的文件进行备份,可选值有yes和no,当设置为yes时,会先备份远程主机中的文件,然后再将ansible主机中的文件拷贝到远程主机。 |
owner | 指定文件拷贝到远程主机后的属主,但是目标主机上必须已存在该用户。 |
group | 指定文件拷贝到远程主机后的属组,但是目标主机上必须已存在该组。 |
mode | 指定文件拷贝到目标主机后的权限,如果想将权限设置为"rw-r--r--",则可以使用mode=0644表示(必须以0开始),如果想要在user对应的权限位上添加执行权限,则可以使用mode=u+x表示 |
copy模块在复制文件的时候会先比较一下文件的checksum,如果相同则不会复制,返回状态为SUCCESS;如果不同才会复制,返回状态为changed。
例如下面的例子,ansible主机和被管理主机的/tmp下都存在testsre.txt这个文件,但是里面的内容不完全一样,也是会复制成功,且不会改变被管理主机上testsre.txt这个文件原本的文件权限。
1)复制文件并修改文件权限(前提是目标服务器必须有对应的user和group):
2)复制前备份原文件
如果两个文件不同,且需要备份原文件,则加上backup=yes:
ansible all -m copy -a "src=/tmp/testsre.txt dest=/tmp/testsre.txt backup=yes"
执行结果:
2. template模块
如果复制的是静态文件,那么用copy模块就可以了。如果在复制的同时需要根据实际情况修改部分内容,则需要用到template模块。比如将带有参数的配置文件传递到目标地址等。
参数 | 含义 |
src | Ansible 控制器上 Jinja2 格式模板的路径。这可以是相对路径或绝对路径。文件必须使用 utf-8 编码,但可以使用 output_encoding 来控制输出模板的编码 |
dest | 在远程计算机上呈现模板的位置 |
backup | 创建一个包含时间戳信息的备份文件,以便在您以某种方式错误地破坏它时可以恢复原始文件 |
owner | 文件或目录的所有者 |
group | 文件或目录的组所有者 |
mode | 文件或目录的权限 |
1)一个简单的文件推送与系统变量获取
[root@test101 templates]# cat test.conf.j2 #创建一个.j2文件
my ip is {{ ansible_host }}
[root@test101 templates]#
#将test.conf.j2推送到目标主机,生成/tmp/ip文件
[root@test101 templates]# ansible all -m template -a "src=test.conf.j2 dest=/tmp/ip"
2)将远程主机的hostname写入其/tmp/hostname文件(这个文件原本不存在):
在ansible主机创建如下文件:
[root@test101 test]# tree
.
├── hostname.yml
└── templates
└── test.j2
1 directory, 2 files
[root@test101 test]#
[root@test101 test]# cat hostname.yml
---
- name: Write hostname
hosts: all
tasks:
- name: write hostname using jinja2
ansible.builtin.template:
src: templates/test.j2
dest: /tmp/hostname
[root@test101 test]#
[root@test101 test]# cat templates/test.j2
My name is {{ ansible_facts['hostname'] }}
[root@test101 test]#
执行yaml文件:
3. file模块
fle 模块可以用来设置远程主机上的文件、软链接(symlinks)和文件夹的权限,也可以用来创建和删除它们。
参数 | 含义 |
path | 指定远程服务器的路径,也可以写成‘dest’,‘name’ |
state | 指定操作,可以将值设定为: directory:创建目录; touch:创建文件; link:创建软连接; hard:创建硬连接; absent:删除目录文件或链接 |
mode | 文件复制到远程并设定权限,默认file=644,directory=755 |
owner | 文件复制到远程并设定属主,默认为root |
group | 文件复制到远程并设定属组,默认为root |
recurese | 递归修改 |
1)改变文件权限
mode 参数既可以直接赋值数字权限(必须以0开头),还可以用来增加和删除权:
#将目标主机/tmp/test目录的权限设置为sre:sre,权限改为777
ansible all -m file -a "path=/tmp/test state=directory mode=0777 owner=sre group=sre"
执行效果:
还可以通过如下方式修改权限:
ansible all -m file -a "path=/tmp/test state=directory mode="u=rw,g=r,o=r" owner=sre group=sre"
ansible all -m file -a "path=/tmp/test state=directory mode="u+x,o+wr" owner=sre group=sre"
2)创建文件软链接
注意,这里的src和dest参数的含义和copy不一样。file模块里操作的都是远程节点上的文件。
ansible all -m file -a "src=/tmp/test dest=/tmp/test1 state=link"
若加上owner和group字段,则会创建一个软连接并修改源文件的属主信息:
3)创建一个新文件
创建一个文件并指定属主和权限:
ansible all -m file -a 'path=/tmp/test/sre.txt state=touch mode=0400 owner=sre group=sre'
4)创建一个目录
创建一个指定了owner和group,并设置了权限的目录
ansible all -m file -a 'path=/tmp/sre state=directory mode=0400 owner=sre group=sre
5)删除文件
ansible all -m file -a "path=/tmp/test1 state=absent"
未完待续......