一、自动化运维工具
自动化运维工具可分为两类
1.C/S架构,需要使用代理工具,也就是基于专用的Agent程序来管理,如:Puppet、Func
2.不需要配置代理工具的,可以直接基于ssh服务来完成管理功能,如:Ansible、Fabric
二、Ansible概述
1.Ansible基于Python开发,实现了批量运行命令、程序部署、配置系统等功能
2.Ansible核心组件
1)Ansible core核心引擎
Host inventory主机清单:用来Ansible管理的主机,默认是在Ansible的host配置文件中定义被管理的主机
2)connection plugins连接插件:负责和被管理主机实现通信,除支持ssh连接外,Ansible还支持其他连接方式,但需要有连接插件将各个主机连接到Ansible
3)Playbooks剧本:用来集中定义Ansible任务的配置文件,即将多个任务定义到一个剧本中由Ansible自动执行
4)Core modules核心模块:是Ansible自带的模块,使用这些模块将资源分配到被管理主机,使其执行特定任务
5)Custom modules自定义模块:用于完成模块功能的补充,可借助相关插件完成记录日志、发送邮件等功能
二、安装部署Ansible
1.Ansible不在官方的yum源中,下载epel源
yum -y install epel-release
2.修改epel配置文件
vim /etc/yum.repos.d/epel.repo
将http行的注释取消,注释https行
3.安装Ansible
yum -y install ansible
4.Ansible配置文件
1)主配置文件:/etc/ansible/ansible.cfg
2)管控主机清单:/etc/ansible/hosts
[webserver]、[dbserver]是定义的被管理的主机组,也可以直接写ip,不定义组
5.生成秘钥对设置ssh无密码登录
ssh-keygen -t rsa #生成秘钥对,-t指定加密算法
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.4 #上传公钥并自动导入
root禁止远程登录的可以在hosts文件中添加一下内容
IP ansible_ssh_user=普通用户 ansible_ssh_pass=普通用户密码 ansible_become_user=root ansible_become=true ansible_become_method=su ansible_become_pass='root密码'
三、Ansible命令应用基础
1.语法:
pansible <host> [-m module_name] [-a args]
<host>:被管理的主机组或ip,所有主机用all代替
[-m module_name]:要使用的模块
[-a args]:模块的参数
ansible-doc:查看模块帮助信息
-l 列出可使用模块
-s+模块名 查看模块的详情和使用示例
四、Ansible模块
1.command模块:ansible管理工具默认使用的模块,用于在被管理主机上运行命令,单纯运行命令使用该模块
例:
2.cron模块:用于定义计划任务,有两种状态state:present表示添加,省略状态时默认使用,absent表示移除
例:创建计划任务
minute:分,图中表示每十分钟执行一次,hour、day、mouth、weekday
job:具体执行的任务
name:对任务的描述,可以不写
删除计划任务:ansible webserver -m cron -a "minute='*/10' job='/bin/echo hello' disabled='yes'"
查看计划任务:ansible webserver -a 'crontab -l'
3.user模块:用于创建新用户和更改、删除已存在用户
例:
创建用户:ansible dbserver -m user -a 'name="user1"
# name:用户名
删除用户:ansible dbserver -m user -a 'name="user1" state=absent'
# 不删除宿主目录
更改用户组:ansible dbserver -m user -a 'name=user1 uid=500 system=yes group=mysql'
4.group模块:用于对用户组进行管理
例:
创建组:ansible 192.168.1.5 -m group -a 'name=mysql gid=306 system=yes'
删除组:ansible 192.168.1.5 -m group -a 'name=mysql gid=306 system=yes state=absent'
5.copy模块:用于实现ansible与被管理主机文件复制和批量下发
src:本地源路径
dest:被管理主机路径
例:
复制:ansible dbserver -m copy -a 'src=/root/123.test dest=/root/'
将数据写入某个文件(会覆盖原数据):ansible dbserver -m copy -a 'content="1234567" dest=/root/桌面/123.test
6.file模块:设置文件属性、设置连接文件
owner:属主
group:属组
mode:权限
path:路径
例:
ansible dbserver -m file -a 'owner=mysql group=mysql mode=644 path=/root/桌面/123.test'
#设置属主、属组、权限
ansible dbserver -m file -a 'path=/tmp/fstab.link src=/tmp/fstab.ansible state=link'
#设置文件fstab.link为fstab.ansible的连接文件
7.ping模块:检测指定主机的连通性
例:ansible all -m ping
8.service模块:控制管理服务的运行状态
enable:是否开机自动启动,取值为true或false
name:服务名
state:服务状态,started、stoped、restarted、status
例:
ansible 192.168.1.5 -a 'service httpd status'
#查看httpd的状态
ansible dbserver -m service -a 'enable=true name=httpd state=started'
#启动httpd并设为开机启动
9.shell模块:可以在被管理主机上运行命令,并支持像管道等功能的复杂命令
例:
ansible dbserver -m shell -a 'echo 123456 | passwd --stdin user1'
#给用户设置密码
10.script模块:将本地脚本复制到被管理主机上运行,使用相对路径来指定脚本
例:ansible dbserver -m script -a 'test.sh'
11.yum模块:负责在被管理主机上安装和卸载软件包,需要在被管理主机上配置yum仓库
name:指定安装的软件包及其版本号
state:软件包的状态,present、latest表示安装(默认安装),absent表示卸载
例:
安装:ansible webserver -m yum -a 'name=httpd'
卸载:ansible webserver -m yum -a 'name=httpd state=absent'
12.setup模块:收集、查看被管理主机的facts(ansible采集被管理主机设备信息的一个功能),每个被管理主机在接受并运行管理命令之前,都会向管理主机发送自己的相关信息
例:ansible dbserver -m setup
四、YAML介绍
1.YAML是一种用来表达资料序列的格式,是一种标记语言
2.YAML语法
1)文件的第一行应该以"—”(三个连字符)开始,表明YMAL文件的开始。
2)在同一行中,#之后的内容表示注释,类似于shell, python和ruby。
3)YMAL中的列表元素以”-”开头然后紧跟着-一个空格,后面为元素内容。
4)同一个列表中的元素应该保持相同的缩进。否则会被当做错误处理。
3.常用数据类型
1)list:列表(list)的所有元素均使用“-”开头
如:
-Apple
-orange
-mango
2)dictionary:字典(dictionary)通过key与value进行标识
如:
name:zhangsan
job:techear
也可以使用key:value的形式放置于{}中
如:
{name:zhangsan,job:techear}
五、ansible基础元素介绍
1.inventory(主机清单)
1)系统默认/etc/ansible/hosts
2)主机清单可以设置为多个,且同个主机可添加到不同的组中
3)默认ssh端口管理。若非ssh端口管理,可以在主机名后同冒号加端口号来表示,如:
db2.kgc.org:223
4)如果被管理主机由规则的命名,可以用列表的方式表示,如:
www[01:05].kgc.org
www-[a:f].kgc.org
2.inventory几个重要的概念
1)主机变量:可以在定义主机时添加主机变量,便于在playbook中使用,如:
[webservers]
www1.kkk.com http_port=80 maxRequestsChild=808
www2.kkk.com http_port=8080 maxRequestsChild=909
2)组变量:给指定主机设置可以在playbook中直接使用的变量,如:
[servers-vars]
ntp_server=ntp.kgc.crg
nfs_server=nfs.kgc.org
3)组嵌套:在inventory中的组可以嵌套其他的组,只能在playbook中使用,如:
[apache]
http1.kkk.org
http2.kkk.org
[nginx]
nginx1.kkk.org
nginx2.kkk.org
[wenserver:children]
apache
nginx
4)inventory参数:ansible基于ssh连接inventory中的主机时,还可通过参数指定交互方式
参数 含义
如果不配置SSH密钥认证,就可以这样对被管理主机进行认证:
vim /etc/ansible/hosts
[websrvs]
192.168.1.6 ansible_ssh_user=root ansible_ssh_pass=redhat
3.变量:在Ansible中变量名仅能由字母、数字和下划线组成,并且只能以字母开头。 可以使用两种方式来传递Ansible变量。
1)通过命令行传递变量
在运行playbook的时候,可以通过命令行的方式来传递一些变量提供给playbook
使用,如:
ansble-playbook test.yml -extra-vars "hots-www use-mageedue"
2)通过roles传递变量
当给一个主机应用角色(roles)的时候可以传递变量,然后在角色内使用这些变量,
如:
-hosts: webservers
roles:
-common
-{role:foo_app_instance,dir:'/web/htdocs/a.com',port:8080}
4.条件测试
如果需要根据变量、facts或之前任务的执行结果来作为某task执行与否的前提时,就要用到条件测试语句
1)when 语句
使用条件测试只需要在task之后添加when语句就可以,when语句支持jinja2表语法,如:
tasks:
-name:"shutdown Debin flavored systems"
command: /sbin/shutdown -h now
when:ansible_os_family -"Debian"
when语句中还可以使用jinja2的大多“fiter”,例如要忽略此前某语句的错误并其结果(failed或者success) 去运行后面指定的语句,可以使用类似示例如下:
tasks:
- command: /bin/false
register: result
ignore_errors: True
-command: /bin/something
when: result|success
-command: /bin/still/something_else
when: resutlskipped
此外,when语句中还可以使用facts或Playbook中定义的变量,条件测试的简单示例如下:
```p
vim cond.yml
- hosts: all
remote_user: root
vars:
- username: user10
tasks:
- name: create {{usermame}}user
user: name={{ usemame }
when: ansible_fqdn == "node4"
ansible-playboo cond.yml
2)迭代
当需要去执行重复任务时,可以使用迭代机制,直接将需要迭代的内容定义为item变量并进行引用,然后通过with_items 语句来指明迭代的元素,如:
-name: add several users
user: name={{ item }} state=present groups=wheel
with_items:
-testuser1
-testuser2
从功能上来说,上面的语句等同于下面的语句:
-name: add user testuser1
user: name=testuser1 state=present groups=wheel
-name: add user testuser2
user: name= testuser2 state=present groups=wheel
定义循环列表with items 如下:
-apache
-php
-mysql-server
注意with items 中的列表值也可以是字典,但引用时需要使用item.KEY格式
-{ name: apache,conf: conffiles/httd.conf}
-{ name: php,conf: conffiles/php.ini}
-{ name: mysl-server,conf: conffiles/my.cnf}
事实上,在with items中可以使用的元素还可为hashes,如:
-name: add several users
user: name={{ item.name }} stat=present groups={{ item.goups }}
with_items:
-{ name: 'testuser1,groups:'wheel'}
-{ name: 'testuser2,groups:'root'}
六、Playbook介绍
Plavbook是由一个或多个play组成的列表主要功能是将task定义好的角色归并为一组进行统一管理,也就是通过task调用Ansible的模板将多个play组织在一个Playbook中运行。
1.Playbooks本身由以下各部分组成:
1)Tasks: 任务,即调用模块完成的某操作;
2) Variables: 变量;
3) Templates: 模板;
4) Handers:处理器,当某条件满足时,触发执行的操作
5) Roles:角色
例:
-hosts: webnodes #定义的主机组,即应用的主机
vars: #定义变量
http_port:80
max_clients:256
remote_user:root
tasks: #执行的任务
-name: ensure apache is at then lastest version
yum: name=httpd sates=tarted
handlers: #处理器
-name: restart apache
service: name= httpd sate restarted
6)play中hosts, variables, roles, tasks等对象的表示方法都是键值中间以”:”分隔表示,":” 后面还要增加一个空格
例:
vim test. yml
- var iables:
- hosts: websrvs
remote_ user: root
tasks:
- name: install mysql- server package #描述
yum:
- name=mysql-server state=persent
name: starting mysqld service