自动化运维工具ansible

运维自动化发展历程及技术应用

3.1 自动化运维工具ansible_第1张图片

3.1 自动化运维工具ansible_第2张图片

Iaas 基础设施即服务
Pass 平台服务
SaaS 软件即服务

云计算工程师核心职能
3.1 自动化运维工具ansible_第3张图片

Linux运维工程师职能划分

3.1 自动化运维工具ansible_第4张图片

自动化动维应用场景

文件传输
命令执行
应用部署
配置管理
任务流编排

企业实际应用场景分析

1 Dev开发环境

使用者:程序员
功能:程序员开发软件,测试BUG的环境
管理者:程序员123

2 测试环境

使用者:QA测试工程师
功能:测试经过Dev环境测试通过的软件的功能
管理者:运维
说明:测试环境往往有多套,测试环境满足测试功能即可,不宜过多
(1)测试人员希望测试环境有多套,公司的产品多产品线并发,即多个版本,意味着多个版本同步测试
(2)通常测试环境有多少套和产品线数量保持一样123456

3 发布环境:代码发布机,有些公司为堡垒机(安全屏障)

使用者:运维
功能:发布代码至生产环境
管理者:运维(有经验)
发布机:往往需要有2台(主备)1234

4 生产环境

使用者:运维,少数情况开放权限给核心开发人员,极少数公司将权限完全开放给开发人员并其维护
功能:对用户提供公司产品的服务
管理者:只能是运维
生产环境服务器数量:一般比较多,且应用非常重要。往往需要自动工具协助部署配置应用1234

5 灰度环境(生产环境的一部分)

使用者:运维
功能:在全量发布代码前将代码的功能面向少量精准用户发布的环境,可基于主机或用户执行灰度发布
案例:共100台生产服务器,先发布其中的10台服务器,这10台服务器就是灰度服务器
管理者:运维
灰度环境:往往该版本功能变更较大,为保险起见特意先让一部分用户优化体验该功能,待这部分用户使用没有重大问题的时候,再全量发布至所有服务器12345

程序发布

预发布验证

新版本的代码先发布到服务器(跟线上环境配置完全相同,只是未接入到调度器)

程序发布:

不能导致系统故障或造成系统完全不可用
不能影响用户体验
灰度发布:
发布路径:
把原来的旧版本保留
/webapp/tuangou-1.1
/webapp/tuangou
/webapp/tuangou-1.21234

发布过程:在调度器上下线一批主机(标记为maintanance状态) –> 关闭服务 –> 部署新版本的应用程序 –> 启动服务 –> 在调度器上启用这一批服务器。

自动化灰度发布:脚本、发布平台

常用自动化运维工具

1 Ansible:python,Agentless,中小型应用环境(不需要在客户端安装代理程序,2 基于ssh来管理,300-500台服务器)
3 Saltstack:python,一般需部署agent,执行效率更高
4 Puppet:ruby, 功能强大,配置复杂,重型,适合大型环境
5 Fabric:python,agentless
6 Chef: ruby,国内应用少
7 Cfengine
8 func

企业级自动化运维工具应用实战ansible

公司计划在年底做一次大型市场促销活动,全面冲刺下交易额,为明年的上市做准备。公司要求各业务组对年底大促做准备,运维部要求所有业务容量进行三倍的扩容,并搭建出多套环境可以共开发和测试人员做测试,运维老大为了在年底有所表现,要求运维部门同学尽快实现,当你接到这个任务时,有没有更快的解决方案?

Ansible

特性

模块化:调用特定的模块,完成特定任务。
有Paramiko,PyYAML,Jinja2(模板语言)三个关键模块。
支持自定义模块。
基于Python语言实现。
部署简单,基于python和SSH(默认已安装),agentless。
安全,基于OpenSSH。
支持playbook编排任务。
幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况。
无需代理不依赖PKI(无需ssl)。
可使用任何编程语言写模块。
YAML格式,编排任务,支持丰富的数据结构。
较强大的多层解决方案。

