安装ansible
选择yum自动安装,先配置好阿里云的yum源、epel源
yum install epel-release -y
yum install ansible -y
查看安装情况(查看配置文件、可执行命令)
rpm -ql ansible | grep -E '^/etc|^/usr/bin'
配置ssh免密登陆
在ansible主机上生成密钥
ssh-keygen //生成密钥
ssh-copy-id root@ip地址 //将密钥拷贝给客户机
一、远程拉取文件(fetch)
1.主机分组
目前ansible的配置分为A组B组,IP如下图:
[A]
192.168.0.106
[B]
192.168.0.107
[test]
A
B
2.fetct命令
从客户机远程拉取文件到ansible主机用到fetch命令,例如:
ansible A -m fetch -a "src=/etc/fstab dest=/xy/ansible/"
A:ansible配置中的A组
-m:调用指定命令
-a:用于传递模块所需要使用的参数
src:从客户机需要拉取的目标文件
dest:拉取到本机的什么地址
上述命令的执行结果如下:
可以看到changed一栏显示为ture,说明执行成功。
将文件内容随意添加一句,改变文件内容
再次使用ansible拉取同名文件到相同的地址,也会显示成功
但是会是绿色字体,changed:false。因为ansible只检测是否有这个文件,再次执行相同的命令时,ansible发现文件已经在对应目录中了,所以不会执行任何操作。
二、远程拷贝文件(copy)
copy的作用就是拷贝文件,copy是将ansible主机上的文件拷贝给远程客户机上。
1.常见的参数
参数 | 含义 |
src参数 | 用于指定需要copy的文件或者目录 |
dest参数 | 必选参数,指定被拷贝到远程主机上哪个目录 |
content | 直接指定文件内容,与src指令二选一 |
mode | 指定文件拷贝过去后的文件权限 |
2.举个栗子
用例—src、dest
[root@xyy xy]#ansible B -m copy -a "src=/xy/copy.txt dest=/xy/"
将ansible主机/xy目录里的copy.txt文件拷贝到B组客户机的/xy目录里(ps:克隆的虚拟机,目录都一样)
执行结果如下:
这个时候在B组客户机的/xy目录里查看copy.txt文件,拷贝成功
用例2—content
通过content直接写数据到客户机指定文件,指令如下:
[root@xyy xy]#ansible B -m copy -a 'content="12343132\n" dest=/xy/copy.txt'
在B组客户机查看文件内容:
注:如果将ansible主机中的copy.txt文件复制到远程主机上时,若远程主机已有相同文件,虽然文件内容不一致,但是ansible不会执行拷贝操作,远程主机上的copy.txt文件内容不会改变!
用例3—mode
通过mode选项直接设置拷贝到客户机的文件权限,指令如下:
[root@xyy ~]#ansible A -m copy -a "src=/xy/copy.txt dest=/xy mode=0700"
三、文件操作(file)
file命令可以完成创建、删除、修改文件或者目录等
1.常用参数
参数 | 含义 |
path | 必选参数。指定要操作的文件 |
state | —touch:创建文件 —directory:创建文件夹 —link:创建软链接 —hard:创建硬链接 —absent:删除文件或目录 |
recurse | recurse=yes时,将递归修改目录中的文件属性 |
mode | 同copy命令mode一样,修改文件或者目录权限 |
2.举个栗子
用例1—state=touch
ansible A -m file -a "path=/xy/testfile state=touch"
在A组客户机的/xy/目录下创建一个名为testfile的文件。
在A组客户机上查看:
如果再次在ansible主机上执行相同的命令依然会成功,只会改变文件的时间戳
用例2—state=directory
在A组主机上创建一个testdir的目录
ansible A -m file -a "path=/xy/testdir state=directory"
在A组主机上查看:
注:若目录已经存在时,该命令虽然会显示成功,但不做任何操作(包括时间戳也不改变)
用例3—state=link
link参数创建软连接。软连接是linux中一个常用命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接,可以不用复制一个文件,就可以在另一个文件夹打开这个文件。
在A组主机上test目录建立软链接,软链接名为linktest,执行下列命令:
ansible A -m file -a "path=/xy/linktestdir state=link src=/test"
在test目录创建一个1文件,在/xy/目录通过linktest软链接查看/test/1文件
用例4—state=hard
在A组主机上为testfile创建硬链接文件,链接名取为hardtest,执行下列命令:
ansible A -m file -a "path=/xy/hardtest state=hard src=/xy/testfile"
用例5—state=absent
absent可以删除远程主机上的指定文件或目录,命令如下:
ansible A -m file -a "path=/xy/hardtest state=absent"
用例6—recurse
递归修改远程主机一个目录的文件权限可以用recurse,将/xy/testdir目录及其下属文件的权限全部调成可读可写可执行,命令如下:
ansible A -m file -a "path=/xy/testdir mode=0777 recurse=yes"
四、追加文本到文件(blockinfile)
1.什么是blockinfile
blockinfile模块可以在目标文件里追加一段文本。
2.常用参数
参数 | 描述 |
path | 必要参数,选择需要更改的文件 |
block | 等同于‘content',需要添加的一段文本 |
marker | 自定义标记内容。在用blockinfile插入文件内容后,blockinfile会自动插入一对标记。 |
state | present:默认为present,执行插入或者更新操作 absent:从文件中删除对应标记的段落 |
insertbefore | 可以插入到任意行,或者通过正则表达式来匹配对应的行前面 |
insertafter | 默认情况下,文本块会插入到文件末尾。 可以插入到任意行,或者通过正则表达式来匹配对应的行后面 |
create |
3.举个栗子
用例1—path、block
如果想在A组客户机的/xy/testfile的文件末尾追加一行,可以使用以下命令:
ansible A -m blockinfile -a "path=/xy/testfile block='test file + 1'"
使用path选中目标主机的需要修改的文件,block是需要添加的文件内容。执行以上命令后,/xy/testfile的文件末尾会多出一行文本:
blockinfile除了添加了文本还加上了被标记的文本块。在#BEGIN ANSIBLE MANAGED BLOCK和#END ANSIBLE MANAGED BLOCK之间的就是我们添加的文本。
用例2—marker
如果想要自定义标记也是可以的,但标记必须“有头有尾”。测试如下:
ansible A -m blockinfile -a 'path=/xy/testfile block="test file + 2" marker="#{mark} changed"'
在相同的文件进行测试,marker可以用于自定义标记,命令中的“{mark}"就相当于是#BEGIN和#END,在{mark}之后的changed就是我们更改的内容。
注:如果使用相同的标记,但是追加的文件内容不一样,那么,对应标记内的文本内容会被更改,而不是插入新的文本块,这种方法用于更新标记文本块中的内容!!举个栗子:
ansible A -m blockinfile -a 'path=/xy/testfile block="test file + 3" marker="#{mark} changed"'
和上一段代码相同的marker,但是追加的文件内容更改。原本的'test file + 2'就变成了’test file + 3‘
用例3—state=absent
由于相同的标记对应的文本块已经在文件中了,若block的内容为空或者增加一句’state=absent‘,那么blockinfile就会删除对应标记的文本块(包括生成的标记),以下代码二选一:
ansible A -m blockinfile -a 'path=/xy/testfile block="" marker="#{mark} changed"'
ansible A -m blockinfile -a 'path=/xy/testfile marker="#{mark} changed" state=absent'
用例4—insertbefore
想要将文本块插入到文件首行,将insertbefore的值设置为BOF,BOF意为’begin of file‘文件的开始
ansible A -m blockinfile -a 'path=/xy/testfile block="遥遥领先" marker="#{mark} HHHH" insertbefore=BOF'
用例5—insertafter
将文本块插入到文件末尾,与默认情况一样。将insertafter的值设置为EOF,EOF意为’end of file‘文件的结束
ansible A -m blockinfile -a 'path=/xy/testfile block="遥遥领先" marker="#{test} HHHH" insertafter=BOF'
用例6—正则表达式匹配
使用正则表达式匹配行,将文本插入到“ansible”开头的行之后,举个栗子:
[root@xyy ~]#ansible A -m blockinfile -a 'path=/xy/testfile block="##########芜湖#########" marker="#{mark} test" insertafter="^ansible"'
backup备份文件
在操作文件前在同一个文件夹下进行备份,备份的文件会在原文件名的基础上添加时间戳。
ansible A -m blockinfile -a 'path=/xy/testfile block="$$$$$$$L O L$$$$$$$" insertafter="^#######" backup=yes'
create创建文件
如果指定的文件不存在时,可使用create创建它,举个栗子:
[root@xyy ~]#ansible A -m blockinfile -a 'path=/xy/YS block="this is YS file"te=yes'
五、行文本操作(lineinfile)
lineinfile模块,可以确保一行文本存在于文件中,如果文本本来就存在文件中,则不执行任何操作。若不存在,则默认在末尾加上这行文本。
1.常用参数
参数 | 含义 |
path | 必须参数,指定要操作的文件。 |
line | 使用此参数指定文本内容。 |
2.举个栗子
[root@xyy ~]#ansible A -m lineinfile -a 'path=/xy/testfile line="testfile + 1"'
六、command命令
批量查看客户机的主机名
ansible all -m command -a 'hostname'
1.chdir参数
在执行command命令前,先进入某个目录。
ansible all -m command -a 'pwd chdir=/etc'
ansible默认执行命令路径是/root,使用这个命令后就先进入了/etc目录再执行pwd
2.creates参数
在执行command命令前,先判断文件是否存在,若文件存在则跳过执行,不存在则执行,warn=False是取消警告信息
ansible all -m command -a 'mkdir -p /etc/myscripts creates=/etc/myscripts warn=False'
若/etc/myscripts目录不存在时,就会创建/etc/myscripts目录
存在时就会提示跳过操作
3.removes参数
ansible all -m command -a 'rm -rf /etc/myscripts/ removes=/etc/myscripts/ warn=False'
removes参数和creates参数是完全相反的。removes是判断文件存在则执行操作,不存在则跳过。
七、shell命令
shell命令也有chdir、creates、removes等参数和command命令的用法一致。
在客户机上批量执行shell命令但shell脚本必须存在客户机上
举个栗子
1.创建一个文件夹
2.在文件夹中创建sh脚本
3.sh文件写入脚本信息
4.添加可执行权限
5.执行脚本
ansible all -m shell -a 'mkdir -p /etc/hhh;echo 'hostname' > /etc/hhh/host.sh;chmod u+x /etc/hhh/host.sh;bash /etc/hhh/host.sh warn=False'
脚本文件就只需要输出各自的主机名
八、script模块
功能:把管理机的脚本远程传输到被管理机上执行。只需要在主机有一份脚本,就可以在所有被管理机上执行。
1.模块参数
2.举个栗子
准备一个sh脚本,授予可执行权限。
echo -e 'pwd\nhostname' > /xxx/localhost.sh //输出路径和主机名
chmod +x localhost.sh
远程的执行脚本,执行时不需要客户端存在脚本文件
ansible all -m script -a '/xxx/localhost.sh'
九、service模块
功能:远程管理服务的启动、停止
示范:
ansible all -m service -a "name=httpd state=started enabled=yes"
name:服务名称
state:状态,started启动、stopped停止、restarted重启服务
enabled:开机自启,yes是开启,no是关闭
十、cron模块
功能:远程管理定时任务
ansible all -m cron -a "minute=00 hour=01 day=* month=* name='提示信息' job=/www/1.sh state=present"
minute=00 hour=01 day=* month=* :每个月每一天的1点整执行命令
name:提示信息
job:执行的脚本,脚本文件需存在远程机本地
state:present=添加任务;absent=取消任务