1. 简述
先从我自身的情况来说,我不是运维人员,并且对linux操作也不是特别熟悉,所以工作中我使用ansible基本就是在平常的自动化部署中,而使用最多的模块就是copy模块。我使用copy模块也主要是来替换生产环境的配置文件。所以,这里我主要介绍一下copy模块。说实话,对于其他模块,我接触的也不多。
2.copy 模块的用法
2.1 官方概念
我们先看官方文档怎么说的copy这个模块
The copy' module copies a file from the local or remote machine to a location on the remote machine. Use the [fetch] module to copy files from remote locations to the local box. If you need variable interpolation in copied files, use the [template] module. Using a variable in the
content’ field will result in unpredictable output. For Windows targets, use the [win_copy] module instead.
2.2 参数描述
参数 | 描述 |
---|---|
src | 指定被copy的文件或目录 |
dest | 指定文件将被拷贝到远程主机的哪个目录中 |
force | 当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否强制覆盖,可选值有yes和no,默认值为yes,表示覆盖,如果设置为no,则不会执行覆盖拷贝操作,远程主机中的文件保持不变。 |
backup | 当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否对远程主机的文件进行备份,可选值有yes和no,当设置为yes时,会先备份远程主机中的文件,然后再将ansible主机中的文件拷贝到远程主机。 |
mode | 指定文件拷贝到远程主机后的权限,比如你想将权限设置为”rw-r–r–“,则可以使用mode=0644表示,如果你想要在user对应的权限位上添加执行权限,则可以使用mode=u+x表示 |
3. 示例
3.1 将主机文件复制到远程机器上某个目录下
more test/a.txt
执行copy命令
ansible all -m copy -a "src=/test/a.txt dest=/test/"
复制成功了。
这个时候如果我们再执行一次,可以看到结果发生了变化
在远程机器上也看到了这个文件
3.2 在主机上将文本内容复制到远程机器上文件中
3.2.1 执行命令
ansible all -m copy -a 'content="qqqqq\nwwww\n" dest="/test2/a_1.txt"'
3.2.2 结果异常
FAILED! => {
“ansible_facts”: {
“discovered_interpreter_python”: “/usr/bin/python”
},
“changed”: false,
“checksum”: “a9dd8f985a0e22e8ce07dc2e9ec61d92fdeb96f9”,
“msg”: “Destination directory /test2 does not exist”
}
这里说是远程主机没有这个目录,是不是很尴尬啊。
3.2.3 问题解决
这个时候需要使用file模块,先创建目录:
ansible all -m file -a 'path=/test2/ state=directory'
3.2.4 重新执行创建文件命令
3.2.4 重新执行创建文件命令
3.2.5 验证
远程机器上有了这个文件,文件中也是我们的内容。
3.3 将主机文件复制到远程机器上某个目录下,如果远程主机中已经存在该文件,并且文件内容与 ansible 主机中的源文件的内容不一致,则不执行拷贝操作,远程主机中的文件内容也不会被改变
3.3.1 修改主控机文件
3.3.2 执行命令
ansible all -m copy -a 'src="/test/a.txt" dest="/test/" force=no'
3.3.3 结果验证
通过上面的结果,我们看到,文件没有改变成功。我们现在去远程机器上看一下情况。
文件内容确实没有改变。
3.4 将主机文件复制到远程机器上某个目录下,如果远程主机中已经存在该文件,并且文件内容与 ansible 主机中的源文件的内容不一致,则执行拷贝操作,远程主机中的文件内容也会被改变,并且在远程文件夹中会生成一个备份文件
3.4.1 执行命令
ansible all -m copy -a 'src="/test/a.txt" dest="/test/" backup=yes'
3.4.2 结果验证
从上面的返回结果,我们看到文件已经改变了。现在去远程机器上看一下
文件被改变,并且生成了备份文件,验证符合预期。
3.5 copy文件时加入权限
3.5.1 执行命令
ansible all -m copy -a "src=/test/a.txt dest=/test/ mode=0421"
3.5.2 结果验证
执行前:
执行后:
我们看到发生了变化,符合预期。
3.5.3 linux权限小知识
可能有些同学对这个数字权限不是很清楚,这里简单说一下。
在Linu系统下用命令ll或者ls -la的时候会看到前面-rw-rw-r–一串字符,
r:read 代表读取权限 用数字4表示
w:write 代表写入权限 用数字2表示
x:excute 代表执行权限 用数字1表示
读取、写入、运行三项权限可以用数字表示,就是r=4,w=2,x=1。所以,-r—w—x用数字表示成421。
常用的一些Linux文件权限如下:
444 r–r–r–
600 rw-------
644 rw-r–r–
666 rw-rw-rw-
700 rwx------
744 rwxr–r–
755 rwxr-xr-x
777 rwxrwxrwx
以755为例:
1-3位7等于4+2+1,rwx,所有者具有读取、写入、执行权限;
4-6位5等于4+1+0,r-x,同组用户具有读取、执行权限但没有写入权限;
7-9位5,同上,也是r-x,其他用户具有读取、执行权限但没有写入权限。
4.小结
对于copy模块,我就写一下我自己平时常用的,仅供参考。