运维的三大化是指:
- 标准化
- 自动化
- 智能化
而对于自动化我们今天将要给大家介绍一款ansible运维自动化工具:
ansible是基于python开发的,能实现批量管理系统配置、批量程序部署、批量执行命令。而ansible是基于模块工作的。他的工作机制是基于ssh无密码登录。
ansible的特点如下:
1、部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;
2、默认使用SSH协议对设备进行管理;
3、有大量常规运维操作模块,可实现日常绝大部分操作。
4、配置简单、功能强大、扩展性强;
5、支持API及自定义模块,可通过Python轻松扩展;
6、通过Playbooks来定制强大的配置、状态管理;
7、轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
8、提供一个功能强大、操作性强的Web管理界面和REST API接口 ——AWX平台。
ansible的三种工作模式:
- ad-hoc模式:使用单个模块,支持批量执行单条命令
- playbook模式:是ansible主要管理方式,是通过task集合完成一类功能,可以简单得分解为多个ad-hoc命令
- roles角色定制:高级用法,它是基于把playbook分解成多个目录,更加方便,能直接调用
ansible命令执行过程:
1、加载自己的配置文件 默认/etc/ansible/ansible.cfg
2、查找对应的主机配置文件,找到要执行的主机或者组
3、加载自己对应的模块文件,如command
4、通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的
5、对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件
6、给文件+x执行
7、执行并返回结果
8、删除临时py文件,sleep 0退出
ansible的配置:
在/etc/ansible/ansible.cfg中(一般不用更改配置,根据需求去更改)
inventory = /etc/ansible/hosts 资产清单列表,就是需要管理主机组的列表
library = /usr/share/ansible 指Ansible模块存放的目录
forks = 5 同时开启进程数,个根据主机数去调整,一次并发处理多少。
sudo_user = root 默认设置执行命令的用户
remote_port = 22 被管理节点的端口,默认是22
host_key_checking = False 设置是否检查SSH主机的密钥
timeout = 60 设置SSH连接超时间隔,一般调高点
log_path = /var/log/ansible.log 日志存放的路径
在/etc/ansible/hosts中定义管理节点
1、直接指明主机地址或主机名:
www.magedu.com
172.17.166.166
2、定义一个主机组【组名】把地址或者主机名加进去
[webserver]
172.17.166.166
172.17.155.155
172.17.166.[1:6] 表示匹配172.17.166.1-----172.17.166.6
ansible一些常见的模块介绍:
ansible-doc -l 查看模块信息
ansible all --list-host 查看所有host分组
ansible一些用法:
-a 模块命令参数
-k 登录密码
-C check 只是去测试一下会改变什么内容,不会真正去执行
-f number 并行任务数
-i 指定管理节点文件的路径
-m 指定调用的模块
-S 用su命令
-o 压缩输出摘要输出,尝试一切都在一行上输出
-s 用sudo去执行
-u 远程用户,默认是Root
-v 查看执行过程信息
-vv -vvv 更详细执行过程信息
-P 每隔多长时间收集信息
ping模块:测试主机的连通性
ansible all -m ping
command模块,在远程主机执行命令(但是不支持管道|,<,>,;,&)
ansible all -m command -a ‘command’
还支持一些参数
chdir # 在执行命令之前,先切换到该目录
creates #一个文件名,当这个文件存在,则该命令不执行,可以用来做判断
executable # 切换shell来执行命令,需要使用命令的绝对路径
free_form #要执行的Linux指令,一般使用Ansible的-a参数代替。
removes #一个文件名,这个文件不存在,则该命令不执行,与creates相反的判断
shell模块,远程执行命令,shell模块可以支持|,<,>,;,&
ansible all -m shell -a ‘command |...’
copy模块,复制文件到远程主机,可以改权限
(1)复制文件 -a “src= dest= ”
ansible web -m copy -a “src=/etc/passwd dest=/app”
(2)给定内容生成文件 -a "content= dest= "
ansible web -m copy -a “content=’hello world’ dest=/app/a.txt”
还支持一些参数:
backup : #在覆盖之前,将源文件备份。=yes是备份 =no是不备份
content: #用于替代src,可以直接指定文件的值
dest: #必须有指定目标地址路径
directory_mode(mode): #递归设定目录的权限,默认是系统默认权限
force: #如果目标主机包含这个文件,yes时为强制覆盖,no不强制覆盖
others: #所有file模块里的选项都可以在这使用
src: #源地址路径
file设置文件属性
创建目录: ansible web -m file -a ‘path=/app/test state=directory’
创建链接文件: -a “path= src= state=link”
删除文件: -a “path=/app/test state=absent”
还支持一些参数:
force: #需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
group: #定义文件/目录的属组
mode: #定义文件/目录的权限
owner: #定义文件/目录的属主
path: #必选项,定义文件/目录的路径
recurse: #递归设置文件的属性,只对目录有效
src: #被链接的源文件路径,只应用 于state=link的情况
dest: #被链接到的路径,只应用于state=link的情况
state: #状态
directory: #如果目录不存在,就创建目录
file: #即使文件不存在,也不会被创建
link: #创建软链接
hard: #创建硬链接
touch: #如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
absent: #删除目录、文件或者取消链接文件
fetch模块,从远程某主机获取文件到本地
ansible web -m fetch -a ‘src=/app/a.txt dest=/app’
还有一些参数:
src: #远程主机文件路径
dest: #保存本地路径
cron模块,管理cron计划任务(如果添加多条,name不能相同)
ansible web -m cron -a "name='ntp update every 5 min' minute=*/5 job='/sbin/update 172.17.0.1 &> /dev/null' " #每5分钟同步一下时间。
还有一些参数:
day= #日应该运行的工作( 1-31, *, */2, )
hour= # 小时 ( 0-23, *, */2, )
minute= #分钟( 0-59, *, */2, )
month= # 月( 1-12, *, /2, )
weekday # 周 ( 0-6 for Sunday-Saturday,, )
job= #指明运行的命令是什么
name= #定时任务描述
special_time #特殊的时间范围,参数:reboot(重启时),annually(每年),monthly(每月),weekly (每周),daily(每天),hourly(每小时)
state #指定状态,present表示添加定时任务,也是默认设置,absent表示删除定时任务
user # 以哪个用户的身份执行
yum模块,安装软件
ansible web -m yum -a "name=vsftpd state=present disable_gpg_check=yes" #安装vsftpd包
还有一些参数:
conf_file #设定远程yum安装时所依赖的配置文件。如配置文件没有在默认的位置。
disable_gpg_check #是否禁止GPG checking,只用于`present‘ or `latest’。
disablerepo #临时禁止使用yum库。 只用于安装或更新时。
enablerepo #临时使用的yum库。只用于安装或更新时。
name= #所安装的包的名称
state= #present安装, latest安装最新的, absent 卸载软件。
update_cache #强制更新yum的缓存。
service模块:服务程序管理
支持的参数:
arguments #命令行提供额外的参数
enabled #设置开机启动。
name= #服务名称
runlevel #开机启动的级别,一般不用指定。
sleep #在重启服务的过程中,是否等待。如在服务关闭以后等待2秒再启动。
state #started启动 stopped停止 restarted重启reloaded重载配置
例如:启动vsftpd服务,并设置开启自启
ansible web -m service -a "name=vsftpd enabled=yes state=started"
user模块管理
comment # 用户的描述信息
createhome # 是否创建家目录
force # 在使用state=absent是, 行为与userdel –force一致.
group # 指定基本组
groups # 指定附加组,如果指定为(groups=)表示删除所有组
home # 指定用户家目录
move_home # 如果设置为home=时, 试图将用户主目录移动到指定的目录
name # 指定用户名
non_unique # 该选项允许改变非唯一的用户ID值
password # 指定用户密码 此处指定密码在/etc/shadow里面不是加密的
remove # 在使用state=absent时, 行为是与userdel –remove一致
shell # 指定默认shell
state # 设置帐号状态,不指定为创建,指定值为absent表示删除
system # 当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户
uid # 指定用户的uid
update_password #密码更新模式
例如:创建magedu01用户
ansible web -m user -a "name=magedu01 createhome=yes password=magedu shell=/bin/sh uid=10001"
group模块
还有一些参数
gid= # 设置组的GID号
name= # 管理组的名称
state= # 指定组状态,默认为创建,设置值为absent为删除
system= # 设置值为yes,表示为创建系统组
例如创建为tom组:
ansible web -m group -a ‘name=tom state=present’
script模块,在指定节点运行服务端的脚本
例如:
先编写一个脚本:vim /app/a.txt
然后再传过去ansible web -m script -a '/app/a.txt'
setup模块,收集信息用的(主要引用变量,加判断用)
facts组件是ansible采集信息的一个功能,可以使用setup模块查机器上的素有Facts信息,然后直接调用变量,facts就是变量,内建变量。
ansible playbook:
setup模块,主要用于获取主机信息,在playbooks里经常会用到的一个参数gather_facts就与该模块相关。
setup模块下经常使用的一个参数是filter参数,filter是过滤器
例如:
ansible 10.212.52.252 -m setup -a 'filter=ansible_*_mb' //查看主机内存信息
ansible 10.212.52.252 -m setup -a 'filter=ansible_eth[0-2]' //查看地接口为eth0-2的网卡信息
--tree= 输出的信息保存在文件中
例如:ansible web -m setup -a 'filter=*mem*' - -tree=/app/mem.txt
ansible playbook命令介绍:
- playbook是ansible用于配置,部署,和管理被控节点的剧本。
- playbook就是ad-hoc命令的集合,需要大量操作的时候,用playbook更加方便,使用playbook你可以方便的重用这些代码,可以移植到不同的机器上面,像函数一样 ,最大化的利用代码
- playbook是由YMAL语言编写的
playbook中主要有三部分组成:
- hosts部分:主要表明哪个主机组来运行下面的tasks,每个playbook都必须指定hosts
- remote_user部分:指定远端主机中哪个用户来登录远端系统,可以任意指定,但是用户执行必须有相应的task的权限
- tasks部分:指定远端主机将要执行的一系列动作,task的核心是ansible模块,name是可选的,但是建议加上去,还可以给予相应的参数。
playbook的简单配置如下:
例如:安装samba并启动服务
---
- hosts: web
remote_user: root
tasks:
- name: yum install samba
yum: name=samba state=latest
- name: start service
service: name=smb state=started
还可以打标签:(直接运行这个模块)
tags: startsmb
然后直接运行标签处的模块:ansible-playbook a.yml -t startsmb
notify的使用:(配置文件修改需要从新加载)
---
- hosts: web
remote_user: root
tasks:
- name: yum install nginx
yum: name=nginx state=latest
- name: copy nginx.conf (推送配置文件)
copy: src=/app/nginx.conf dest=/etc/nginx/nginx.conf backup=yes
notify: reload
tags: reloadnginx
- name: start nginx
service: name=nginx state=started
tags: startnginx
handlers:
- name: reload (与前面notify一样)
service: name=nginx state=restarted
执行命令:ansible-playbook nginx.yml -t reloadnginx
相当于打个reloadnginx标签,然后直接指定标签,运行到notify就会触动handlers,就会restarted从启nginx服务。
剧本里面还能直接引用变量:
1、facts:可以直接调用,可使用setup模块直接获取目标主机的facters
2、用户自定义变量
---
- hosts: web
remote_user: root
tasks:
- name: yum install {{ rpmname }}
yum: name={{ rpmname }} state=latest
- name: copy {{ rpmname }}.conf
copy: src=/app/{{ rpmname }}.conf dest=/etc/{{ rpmname }}/{{ rpmname }}.c
onf backup=yes
notify: reload
tags: reload{{ rpmname }}
- name: start {{ rpmname }}
service: name={{ rpmname }} state=started
tags: start{{ rpmname }}
handlers:
- name: reload
service: name={{ rpmname }} state=restarted
执行命令可以直接调用变量:ansible-playbook nginx.yml -e rpmname=vsftpd
也可以直接在剧本里面定义:vars:
- rpmname: vsftpd
剧本里面还可以先定义一个模板,然后直接调用变量:
例如nginx:
(1)先把nginx.conf改成nginx.j2(以.j2结尾就行)
(2)然后在nginx.j2里面设置一些变量:
worker_processes {{ ansible_processor_vcpus }}; CPU数量
listen {{ nginxport }}; 监听端口变量
(3)然后在nginx.yml中配置:(变量可以定义在里面也可以直接-e指定变量)
---
- hosts: web (主机组)
remote_user: root (远程执行命令的用户)
vars: (定义变量)
- rpmname: nginx (rpmname变量是nginx)
nginxport: 8899 (nginxport变量时8899)
tasks: (任务段)
- name: yum install {{ rpmname }}
yum: name={{ rpmname }} state=latest (调用yum模块)
- name: copy {{ rpmname }}.conf
template: src=/app/{{ rpmname }}.j2 dest=/etc/nginx/{{ rpmname }}.conf backup=yes (调用模板,这里不能用copy)
notify: reload (一般和handlers配合使用)
tags: reload{{ rpmname }} (定义标签)
- name: start {{ rpmname }}
service: name={{ rpmname }} state=started (调用service模块)
tags: start{{ rpmname }} (定义标签)
handlers: (与前面的notify一样)
- name: reload
service: name={{ rpmname }} state=restarted (触动notify时候调用service模块)
(4)执行命令:ansible-playbook nginx.yml
剧本里面还可以使用循环语句:
when语句:在task中使用,jinja2的语法格式
tasks:
- name: install conf file to centos7
template: src=files/nginx.conf.c7.j2
when: ansible_distribution_major_version == "7"
- name: install conf file to centos6
template: src=files/nginx.conf.c6.j2
when: ansible_distribution_major_version == "6"
--------判断版本号是7的时候安装c7.j2,是6的时候安装c6.j2-----------
循环:需要重复执行的任务
对迭代项的引用,固定变量名为“item”,而后在tasks中使用with_items给定要迭代的元素列表
角色定制roles:
- 对以上的所有方式,有个弊端就是无法实现复用假设在同时部署Web,db,ha时,或者不同服务器组合不同的应用就需要写多个yml文件,这样不灵活。
- roles用于层次性、结构性地组织playbook。roles能够层次型结构自动装载变量文件、tasks以及handlers等。要是用roles只需要在playbook中使用include指令即可。
- roles就是通过分别将变量(vars)、文件(file)、任务(tasks)、模块 (modules)及处理器(handlers)放置于单独的目录中,并可以便捷地include它们的一种机制
定义角色案例:
1、在/etc/ansible/roles目录下生成对应的目录结构:
mkdir -pv ./{nginx,mysql,tomcat}/{files,templates,vars,tasks,handlers,meta,default}
2、定义/tasks/main.yml的配置文件
- name: cp
copy: src=nginx-1.10.2-1.el7.ngx.x86_64.rpm dest=/tmp/nginx-1.10.21.el7.ngx.x86_64.rpm
- name: install
yum: name=/tmp/nginx-1.10.2-1.el7.ngx.x86_64.rpm state=latest
- name: conf
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
tags: nginxconf
notify: new conf to reload
- name: start service
service: name=nginx state=started enabled=true
3、修改vars/main.yml变量文件
nginx_port: “8888”
4、定义handlers文件handlers/main.yml
- name: new conf to reload
service: name=nginx state=restarted
5、定义/etc/ansible/roles.yml的playbook文件
- hosts: nginx
remote_user: root
roles:
- nginx
6、可以通过roles传递变量
- hosts: nginx
remote_user: root
roles:
- { role: nginx, nginxport: 12345 }
7、也可以配置多个角色
实验:在Tomcat上部署的.war包升级版本的具体步骤
1、在ansible的配置文件中配置.yml剧本
vim war.yml
---
- hosts: web
remote_user: root
serial: 1 (一个服务器的task执行完毕在执行另一个服务器)
tasks:
- name: check index.html not ok
copy: content=no dest=/usr/local/tomcat/webapps/ROOT/check
- name: sleep
shell: sleep 10
- name: stoptomcat
shell: /usr/local/tomcat/bin/catalina.sh stop
- name: delete solo.war
shell: rm -rf /usr/local/tomcat/webapps/solo.war /usr/local/tomcat/webapps/solo
- name: cp.war
copy: src=/root/solo-2.2.0.war dest=/usr/local/tomcat/ backup=no
- name: links
file: path=/usr/local/tomcat/webapps/solo.war src=/usr/local/tomcat/solo-2.2.0.war state=link
- name: starttomcat
shell: /usr/local/tomcat/bin/catalina.sh start
- name: check index.html ok
copy: content=ok dest=/usr/local/tomcat/webapps/ROOT/check
2、配置前段haproxy负载均衡器
vim /etc/haproxy/haproxy.cfg
frontend http
bind 172.17.177.177:80
default_backend webserver
backend webserver
balance roundrobin
option httpchk GET /check
http-check expect string ok
server web1 172.17.166.166:8080 check weight 1
server web2 172.17.155.155:8080 check weight 1
3、配置后端两台Tomcat服务器
4、然后直接在ansible上执行剧本就可以了 ansible-playbook war.yml