Ansible实践篇(三):Ansible常用模块:cron、synchronize、shell、service
一、Ansible cron模块
Ansible cron模块主要用于添加、删除、更新操作系统的crontab任务计划
cron模块使用详解:
- name:任务计划名称
- cron_file:替换客户端该用户的任务计划的文件
- minute:分(0-59, * ,*/2)
- hour:时(0-23, * ,*/2)
- day:日(1-31, * ,*/2)
- month:月(1-12, * , */2)
- weekday:周(0-6或1-7, *)
- job:任何计划执行的命令,state要等于present
- backup:是否备份之前的任务计划
- user:新建任务计划的用户
- state:指定任务计划present、absent
Ansible cron模块示例:
(1)基于cron模块,创建crontab任务计划,例如:让所有的后端服务器在每天的00:00点从172.25.70.250主机上用ntpdate同步实践,任务名称为:Ntpdate server for sync time,一定要注意这个定时服务,一定要在172.25.70.250配置好ntp服务器
示例代码为:ansible all -m cron -a "minute=0 hour=0 day=* month=* weekday=* name='Ntpdate server for sync time' job='ntpdate 172.25.70.250'"
结果为:
(2)backup=yes,表示开启备份,备份文件会存放在客户端/tmp/目录下面
示例代码为:ansible 172.25.70.1 -m cron -a "minute=0 hour=0 day=* month=* weekday=* name='Ntpdate server for sync time' backup=yes job='ntpdate www.lcl.com'"
结果为:
(3)删除crontab任务计划
示例代码为:ansible all -m cron -a "name='Ntpdate server for sync time' state=absent"
结果为:
二、Ansible synchronize模块
Ansible synchronize模块主要用于目录、文件的同步,主要基于rsync命令工具同步目录和文件
Ansible synchronize模块详解:
- compress:开启压缩,默认为开启
- archive:是否采用归档模式同步,保证源文件和目标文件属性一致
- checksum:是否效验
- dirs:以非递归的方式传送目录
- links:同步链接文件
- recursive:是否递归yes/no
- rsync_opts:使用rsync的参数
- copy_links:同步的时候是否复制链接
- delete:删除源中没有但目标存在的文件,使两边内容一样,以推送方为主
- src:源目录及文件
- dest:目标文件及目录
- dest_port:目标接收的端口
- rsync_path:服务的路径,指定rsync在远程服务器上执行
- rsync_remote_user:设置远程用户名
- –exclude=.log:忽略同步以.log结尾的文件,这个可以自定义忽略什么格式的文件,或者.txt等等都可以,但是由于这个是rsync命令的参数,所以必须和rsync_opts一起使用,比如
rsync_opts=--exclude=.txt
这种模式 - mode:同步的模式,rsync同步的方式push、pull,默认是推送push,从本机推送给远程主机,pull表示从远程主机上拿文件
Ansible synchronize模块示例
(1)常用的src为源目录,dest为目标目录,示例为将远程主机的/tmp/目录同步为本地Ansible服务器的/tmp/目录
示例代码:ansible 172.25.70.2 -m synchronize -a "src=/tmp/ dest=/tmp/"
因为默认只是把推送端想推送到的文件或者目录给到远程主机上面去,所以远程主机自身本来有的文件也还是存在的,做这个模块的时候,必须保证远程服务器上有rsync这个命令,否则ansible指定代码时会显示下图里面红色的那一部分报错,在远程服务器上安装rsync包以后,再次执行才执行成功
结果为:
下面这张图下面黑色的主机名为test1的主机,它的IP地址是172.25.70.2,安装了rsync软件包之后,从上面ansible的主机可以看到同步成功!
(2)compress=yes表示开启压缩,delete表示数据一致,rsync_opts表示同步参数,–exclude表示排除文件
示例代码为:ansible 172.25.70.2 -m synchronize -a "src=/tmp dest=/mnt compress=yes delete=yes archive=yes rsync_opts=--exclude=*.txt"
#这句表示把本地的/tmp目录以及里面除了.txt结尾的文件同步到172.25.70.2的/mnt目录里面,并且同步/tmp目录以及文件的属性,还要删除本地没有但远程主机有的文件
结果为:
可以看到本地源文件的属性等
可以看到同步过去的文件属性都和源文件相同,并且没有同步源文件里面以.txt结尾的两个文件,第一个目录是用ansible的话自动生成的,里面是ansible这个模块运行的python脚本以及工具包
三、Ansible shell模块
Ansible shell模块主要用于远程客户端上执行各种shell命令或者运行脚本,远程执行命令通过/bin/sh
环境来执行,支持比command更多的指令
shell模块详解:
- chdir:执行命令前,切换到该目录
- creates:当该文件存在时,不执行该步骤
- executable:使用shell环境执行脚本
- free_from:需要执行的脚本
- removes:当该文件不存在时,不执行该步骤
- warn:如果在ansible.cfg中存在告警,如果设定了false,不会告警此行
Ansible shell模块示例:
(1)远程执行shell脚本,并把结果追加至服务器/tmp/var.log文件,这种用shell执行而不用command,就是因为command不支持变量、重定向、管道符等操作
代码如下:ansible 172.25.70.2 -m shell -a "/bin/sh /mnt/test.sh >> /tmp/var.log"
结果为:
可以看到test.sh就是一个简单的列出/目录里面的内容
(2)执行之前切换目录,屏蔽警告信息,创建目录
代码示例为: ansible 172.25.70.2 -m shell -a "mkdir -p `date +%F` chdir=/tmp/ warn=no"
##这里是为了创建一个今天日期的目录,所以date +%F不是引号而是和shell脚本中使用命令时使用的反引号(我也不知道那个符号该怎么念,一般在键盘上上面数字行的最左边,tab键上面)
结果为:
(3)用shell可以使用管道符,比如查看远程客户端http服务是否启动,用默认的command模块就会报错,这里也显示了shell模块和command模块的区别
示例代码为:ansible 172.25.70.2 -m shell -a "ps -ef | grep http"
结果为:
四、Ansible service模块
Ansible service模块主要用于远程客户端各种服务管理,包括启动、停止、重启、重新加载等
service模块详解:
- enabled:是否开机启动服务
- name:服务名称
- runlevel:服务启动级别
- arguments:服务命令行参数传递
- state:服务操作状态,状态包括started、stopped、restarted、reloaded
Ansible service模块示例:
(1)远程启动http服务,当然服务器必须已经安装了想要控制的服务
示例代码为:ansible 172.25.70.2 -m service -a "name=httpd state=started"
结果为:
(3)将服务设置成开机自启动,这里也用httpd做测试
示例代码为:ansible 172.25.70.2 -m service -a "name=httpd enabled=yes"
结果为:测试的话可以把远程主机重启之后查看httpd是否启动