文章目录
自动化运维工具ansible常用模块之文件操作(fetch & copy模块)
1.实验环境
首先配置好ansibel清单:
vim /etc/ansible/hosts
[testA]
server2
server3
[testB]
server4
[test:children]
testA
testB
2.fetch模块
fetch模块中参数作用:
dest:指定拉取文件到本地以后,文件存放的位置
src:指定从受管主机中拉取哪个文件
调用模块的同时传入参数:把testA组受管主机中的/etc/fstab拉取到本机的/testdir/ansible中
ansible testA -m fetch -a "src=/etc/fstab dest=/testdir/ansible"
查看到"changed": true,说明拉取成功(字体为黄色)
注意:/testdir/ansible目录原本并不存在
再次拉取:
虽然会有SUCCESS字样,但并不代表已经完成了拉取动作,由"changed": false可以知道并未发生改变,而SUCCESS字样只是代表该动作已经进行过了,或者说该目录中已经有需要拉取的文件了,这就是ansible的幂等性
md5sum校验的应用:
如果此时我们改变文件的内容,但文件名和目录都还存在,ansible是否会进行拉取这一动作呢?
cd /testdir/ansible/server2/etc/
echo "hello nihao" >> fstab
ansible testA -m fetch -a "src=/etc/fstab dest=/testdir/ansible"
可以看到server2进行了拉取的动作,而server3没有。这是因为server2的md5sum改变了,这就是md5sum校验的应用。
3.copy模块
copy模块与fetch模块的区别:
见名知义,copy模块的作用就是拷贝文件,它与之前介绍的fetch模块类似,不过,fetch模块是从远程主机中拉取文件到ansible主机,而copy模块是将ansible主机上的文件拷贝到远程主机中
copy模块参数:
src参数:用于指定需要copy的文件或目录
dest参数:用于指定文件将被拷贝到远程主机的哪个目录中,dest为必须参数
content参数:当不使用src指定拷贝的文件时,可以使用content直接指定文件内容,src与content两个参数必有其一,否则会报错。
force参数:当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否强制覆盖,可选值有yes和no,默认值为yes表示覆盖,如果设置为no,则不会执行覆盖拷贝操作,远程主机中的文件保持不变。
backup参数:当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否对远程主机的文件进行备份,可选值有yes和no,当设置为yes时,会先备份远程主机中的文件,然后再将ansible主机中的文件拷贝到远程主机。
owner参数:指定文件拷贝到远程主机后的属主,但是远程主机上必须有对应的用户,否则会报错。
group参数:指定文件拷贝到远程主机后的属组,但是远程主机上必须有对应的组,否则会报错。
mode参数:指定文件拷贝到远程主机后的权限,如果你想将权限设置为"rw-r–r--", 则可以使用mode=0644表示,如果你想要在user对应的权限位,上添加执行权限,则可以使用mode=u+x表示
copy模块应用
cd /testdir
touch copytest
echo 'hellp world' > copytest
cat copytest
在远程主机中:
cd /opt/
touch copytest
echo 'hello world' > copytest
cat copytest
当文件内容不一致时,直接覆盖:
ansible testB -m copy -a "src=/testdir/copytest dest=/opt"
当文件内容一致时,不进行copy动作:
使用content参数指定文件内容:
ansible testB -m copy -a "content="westos\nlinux\n" dest=/opt/test"
改变远程主机中copytest内容:
echo "hello-ansible" >>copytest
当文件内容不一致时,不覆盖:
ansible testB -m copy -a "src=/testdir/copytest dest=/opt force=no"
查看文件内容并没有改变
当文件内容不一致时,先备份,再覆盖:
ansible testB -m copy -a "src=/testdir/copytest dest=/opt backup=yes"
查看到文件内容改变,但目录中多了备份文件
指定文件拥有者:
指定拥有者的前提条件是远程主机中要有该用户,在远程主机中创建用户:
useradd onion
id onion
当远程主机中不存在要拷贝的文件时,直接进行拷贝:
cd /testdir
touch westos
ansible testB -m copy -a "src=/testdir/westos dest=/opt owner=onion"
当远程主机中存在要拷贝的文件时,不进行拷贝动作,单纯的修改拥有者:
ansible testB -m copy -a "src=/testdir/copytest dest=/opt owner=onion"
查看到copytest文件的拥有者变为onion,但文件的时间戳并没有改变,说明没有进行拷贝动作,单纯的修改了拥有者
指定文件所属组:
当远程主机中存在要拷贝的文件时,不进行拷贝动作,单纯的修改所属组:
ansible testB -m copy -a "src=/testdir/copytest dest=/opt group=onion"
指定文件权限:
touch hh
ansible testB -m copy -a "src=/testdir/hh dest=/opt mode=0640"