ansible架构

3.1 自动化运维工具ansible_第5张图片

  • ansible是基于key的,所以需要将主机间实现key验证。当然用密码也可以,只是比较麻烦

Ansible工作原理

3.1 自动化运维工具ansible_第6张图片

直接使用ansible命令来执行一条命令
当生产环境稳定后可以用ansible编写playboot脚本来执行
可以使用公有云或私有云
可以使用CMDB,配置管理数据库

Ansible主要组成部分

ANSIBLE PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,通常是JSON格式的YML文件
INVENTORY:Ansible管理主机的清单/etc/anaible/hosts
MODULES:Ansible执行命令的功能模块,多数为内置的核心模块,也可自定义
PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用
API:供第三方程序调用的应用程序编程接口
ANSIBLE:组合INVENTORY、API、MODULES、PLUGINS的绿框,可以理解为是ansible命令工具,其为核心执行工具

Ansible命令执行来源:
USER,普通用户,即SYSTEM ADMINISTRATOR
CMDB(资产管理系统) API 调用
PUBLIC/PRIVATE CLOUD API调用
USER-> Ansible Playbook -> Ansibile
利用ansible实现管理的方式:
Ad-Hoc 即ansible命令,主要用于临时命令使用场景
Ansible-playbook 主要用于长期规划好的,大型项目的场景,需要有前提的规划
-Ansible-playbook(剧本)执行过程:
将已有编排好的任务集写入Ansible-Playbook
通过ansible-playbook命令分拆任务集至逐条ansible命令,按预定规则逐条执行
Ansible主要操作对象:
HOSTS主机
NETWORKING网络设备

注意事项
执行ansible的主机一般称为主控端,中控,master或堡垒机
主控端Python版本需要2.6或以上
被控端Python版本小于2.4需要安装python-simplejson
被控端如开启SELinux需要安装libselinux-python
windows不能做为主控端

安装

rpm包安装: EPEL源

yum install ansible
ansible不是一个服务/etc/hosts是最重要的文件
ansible是一个管理端123

编译安装

