目录
一、ansible的command模块
1.ad-hoc
2.playbook
3.command模块
二、ansible的shell模块
1.shell模块帮助
2.shell模块支持的参数和解释
3.简单试验
4.批量远程执行脚本
三、script模块
1.script模块帮助
2.shell模块支持的参数和解释
3.实践
四、ansible文件操作模块
1.copy模块
2.file模块
3.yum模块
4.system模块
5.cron模块
五、ansible剧本
一、ansible的command模块
ansible实现批量化主机管理的模式,主要有两种
- 利用ansible的纯命令行实现的批量管理,ad-hoc模式 ----- 好比简单操作
- 利用ansible的playbook剧本来实现批量管理,playbook剧本模式 ---- 好比复杂操作
1.ad-hoc
ansible的ad-hoc模式是ansible的命令行形式,也就是处理一些临时的,简单的任务,可以直接使用ansible的命令行来操作比如
- 临时批量查看被管理机器的内存情况,cpu负载情况,网络情况
- 比如临时的分发配置文件等等
2.playbook
ansible的playbook模式是针对比较具体,且比较大的任务,那么你就得实现写好剧本,应用场景
- 一键部署rsync备份服务器
- 键部署Inmp环境
3.command模块
作用:在远程节点上执行一个命令
- ansible-doc-s command 查看该模块支持的参数
- chdir:在执行命令之前,先通过cd进入该参数指定的目录
- creates:在创建一个文件之前,判断该文件是否存在,如果存在了则跳过前面的东西,如果不存在则执行前面的动作
- free_form:该参数可以输入任何的系统命令,实现远程执行和管理
- removes:定义一个文件是否存在,如果存在了则执行前面的动作,如果不存在则跳过动作
- command模块是ansible的默认基本模块,也可以省略不写,但是要注意如下的坑
- 使用command模块,不得出现shel变量 name,也不得出现特殊符号>、;这些符号command模块都不认识,如果你想用前面指定的变量,特殊符号,请使用 shell模块,command模块不适用这种场景
ansible manage -m command -a 'date'
切换目录
ansible manage -m command -a 'pwd chdir=/tmp/'
判断目录是否存在
ansible manage -m command -a 'pwd chdir=/tmp/'
ansible manage -m command -a 'pwd removes=/files'
warn报警
这里有个warn警告,我们可以通过加warn=False消除这个警告
ansible manage -m command -a 'pwd creates=/tmp'
二、ansible的shell模块
1.shell模块帮助
作用:在远程机器上执行命令 (复杂的命令)
了解模块用法的渠道
- linux命令行里面通过 ansible-doc
- ansible官网查看帮助信息ansible.builtin.shell module – Execute shell commands on targets — Ansible Documentation
2.shell模块支持的参数和解释
- chdir 在执行命令之前,通过cd进入该参数指定的目录
- creates 定义一个文件是否存在,如果存在则不执行该命令,如果存在该文件,则执行shell命令
- free_form 参数信息中可以输入任何的系统指令,实现远程管理
- removes 定义一个文件是否存在,如果存在该文件,则执行命令,如果不存在,则跳过
3.简单试验
两台被管理机上添加两个后台程序
ping 192.168.0.103 > /dev/null &
ps -ef | grep ping | grep -v grep
ping 192.168.0.103 > /dev/null &
ps -ef | grep ping | grep -v grep
管理机
ansible manage -m shell -a "ps -ef|grep ping|grep -v grep"
4.批量远程执行脚本
该需要执行的脚本,必须要求在客户端机器上存在,否则会报错文件不存在,这是shell模块的特点,是因为还有一个专门执行脚本的模块
步骤:
- 创建文件
- 创建shell脚本文件
- 赋予脚本可执行权限
- 执行脚本
- 忽略warn信息
思路分析
最好所有的操作都是在 管理机器上,也就是(老板)这台机器 m01上进行远程的,批量化操作
ansible manage -m shell -a "mkdir -p /server/myscripts/; echo 'hostname'> /server/myscripts/hostname.sh; chmod +x /server/myscripts/hostname.sh; cd /server/myscripts/; bash hostname.sh; warn=False"
弊端就是需要shell脚本存在于被管理机器,才能执行
三、script模块
1.script模块帮助
功能:吧管理机器上的脚本远程的传输到备管理节点上去执行
比起shel模块,script模块功能更强大,在管理机器本地有一份脚,就可以在所有被管理节点上去运行
- linux命令行里面通过 ansible-doc
- ansible官网查看帮助信息ansible.builtin.script module – Runs a local script on a remote node after transferring it — Ansible Documentation
2.shell模块支持的参数和解释
- chdir 在执行命令之前,通过cd进入该参数指定的目录
- creates 定义一个文件是否存在,如果存在则不执行该命令,如果存在该文件,则执行shell命令
- free_form 参数信息中可以输入任何的系统指令,实现远程管理
- removes 定义一个文件是否存在,如果存在该文件,则执行命令,如果不存在,则跳过
3.实践
cd /myshell/
echo -e "pwd\nhostname" > shell1.sh
cat shell1.sh
chmod -x shell1.sh
ansible manage -m script -a "/myshell/shell1.sh"
四、ansible文件操作模块
1.copy模块
作用:复制文件数据到远程主机
ansible-doc -s copy #查看copy模块的参数用法
参数解释如下
copy模块是远程推送数据的模块,只能把管理节点上的数据,推送给远程节点,无法拉取数据到本地
实际案例
吧管理节点上的文件数据,发给被管理节点
ansible manage -m command -a "useradd user"
ansible manage -m copy -a "src=/etc/hosts dest=/tmp/hosts owner=user group=user mode=0666"
内容添加
ansible manage -m copy -a "content='content hosts_ansible\n' dest=/tmp/1.txt backup=yes"
2.file模块
作用,创建,修改文件,目录的属性
ansible-doc -s file #查看模块详细信息与用法
file模块常用的参数解释:
- group 定义文件/目录的 属组
- owner 定义属主
- mode 定义权限
- path 必选参数,定义文件路径
- dest 创建出来的软连接 它的路径
- src 定义源文件路径,主要用于创建link类型文件使用
- state 参数:
- file: 如果目标文件不存在,那么不会创建该文件
- touch: 如果文件不存在,则创建一个新的文件,如果文件已经存在了,则修它的最后修改时间
- directory:如果目录不存在,那么会创建目录
- link: 用于创建软连接类型
- absent :删除目录,文件或者取消连接
创建目录
ansible manage -m file -a "dest=/tmp/dir1 "
ansible manage -m file -a "dest=/tmp/dir1 state=directory"
远程批量生成文件
ansible manage -m file -a "dest=/tmp/dir1/1.txt mode=666 state=file"
这个会报错,因为文件不存在
ansible manage -m file -a "dest=/tmp/dir1/1.txt mode=666 state=touch owner=user group=user"
创建软链接
ansible manage -m file -a "src=/etc/hosts dest=/tmp/hosts_link state=link"
3.yum模块
在使用ansible的yum模块时,state选项有如下几种:
- absent
- installed
- latest
- present
- removed
比较疑惑的是present 和installed,absent和removed的区别,其实他们含义是一样的,源码:
if state in ['installed','present']:
if disable_gpg_check:
yum_basecmd.append('--nogpgcheck")
res = install(module, pkgs, repoq, yum_basecmd, conf_file, en_repos, dis_repos)
elif state in ['removed','absent']:
res = remove(module, pkgs,repoq, yum_basecmd, conf_file, en_repos, dis_repos)
elif state == 'latest':
if disable_gpg_check:
yum_basecmd.append('--nogpgcheck')
res = latest(module, pkgs, repoq, yum_basecmd, conf_file, en_repos, dis_repos)
else:
# should be caught by AnsibleModule argument_spec
module.fail_json(msg-"we should never get here unless this all
"failed",changed=False, results='',errors='unexpected state')
return res
批量检查所有被管理节点是否安装了nginx服务
ansible manage -m shell -a "rpm -qa nginx warn=false"
通过yum模块批量安装
ansible manage -m yum -a "name=nginx state=installed"
批量卸载
ansible manage -m yum -a "name=nginx state=absend"
升级软件包
ansible manage -m yum -a "name=nginx state=latest"
升级系统所有软件包,排除某个服务不升级
ansible manage -m yum -a "name='*' state=latest exclude='nginx'"
4.system模块
ansible-doc -s service
ansible-doc -s systemd
费注意的是serivce对centos7有效
当你使用service命令管理服务,系统自动的重定向为eyetemct1服务管理命令
- name 指定服务的名宇,比如nginx.serivce,如crond.serivce
- state 填入你要执行的操作,reloaded,restarted,started,stopped
- enabled 指定服务开机自启 systemctl enable nginx
- danmon_reload 每当修改了配置文件,使用systemd重读配置文件
查看服务是否正常运行
ansible manage -m shell -a "systemctl status crond | grep Active"
检查crond服务是否开机自启了
ansible manage -m shell -a "systemctl list-unit-files | grep crond"
system模块管理服务
ansible manage -m systemd -a "name=crond state=stopped"
ansible manage -m systemd -a "name=crond state=restart"
ansible manage -m systemd -a "name=crond state=restarted"
启动nginx服务
ansible manage -m systemd -a "name=nginx state=started enabled=yes"
5.cron模块
cron模块主要是管理linux的定时任务条目
分 时 日 月 周 执行命令的绝对路径
* * * * *
定时crontab条目都是遵循了规则
每5分钟执行命令
*/5 * * * *
每个月的3号,13号,早上8点整 重启nginx
0 8 3,13 * * /usr/bin/systemctl restart nginx
添加定时任务,每2分钟进行时间同步
ansible manage -m cron -a "name=ntp_cron job='/usr/sbin/ntpdate ntp.aliyuan.com > /dev/mull 2>&1' minute=*/2"
查看下
ansible manage -m shell -a "crontab -l"
再添加一个记录,事件是每个月的3号,13号,早上8点整 重启nginx
ansible manage -m cron -a "name=ntp_cron job='/usr/bin/systemctl restart nginx' minute=0 hour=8 day=3,13 "
ansible manage -m shell -a "crontab -l |grep nginx"
五、ansible剧本
1.概念
ansible核心的功能,作用就是进行配置管理
ansible需要编写的playbook剧本需要遵循一定的规则,格式,这个格式就称之为yaml语法
2.使用剧本批量安装nginx
先批量卸载nginx服务
ansible manage -m yum -a "name=nginx state=absent"
创建yaml剧本
mkdir /myyaml
cd /myyaml/
vim nginx_install.yaml
1 # install nginx yaml
2 - hosts: all
3 tasks: all
4 - name: Install nginx service
5 yum: name=nginx state=present
6 - name: Copy Nginx.conf to every_server
7 copy: src=./nginx.conf dest=/etc/nginx/conf/nginx.conf mode=0644