自动化运维工具Ansible
人工运维
人工运维时代运维人员早期需要维护数量众多的机器,因此需要执行反复,重复的劳动力,很多机器需要同时部署相同的服务或是执行相同的命令,还得反复的登录不同的机器,执行重复的动作
自动化运维
早期运维人员会结合ssh免密登录以及shell脚本来完成自动化的部署操作。
系统管理员面临的问题主要是,配置管理系统,远程执行命令,批量安装服务,启停服务等等
后来也就诞生了众多的开源软件,自动化运维软件
-
fabric
-
puppet
-
saltstack
-
chef
-
Ansible<<<<<<<<<<
其中有两款软件是基于python语言开发的,saltstack,ansible都是基于python编写
自动化运维的好处
-
提高工作效率
-
减少重复性的劳动力操作
-
大大的减少了人为出错的可能性
-
支持数据化管理,数据化追源,找到问题的来源点
Ansible简介
ansible是一个同时管理多个远程主机的软件。通过shh协议实现了,管理节点(老板,安装了ansible服务的机器),被管理节点(员工,被管理的机器节点)的通信。
只要是通过ssh协议登录的主机,就可以完成ansible自动化部署操作
-
批量文件分发
-
批量数据复制
-
批量数据修改,删除
-
批量自动化安装软件服务
-
批量服务启停脚本化
-
自动批量服务部署
模块化
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。
connection plugins:连接插件,负责和被监控端实现通信,默认使用SSH连接
host inventory:主机清单,是一个配置文件里面定义监控的主机
modules : 模块,核心模块、command模块、自定义模块等
plugins : modules功能的补充,包括连接插件,邮件插件等
playbook:编排,定义 Ansible 多任务配置文件,非必需。服务部署的流程:上传tar包-解压-改名字-写变量-检测是否成功
安装
-
准备环境
环境: 主机:3台 1个控制节点Ansible, 2个被控制节点
-
安装
安装:控制节点 1. 配置EPEL网络yum源 [root@ansible-server ~]# yum install -y epel-release 2. 安装ansible [root@ansible-server ~]# yum install -y ansible 3.查看版本 [root@ansiable-server ~]# ansible --version 4.看帮助 [root@ansible-server ~]# ansible --help
命令 作用 -m module 指定模块,默认为command模块 –version 显示版本 -v 详细过程 -vv -vvv更详细过程 –list 显示主机列表,也可以用–list-hosts -k 提示输入ssh连接密码,默认key认证 -C 预执行检测 -T 执行命令的超时时间,默认10s -u 指定远程执行的用户 -b 执行sudo切换身份操作 -become-user 指定sudo的用户 -K 提示输入sudo密码
基础操作
-
配置文件
ansible经常操作的配置文件有两个 主配置文件: /etc/ansible/ansible.cfg #主要设置一些ansible初始化的信息,比如日志存放路径、模块、等配置信息 主机清单文件: 默认位置/etc/ansible/hosts #设置被管理主机的相关信息
添加被管理主机
-
添加单个主机
[root@ansible-server ~]# vim /etc/ansible/hosts #在最后追加被管理端的机器 192.168.157.113 #单独指定主机,可以使用主机名称或IP地址
-
添加主机群
[root@ansible-server ~]# vim /etc/ansible/hosts [webservers] #使用[]标签指定主机组 ----标签自定义 192.168.157.113 #如果未解析添加ip,解析添加主机名 192.168.157.114
-
包含其他组
[webservers1] #组一 ansible-web1 [webservers2] #组二 ansible-web2 [weball:children] #children是关键字 表示 weball中包含 webserver1 和 webserver2 webservers1 #组一 webservers2 #组二
-
为一个组设置内置变量
[weball:vars] #vars关键字,表示为weball组群设置变量 ansible_ssh_port=22 #指定ssh端口 ansible_ssh_user=root #指定用户
5,别名连接其他服务器
-
配置 /etc/hosts
-
配置 /etc/ansible/hosts
配置完别名后需要用别名从新远程连接一次打通连接
# ssh root@node01
-
-
-
执行命令
#语法 ansible <pattern> -m <module_name> -a <arguments> ... pattern:主机清单里定义的主机组名,主机名,IP,别名等,all表示所有的主机,支持通配符,正则 -m module_name: 模块名称,默认为command -a arguments: 传递给模块的参数
[root@localhost ansible]# ansible weball -m command -a "hostname" -k -u root
颜色 含义 绿色 执行成功但为对远程主机做任何改变 黄色 执行成功并对远程主机做改变 红色 执行失败
Ansible模式
ansible有两种运行模式
-
Ad-hoc 命令行运行模式,适合执行短小命令
-
playbook 剧本模式,适合执行复杂命令
Ad-hoc
命令行运行模式,通过在shell中输入命令完成自动化控制
#语法
ansible <pattern> -m <module_name> -a <arguments> ...
pattern:主机清单里定义的主机组名,主机名,IP,别名等,all表示所有的主机,支持通配符,正则
-m module_name: 模块名称,默认为command
-a arguments: 传递给模块的参数
都有什么模块??
ansible-doc -l #查看支持的模块
常用模块
command---远程执行命令
模块参数详解:
free_from:要执行的命令一个命令,注意只有该参数不需要键值对形式
注意该命令中不能有shell命令的特殊字符,如果想执行有,使用shell模块
chdir: 在执行命令前先进入到指定目录
creates: 在执行命令前先判断指定文件是否存在,存在则不执行,不存在则执行
removes: 在执行命令前先判断指定文件是否存在,存在则执行,不存在则不执行
输出当前目录
[root@localhost tmp]# ansible weball -m command -a "pwd"
/tmp/a.txt文件存在则不输出当前目录,否则输出
[root@localhost tmp]# ansible weball -m command -a "pwd creates=/tmp/a.txt"
/tmp/a.txt文件不存在则不输出当前目录,否则输出
[root@localhost tmp]# ansible weball -m command -a "pwd removes=/tmp/a.txt"
shell---远程执行命令
与command模块作用相同,但是命令中可以有特殊字符
copy---远程复制模块
模块参数详解:
src:指定源文件路径
dest:目标地址(拷贝到哪里)
owner:指定属主
group:指定属组
mode:指定权限,可以以数字指定比如0644
backup:在覆盖之前将原文件备份,备份文件包含时间信息。有两个选项:yes|no
远程复制
[root@ansible-server ~]# vim a.txt #创建一个测试文件
123123
[root@ansible-server ~]# ansible weball -m copy -a 'src=/root/a.txt dest=/opt owner=root group=root mode=644'
远程复制并备份
[root@ansible-server ~]# vim a.txt #追加如下内容
123123
234234
[root@ansible-server ~]# ansible weball -m copy -a 'src=/root/a.txt dest=/opt/ owner=root group=root mode=644 backup=true'
file---文件管理模块
用于创建,修改文件及目录
参数
path:创建的文件或目录的路径
owner:指定属主
group:指定属组
mode:指定权限,可以以数字指定比如0644
src:指定源文件路径 用于创建软链接
dest:软链接位置
state:
directory 创建目录
touch 创建文件
link 创建软连接
absent 删除
远程创建文件夹
[root@localhost tmp]# ansible weball -m file -a "path=/tmp/shuaihui mode=666 state=directory"
远程创建文件
[root@localhost tmp]# ansible weball -m file -a "path=/tmp/shuaihui/hello2.txt mode=666 state=touch"
远程创建软连接
[root@localhost tmp]# ansible weball -m file -a "src=/tmp/shuaihui/hello2.txt dest=/tmp/hl.txt state=link"
远程删除文件
[root@localhost tmp]# ansible weball -m file -a "path=/tmp/shuaihui/hello2.txt state=absent"
yum--远程下载
使用yum远程安装
参数 | 说明 |
---|---|
name | 指定安装软件包名或软件包URL |
state | 指定yum对应的方法,present(Defaults)表示安装;absent表示卸载;latest表示安装最新版本软件包,支持多程序一起安装,用逗号隔开 |
enablerepo | 允许从哪些仓库获取软件 |
disablerepo | 禁止从哪些仓库获取软件 |
exclude | 排除某些软件包,例如kernel |
download_only | 仅下载软件包,不安装 |
disable_gpg_check | 不进行gpg检测 |
update_cache | 可以在安装包的同时更新yum缓存 |
yum远程安装nginx
[root@localhost tmp]# ansible weball -m yum -a "name=nginx state=present"
yum远程更新nginx
[root@localhost tmp]# ansible weball -m yum -a "name=nginx state=latest"
yum远程删除nginx
[root@localhost tmp]# ansible weball -m yum -a "name=nginx state=absent"
cron---定时任务
minute:设置计划任务中分钟设定位的值,默认为””。
hour:同上
day:同上
month:同上
weekday:此参数用于设置计划任务中周几设定位的值,默认为””。
special_time:可用值有 reboot(重启后)、yearly(每年)、annually(每年,与yearly相同)、monthly(每月)、weekly(每周)、daily(每天)、hourly(每时)。
注意:当上述时间单位设定参数都未指定时,计划任务的时间设定默认会被设定为”* * * * *”,这样表示每秒都会执行一次计划任务,所以,在使用cron模块时,我们应该确定对应的时间参数设置正确。
user:设置当前计划任务属于哪个用户。
job:指定计划的任务中需要实际执行的命令或者脚本。
name:设置计划任务的名称。
state:当计划任务有名称时,修改或删除对应的任务,当删除计划任务时,需要将 state 的值设置为 absent。
disabled:当计划任务有名称时,我们可以根据名称使对应的任务”失效”(注释掉对应的任务)。
backup:如果此参数的值设置为 yes,那么当修改或者删除对应的计划任务时,会先对计划任务进行备份,然后再对计划任务进行修改或者删除,cron 模块会在远程主机的 /tmp 目录下创建备份文件,以 crontab 开头并且随机加入一些字符,具体的备份文件名称会在返回信息的 backup_file 字段中看到,推荐将此此参数设置为 yes。
cron远程添加定时任务
[root@localhost ~]# ansible weball -m cron -a "name=dateflush job='ntpdate ntp.aliyun.com' minute=0 hour=0"
每天0时更新时间
corn远程删除定时任务
[root@localhost ~]# ansible weball -m cron -a "name=dateflush job='htpdate ntp.aliyun.com' minute=0 hour=0 state=absent"
playbook
playbook顾名思义,即剧本,现实生活中演员按照剧本表演,
在ansible中,这次由被控计算机表演,进行安装,部署应用,
提供对外的服务等,以及组织计算机处理各种各样的事情。
yml文件格式规范
剧本的编写需要用到.yml或.yaml文件
编写规范
1)大小写敏感
2)使用缩进表示层级关系
3)缩进时不允许使用Tab键,只允许使用空格。
4)缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
5)键值使用:分割,且值与:之间有一个空格
5)使用‘-’表示同组
班级如下
name=一班 address=一楼 student= (name=dawa,sex=m),(name=erwa,sex=f)
name=二班 address=二楼 student= (name=sanwa,sex=m),(name=siwa,sex=f)
name=三班 address=三楼 student= (name=wuwa,sex=m),(name=liuwa,sex=f)
-name: 一班
address: 一楼
student:
- name: dawa
sex: m
- name: erwa
sex: f
-name: 二班
address: 二楼
student:
- name: sanwa
sex: m
- name: siwa
sex: f
-name: 三班
address: 三楼
student:
- name: wuwa
sex: m
- name: liuwa
sex: f
playbook中的参数
name:
定义playbook或者task的名称(描述信息),每一个play都可以完成一个任务。
hosts:
hosts用于指定要执行指定任务的主机.
user:(去root化)www-data /data/log/拥有所有权限
remote_user则用于指定远程主机上的执行任务的用户
tasks:
任务列表play的主体部分是task list. task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。
vars:
定义变量(如果不使用内部变量需要提前定义)
vars_files:
调用定义变量文件
notify:
任务执行结果如果是发生更改了的则触发定义在handler的任务执行
handlers:
用于当前关注的资源发生变化时采取一定指定的操作
使用playbook创建/tmp/pb1.txt
[root@ansible-server ~]# cd /tmp/ansible/
[root@ansible-server ansible]# vim test.yml #创建文件必须以.yml/.yaml结尾
---
- name: pb_test
hosts: weball
user: root
tasks:
- name: pb_test1
file: path=/tmp/pb1.txt state=touch
检测语法:
[root@ansible-server ansible]# ansible-playbook --syntax-check test.yml
playbook: test.yml
运行Playbook:
[root@ansible-server ansible]# ansible-playbook test.yml #加剧本名称
使用playbook条件触发器
handlers:由特定条件触发的Tasks
handlers:处理器
notify:触发器
语法:
tasks:
- name: TASK_NAME
module: arguments #1.上面任务执行成功,然后
notify: HANDLER_NAME #2.通知他
handlers:
- name: HANDLER_NAME #3.一一对应,这里的描述与notify定义的必须一样
module: arguments #4.执行这个命令
---
- hosts: weball
user: root
tasks:
- name: test shell
shell: pwd creates=/tmp/pb1.txt
notify: h1
handlers:
- name: h1
file: path=/tmp/pb2.txt state=touch
------------------------------------------------------------------------------------------------
当shell执行时,创建pb2.txt
不执行时,不创建
使用playbook循环
循环:迭代,需要重复执行的任务;
对迭代项的引用,固定变量名为”item”,使用with_item属性给定要迭代的元素;
---
- hosts: weball
name: while
user: root
tasks:
- name: test while
shell: echo {{item}} >>/tmp/pb3.txt
with_items:
- zhangsan
- lisi
- wangwu
------------------------------------------------------------------------------------------------将zhangsan,lisi,wangwu 输出到pb3.txt中
自定义参数
参数文件
-
自定义参数文件
[root@ansible-server vars]# vi vars.yml
-
编写剧本
--- - hosts: weball user: root vars_files: - /tmp/ansible/vars.yml # 文件引入 tasks: - name: copy test copy: src={{ src_path }} dest={{ dest_path }}
临时参数
---
- hosts: weball
name: var test
user: root
vars:
- src_path: /tmp/ansible/pb5.txt
- dest_path: /tmp
tasks:
- name: var test
copy: src={{ src_path }} dest={{ dest_path }}
批量部署Jdk+Tomcat
- hosts: webadd
user: root
tasks:
- name: copy Jdk1.8
copy: src=/tmp/jdk-8u171-linux-x64.rpm dest=/tmp
- name: rpm to java
shell: rpm -ivh /tmp/jdk-8u171-linux-x64.rpm
- name: configure envirement1
shell: echo -e "JAVA_HOME=/usr/local/java\nPATH=$JAVA_HOME/bin:$PATH\nCLASSPATH=." >> /etc/profile
- name: flush profile
shell: source /etc/profile
- name: copy tomcat
copy: src=/tmp/apache-tomcat-8.5.78.tar.gz dest=/tmp
- name: unzip tomcat
shell: tar -xvzf /tmp/apache-tomcat-8.5.78.tar.gz -C /tmp
- name: start tomcat
shell: nohup /tmp/apache-tomcat-8.5.78/bin/startup.sh &