yum -y install python-jinja2 PyYAML python-paramiko
python-babel python-crypto
tar xf ansible-1.5.4.tar.gz
cd ansible-1.5.4
python setup.py build
python setup.py install
mkdir /etc/ansible
cp -r examples/* /etc/ansible12345678

Git方式
git clone git://github.com/ansible/ansible.git --
recursive12

cd ./ansible
source ./hacking/env-setup

pip安装: pip是安装Python包的管理器,类似yum

yum install python-pip python-devel
yum install gcc glibc-devel zibl-devel rpm-bulid openssl-devel
pip install --upgrade pip
pip install ansible --upgrade1234

确认安装: ansible –version

相关文件

配置文件

/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
/etc/ansible/hosts 主机清单被管理端的主机存放,如果将主机不写入这个文件则无法管理这个主机
/etc/ansible/roles/ 存放角色的目录123

如果要管理的ip没加入到hosts这文件中则会出现这种错误

[root@centos7 yum.repos.d]# ansible 192.168.27.101 -m ping
[WARNING]: Could not match supplied host pattern, ignoring: all

[WARNING]: provided hosts list is empty, only localhost is available

[WARNING]: Could not match supplied host pattern, ignoring: 192.168.27.101

[WARNING]: No hosts matched, nothing to do12345678

将主机加入到hosts文件中,最简单的方法是将要管理的主机ip写进去,推荐,用分类的方式
3.1 自动化运维工具ansible_第7张图片

分类的方式

[root@centos7 yum.repos.d]# vim /etc/ansible/hosts

#   - Blank lines are ignored
#   - Groups of hosts are delimited by [header] elements

# - You can enter hostnames or ip addresses
# - A hostname/ip can be a member of multiple groups

192.168.27.[101:103] 也可以写成这种格式这表示192.168.27.101到103直接的ip

# Ex 1: Ungrouped hosts, specify before any group headers.

## green.example.com
## blue.example.com
## 192.168.100.1
## 192.168.100.10
# Ex 2: A collection of hosts belonging to the 'webservers' group

## [webservers]
## alpha.example.org
## beta.example.org
## 192.168.1.100
## 192.168.1.110

# If you have multiple hosts
``` following a pattern you can specify

them like this:

www[001:006].example.com

Ex 3: A collection of database

``` servers in the 'dbservers' group

## [dbservers]
## 
## db01.intranet.mydomain.net
## db02.intranet.mydomain.net
## 10.25.1.56
## 10.25.1.57
# Here's another example of host ranges, this time there are no
# leading 0s:

## db-[99:101]-node.example.com1234567891011121314151617181920212223242526272829303132333435363738394041

然后在次用ping命令来检查主机是否活跃
3.1 自动化运维工具ansible

因为ansible是基于shh的,第一次链接需要输入yes/no,不是很方便,想要去掉这个yes/no需要修改配置文件/etc/ansible/ansible.cfg这个文件
3.1 自动化运维工具ansible_第8张图片

把host_key_checking = False这一行注释去掉
在重新执行就不会提示这样第一次yes或no
3.1 自动化运维工具ansible_第9张图片
但是报错,也没有让我们输入密码,ansible默认是基于key验证的,如果想使用密码在后面加-k
3.1 自动化运维工具ansible

这样就成功了,当然我们也可以多台主机,主机ip之间用逗号隔开
3.1 自动化运维工具ansible_第10张图片
当然我们只用输入一遍密码两个主机都成功了,说明如果主机密码不一样会报错

3.1 自动化运维工具ansible_第11张图片

用分组的方式将被管理主机写如/etc/ansible/ansible.cfg文件中

分组就是将一组主机分成一组,并在中括号里取一个组名,一个主机可以在多个组里。还有一个默认组就是all,这个组表示在这个文件中的所有主机

创建key验证

用ssh-keygen 生成公钥私钥对

3.1 自动化运维工具ansible_第12张图片

[root@ansible ~]# cd ~
[root@ansible ~]# cd .ssh/
[root@ansible .ssh]# ls
id_rsa id_rsa.pub known_hosts
[root@ansible .ssh]# 12345

用ssh-copy-id 要连接的ip主机
3.1 自动化运维工具ansible_第13张图片
完成key验证后,就不用加-k选项了

3.1 自动化运维工具ansible_第14张图片

由于ansible默认是没有启用日志的,所以我们要在配置文件中启用配置文件

3.1 自动化运维工具ansible_第15张图片

3.1 自动化运维工具ansible
默认也是没有启用的,把注释去掉启用,当然也可改成其它路径
执行以下ansible命令,然后看一下日志文件
3.1 自动化运维工具ansible_第16张图片
这里面存放着命令的执行结果

程序
/usr/bin/ansible 主程序,临时命令执行工具
/usr/bin/ansible-doc 查看配置文档,模块功能查看工具
/usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台
/usr/bin/ansible-playbook 定制自动化任务,编排剧本工具
/usr/bin/ansible-pull 远程执行命令的工具
/usr/bin/ansible-vault 文件加密工具
/usr/bin/ansible-console 基于Console界面与用户交互的执行工具1234567

主机清单inventory

Inventory 主机清单
ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory file中将其分组命名
默认的inventory file为/etc/ansible/hosts
inventory file可以有多个,且也可以通过DynamicInventory来动态生成
/etc/ansible/hosts文件格式
inventory文件遵循INI文件风格,中括号中的字符为组名。可以将同一个主机同时归并到多个不同的组中;此外,当如若目标主机使用了非默认的SSH端口,还可以在主机名称之后使用冒号加端口号来标明

ntp.magedu.com
[webservers]
www1.magedu.com:2222
www2.magedu.com
[dbservers]
db1.magedu.com
db2.magedu.com
db3.magedu.com12345678

如果主机名称遵循相似的命名模式,还可以使用列表的方式标识各主机

示例

[websrvs]
www[01:100].example.com
[dbsrvs]
db-[a:f].example.com1234

ansible配置文件

Ansible 配置文件/etc/ansible/ansible.cfg (一般保持默认)
[defaults]
#inventory = /etc/ansible/hosts # 主机列表配置文件
#library = /usr/share/my_modules/ # 库文件存放目录
#remote_tmp = $HOME/.ansible/tmp #临时py命令文件存放在远程主机目录,就是当我们执行命令是相当于把命令复制到远程主机中这个目录下生成一个临时文件,执行完后删除
#local_tmp = $HOME/.ansible/tmp # 本机的临时命令执行目录
#forks = 5 # 默认并发数,如果有100台主机就会5台5台的执行,分批次的,也可以调100,要求机器性能好
#sudo_user = root # 默认sudo 用户,需要在被管理主机上做sudo配置
#ask_sudo_pass = True #每次执行ansible命令是否询问ssh密码
#ask_pass = True
#remote_port = 22 因为是基于ssh,ssh默认是22端口,如果ssh端口号改成其它的,这里也是要改的
#host_key_checking = False # 检查对应服务器的host_key,建议取消注释123456789101112

ansible系列命令

Ansible系列命令

ansible ansible-doc ansible-playbook ansible-vault
ansible-console ansible-galaxy ansible-pull12

ansible-doc: 显示模块帮助

ansible-doc [options] [module...]
-a 显示所有模块的文档
-l, --list 列出可用模块
-s, --snippet 显示指定模块的playbook片段1234

示例
ansible-doc –l 列出所有模块
ansible-doc ping 查看指定模块帮助用法
ansible-doc –s ping 查看指定模块帮助用法简要信息123

3.1 自动化运维工具ansible

3.1 自动化运维工具ansible_第17张图片

ansible通过ssh实现配置管理、应用部署、任务执行等功能,建议配置ansible端能基于密钥认证的方式联系各被管理节点

ansible [-m module_name] [-a args]

--version 显示版本
-m module 指定模块,默认为command模块
-v 详细过程 –vv -vvv更详细
--list-hosts 显示主机列表,可简写—list
-k, --ask-pass 提示连接密码,默认Key验证
-K, --ask-become-pass 提示输入sudo
-C, --check 检查,并不执行,只是模拟的执行一次,并不会在真正的主机上执行
-T, --timeout=TIMEOUT 执行命令的超时时间,默认10s
-u, --user=REMOTE_USER 执行远程执行的用户,指定以哪个用户执行,如果不指定则默认是root
-b, --become 代替旧版的sudo 切换12345678910

显示主机列表
3.1 自动化运维工具ansible_第18张图片
指定用户
3.1 自动化运维工具ansible_第19张图片
也可以用sudo,提前是要把对端主机上配置好sudo文件
配置sudo文件,这里我们直接把用户加入wheel组中,因为wheel组中在sudo是一个管理员组,拥有root的权限
3.1 自动化运维工具ansible_第20张图片
这里用command模块是命令模块,加-a是可以后面跟参数,但是这里报错,让我们输入sudo的密码加上大K参数
3.1 自动化运维工具ansible_第21张图片
这里会让输入两边口令,一个是guo用户ssh的口令,一个sudo的口令,这样会很麻烦,我们改一下sudo配置文件设置成不输入此密码,在/etc/sudoers
3.1 自动化运维工具ansible_第22张图片
这样就只用输入一个ssh口令了

3.1 自动化运维工具ansible_第23张图片

如何将guo用户也设置成key验证呢

用命令ssh-copy-i [email protected]
3.1 自动化运维工具ansible_第24张图片
在执行以下就不用输入密码了

3.1 自动化运维工具ansible_第25张图片

usermod -aG wheel guo1