ansible(跨主机编排)
ansible 是一个基于python开发的配置管理和应用部署和管理工具,现在也在自动化管理领域大放异彩,他融合了众多老牌运维工具的优点,pubbet和saltstack能实现的功能,ansible基本上都可以实现
能批量配置部署上千台主机,一个ansible控制节点完成所有主机操作ansible无agent存在
ansible是基于模块工作的,他提供一种运行框架,它本身没有完成任务的能力,整整执行操作的是ansible的模块,通过ssh连接来控制远程主机的
assible绝大多数模块都具有幂等性,及无论多少次同样的运算,结果都是相同的及一条命令,任意多次执行所产生的影响与一次执行的影响均与一次执行相同。(一次操作完不会重复操作,除非文件发生改变)
ansible的很多模块在执行时都会先拍段目标节点是否要执行任务,所以,重复执行某个任务大多时候不会产生任何副作用
总结:
ansible 自动化运维工具 可实现批量管理多台(成百上千)主机,应用级别的跨主机编排工具,特性:无agent的存在,不要在被控制几点上安装客户端应用,通过ssh协议与被控制节点通信,基于模块的工作,通过模块可以实现在被控制节点上执行命令操作,很多模块具有幂等性,可以实现多次操作的状态如果没有发生变化,则不会重复操作
ci 持续继承
cd 持续发布 持续部署(asible)
ansible dbservers -m指定组名 command -a 'hostnamectl'
ansible all 指定所有组
ansible webservers -m cron -a ‘name=“backup system log”state=absent’
环境配置
cd /etc/ansible
Vim hosts
由于ansible默认是ssh连接的,所以管理前要设置免密登录
ansible常用模块
command ansible的默认模块,不支持管道符号,重定向符号 #在远程主机执行命令,不支持管道,重定向等shell的特性。
shell支持 管道符号 重定向符号 #在远程主机执行命令,相当于调用远程主机的shell进程,然后在该shell下打开一个子shell运行命令(支持管道符号等功能)
cron minute hour day month weekday job name state=present/absent # 在远程主机定义任务计划。其中有两种状态(state):present表示添加(可以省略),absent表示移除。
user name uid group groups shell state=present/absent #用户管理的模块
group name gid #用户组管理的模块
copy src dest #用于复制指定主机文件到远程主机的
file state=link/touch/directory/absent mode path
#设置文件属性
mount
//挂载文件系统
hostname 模块
//用于管理远程主机上的主机名
ansible dbservers -m hostname -a "name=dbservers-user"
ping模块
检测远程主机联通性 ansble all -m ping
yum模块
ansible webservers -m yum -a 'name=httpd' #安装服务
ansible webservers -m yum -a 'name=httpd state=absent' #卸载服务
service/systemd 模块
//用于管理远程主机上的管理服务的运行状态
script 模块
//实现远程批量运行本地的 shell 脚本
setup 模块
//facts 组件是用来收集被管理节点信息的,使用 setup 模块可以获取facts信息
archive模块
//打包压缩
unachive// 将本地压缩包或远程主机的解压包在远程主机解压
replace模块
//类似于sed命令,总而言是基于正则表达式进行匹配和替换(在远程主机修改文件内容)
inventory 主机清单
inventory支持对主机进行分组,每个组内可以定义多个主机,每个主机都可以定义在任何一个或多个主机组内。
配置文件 /etc/ansible/hosts
【组名】
主机ip ansible_user ansible_password ansible_port #主机变量
主机名
【组名:vars】
ansible_user #组变量
ansible_password=
. . . .
【大组名:children】
组名1
组名2
. . . . .
ansible 的脚本 --- playbook 剧本
playbooks 本身由以下各部分组成
---#yaml文件以---开头,以表明这是一个yaml文件,可省略
- name: first play#定义一个play的名称,可省略
gather facts: false#设置不进行facts信息收集,这可以加快执行速度,可省略
hosts: webservers#指定要执行任务的被管理主机组,如多个主机组用冒号分隔
remote_user: root#指定被管理主机上执行任务的用户
tasks:#定义任务列表,任务列表中的各任务按次序逐个在hosts中指定的主机上执行
- name: test connection#自定义任务名称#使用 module: [options] 格式来定义一个任务ping:name: disable selinux
command! '/sbin/setenforce 0'
#command模块和shel1模块无需使用key=value格式
ignore errors: True
#如执行命令的返回值不为0,就会报错,tasks停止,可使用ignore errors忽略失败的任务
- name: disable firewalld
service: name-firewalld state-stopped#使用 module: options 格式来定义任务,option使用key-value格式
- name: install httpd
yum: name-httpd state=latest
- name: install confiquration file for httpd
copy: src-/opt/httpd.conf dest-/etc/httpd/conf/httpd.conf
#这里需要一个事先准备好的/opt/httpd.conf文件
notify: "restart httpd"
#如以上操作后为changed的状态时,会通过notify指定的名称触发对应名称的handlers操作
- name: start httpd service
service: enabled-true name-httpd state=started
handlers:#handlers中定义的就是任务,此处handlers中的任务使用的是service模块
- name: restart httpd#notifv和handlers中任务的名称必须一致
service: name=httpd state=restarted
#Ansible在执行完某个任务之后并不会立即去执行对应的hander,而是在当前中所有通务都执行完后再bandler,这的好处是可以多次发nt。但
后只执行一次对应的handler,从而避免多次重启。
/运行playbookansible-playbook test1.yaml//补充参数:-k (-ask-pass) : 用来交万输入ssh密码-K (-ask-become-pass) : 用来交互输入sudo密码-t: 指定用户
insible-playbook test1.yaml#检查vam1文件的语法是否正确--syntax-checkansible-playbooktest1.yaml-list-task#检香tasks任务ansible-playbooktest1.yaml-list-hosts#检查生效的主机-start-at-task-'install httpd'ansible-playbooktest1.yaml
#指定从某个task开始运行
ansible -playbook demol.yaml
---
- name: first play
hosts: webservers
remote_user: root
gather_facts: true
tasks:
- name: disable selinuc
command: '/usr/sbin/setenforce 0'
ignore_errors:true
- name: disable firewalld
systemed: name=firewalld state=stopped enabled=no
- name: mount cdrom
mount: src=/dev/sr0 path=/mnt state=mounted fstype=iso9660
- name: copy local yum repo file
copy: src=/etc/yum.repo.d/repo.bak/local.repo dest=/etc/yum.repos.d/
- name:install httpd by yum
yum: name=httpd state=lastest
- name: modify httpd configuration file
replace:path=/etc/httpd/conf/httpd.conf regexp="ServerName www.example.com:80" replace="ServerName www.kgc.com:80"
notify: "restart httpd"
- name: start httpd