运维介绍
运维日常工作
1、云计算运维工程师核心职能:
- 平台架构组建:负责参与并审核架构设计和合理性、可运维性;利用开源方案搭建运维平台技术架构,确保产品发布之后高效稳定的运行,保障并不断提升服务的可用性,确保用户数据安全,提升用户体验;
- 日常运营保障:负责运维技术或运维平台可保障产品高效的发布上线,负责保障产品的7*24h稳定运行,出现问题时可以快速定位并解决,不断优化架构,以提升系统整体的稳定性
- 性能、效率优化:利用自动化的工具、平台,不断优化系统架构,提升部署效率,提升性能,稳定性,高可用性,安全性,可扩展性,可伸缩性等
2、运维职能划分:
3、企业实际应用场景:
dev开发环境:
- 使用者:开发人员
- 功能:开发软件,调试bug
- 管理者:开发人员
测试环境
- 使用者:QA测试人员
- 功能:测试开发提交的代码
- 管理者:运维人员
发布环境:
- 使用者:运维人员
- 功能:发布通过测试的代码到生产环境
- 管理者:运维
- 发布机:2台以上(主备)
生产环境:
- 使用者:运维人员
- 功能:运行正式代码,对外提供服务
- 管理者:运维
- 特点:服务器数量较多,都需要自动化工具提升效率,较少人为失误
灰度环境:
- 使用者:运维
- 功能:代码版本变更时,只对线上部分主机做修改,新老版本并存,新版本一般只引流给部分用户,如申请游戏新版本的内测用户
- 管理者:运维
4、程序发布要求
- 不能导致系统故障,
- 不能影响用户体验
- 预发布验证:
- 新版本发布到服务器测试,(和线上环境相同,只是没接入前方调度器)
- 灰度发布划分标准:
- 主机
- 用户
- 业务
- 每个版本要带版本号,通过修改软链接切换
- /webapp/myapp
- /webapp/myapp1-1
- /webapp/myapp1-2
- 发布过程
- 调度器:lvs或haproxy,分批下线机器,更新代码,测试正常,重新上线,直到全部机器更新完成
- 脚本、或自动化平台,辅助完成
什么是运维自动化
- 文件传输
- 应用编排
- 配置管理
- 任务流编排
运维自动化常用工具
- ansible:python,agentless,中小型环境
- saltstack:python,需要agent,
- puppet:ruby,适合大型环境
- fabric:python
- chef:ruby
- cfengine
- func
ansible
学习文档:
官方文档:https://docs.ansible.com/
有ansible,ansible tower,ansible galaxy,ansible network四大类的官方文档;
ansible galaxy:社区贡献的role,可以下载,学习,参考,甚至可以直接用
ansible network:ansible管理网络设备相关文档
ansible tower:可以理解为红帽对ansible的商业发行版,一个集成的解决方案,基于web,更易用;
中文翻译官方文档:http://ansible.com.cn/index.html
wikipedia介绍:https://en.wikipedia.org/wiki/Ansible_(software)
作者:michael dehaan(cobbler 和 func作者)后被红帽收购
ansible基础与特性
- 模块化:通过调用特定的模块,完成特定类型的任务
- 关键模块:paramiko、pyyaml、jinja2
- 支持自定义模块
- 基于python
- 部署简单,无需agent,通过openssh管理主机
- 安全
- 支持playbook编排任务
- 幂等性,任务执行多次,结果一致
- yaml格式,编排任务,易读
ansible架构
ansible工作原理
ansible软件组成
ansible playbook:定义任务流的配置文件,ansible读取并顺序执行,通常为json格式的yaml文件
inventory:主机清单:/etc/ansible/hosts
modules:ansible执行命令的功能模块,多为内置核心模块,可自定义模块
plugins:插件,连接型插件、循环插件、变量插件、过滤插件等
api:供第三方程序调用的编程接口
1、ansible命令执行来源
user、普通用户,系统管理员
cmdb、通过api调用,一般取出其中主机清单
public/private cloud、api调用
user、ansible playbook、ansible
2、ansible实现管理的方式
ad-hoc即ansible命令行,临时场景
ansible-playbook,长期的,事先规则的,大型项目,可重复利用,
3、ansible-playbook执行过程
将编排好的任务写入playbook,ansible读取,按照顺序执行,不同类型的任务通过调用不同的模块来完成;
4、ansible管理对象
- 主机
- 网络设备
5、ansible注意事项
- 执行ansible主机为控制端
- 控制端python版本,2.6及以上
- 被控制端python小于2.4需安装python-simplejson
- 被控制端若开启selinux需要安装libselinux-python
- windows不能作为控制端
ansible安装
https://docs.ansible.com/ansible/latest/installation_guide/index.html
官方文档:ansible具有多种安装方式
yum安装
#配置epel源后,直接安装
[root@host2 ~]# yum list ansible
Available Packages
ansible.noarch 2.9.10-1.el7 epel
[root@host2 ~]# yum install -y ansible
[root@host2 ~]# ansible --version
ansible 2.9.13
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Apr 11 2018, 07:36:10) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]
编译安装
#安装依赖包
[root@host3 ansible-1.5.4]# yum install -y python-jinja2 PyYAML python-paramiko python-babel python-crypto
#解压源码包,编译安装
[root@host3 ansible-1.5.4]# tar -xf ansible-1.5.4.tar.gz -C /usr/local/
[root@host3 ansible-1.5.4]# cd /usr/local/ansible-1.5.4/
[root@host3 ansible-1.5.4]# python setup.py build
[root@host3 ansible-1.5.4]# python setup.py install
[root@host3 ansible-1.5.4]# mkdir /etc/ansible
[root@host3 ansible-1.5.4]# cp -r examples/* /etc/ansible/
[root@host3 ansible-1.5.4]# ansible --version
ansible 1.5.4
git安装
[root@host4 ~]# git clone https://github.com/ansible/ansible.git --recursive
[root@host4 ~]# cd ansible/
[root@host4 ansible]# ll
total 92
drwxr-xr-x 2 root root 243 Oct 7 14:42 bin
drwxr-xr-x 3 root root 85 Oct 7 14:42 changelogs
-rw-r--r-- 1 root root 35148 Oct 7 14:42 COPYING
drwxr-xr-x 6 root root 60 Oct 7 14:42 docs
drwxr-xr-x 3 root root 191 Oct 7 14:42 examples
drwxr-xr-x 7 root root 4096 Oct 7 14:42 hacking
drwxr-xr-x 3 root root 21 Oct 7 14:42 lib
drwxr-xr-x 2 root root 104 Oct 7 14:42 licenses
-rw-r--r-- 1 root root 9913 Oct 7 14:42 Makefile
-rw-r--r-- 1 root root 1755 Oct 7 14:42 MANIFEST.in
drwxr-xr-x 8 root root 90 Oct 7 14:42 packaging
-rw-r--r-- 1 root root 5754 Oct 7 14:42 README.rst
-rw-r--r-- 1 root root 361 Oct 7 14:42 requirements.txt
-rw-r--r-- 1 root root 15418 Oct 7 14:42 setup.py
-rw-r--r-- 1 root root 4426 Oct 7 14:42 shippable.yml
drwxr-xr-x 9 root root 111 Oct 7 14:42 test
[root@host4 ansible]# source ./hacking/env-setup
Ansible now needs setuptools in order to build. Install it using your package manager (usually python-setuptools) or via pip (pip install setuptools).
Setting up Ansible to run out of checkout...
PATH=/root/ansible/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PYTHONPATH=/root/ansible/lib
MANPATH=/root/ansible/docs/man:/usr/local/share/man:/usr/share/man
Remember, you may wish to specify your host file with -i
Done!
[root@host4 ansible]# echo $?
0
[root@host4 ansible]# ansible --version
Traceback (most recent call last):
File "/root/ansible/bin/ansible", line 62, in <module>
import ansible.constants as C
File "/root/ansible/lib/ansible/constants.py", line 12, in <module>
from jinja2 import Template
ImportError: No module named jinja2
pip安装
利用pip命令安装,pip为python程序包的管理程序,类比yum
[root@host1 ~]# yum install -y python-pip python-devel
[root@host1 ~]# yum install -y gcc glibc-devel zlib-devel rpm-build openssl-devel
[root@host1 ~]# pip install --upgrade pip
[root@host1 ~]# pip install ansible --upgrade
ansible配置文件
#yum安装后目录结构:
[root@host2 ~]# rpm -ql ansible |less
/etc/ansible
/etc/ansible/ansible.cfg
主配置文件,配置ansible的工作特性
/etc/ansible/hosts
主机清单
/etc/ansible/roles
存放角色的目录
/usr/bin/ansible
/usr/bin/ansible-2
/usr/bin/ansible-2.7
主程序,临时命令行工具,用于临时任务
/usr/bin/ansible-config
/usr/bin/ansible-connection
/usr/bin/ansible-console
/usr/bin/ansible-console-2
/usr/bin/ansible-console-2.7
基于console界面和用户交互工具
/usr/bin/ansible-doc
/usr/bin/ansible-doc-2
/usr/bin/ansible-doc-2.7
查看配置文档,模块功能,类比于man
/usr/bin/ansible-galaxy
/usr/bin/ansible-galaxy-2
/usr/bin/ansible-galaxy-2.7
下载上传,官网上roles模块的工具
/usr/bin/ansible-inventory
/usr/bin/ansible-playbook
/usr/bin/ansible-playbook-2
/usr/bin/ansible-playbook-2.7
编排任务流的命令
inventory主机清单:
ansible是批量操作主机,为了区分,可以在inventory file中为主机分组,如web组,数据库组,app组,调度器组等
/etc/ansible/hosts
#下为yum安装时,默认的配置文件,
#[group_name] 可以对主机进行归类分组;
#没有[group_name]的可以不分
#支持类似通配符的匹配多台主机,用[]表示,
#ip,主机名均可
[root@host2 ~]# vim /etc/ansible/hosts
# This is the default ansible 'hosts' file.
#
# It should live in /etc/ansible/hosts
#
# - Comments begin with the '#' character
# - 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
# Ex 1: Ungrouped hosts, specify before any group headers.
# This is the default ansible 'hosts' file.
#
# It should live in /etc/ansible/hosts
#
# - Comments begin with the '#' character
# - 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
# 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.com
#ssh服务非标准22端口,可以加端口指定
ntp.magedu.com
[webservers]
www1.magedu.com:2222 www2.magedu.com
[dbservers]
db1.magedu.com
db2.magedu.com
db3.magedu.com
#列表方式通配主机名
[websrvs]
www[1:100].example.com
[dbsrvs]
db-[a:f].example.com
/etc/ansible/ansible.cfg
一般保持默认
1 # config file for ansible -- https://ansible.com/
2 # ===============================================
3
4 # nearly all parameters can be overridden in ansible-playbook
5 # or with command line flags. ansible will read ANSIBLE_CONFIG,
6 # ansible.cfg in the current working directory, .ansible.cfg in
7 # the home directory or /etc/ansible/ansible.cfg, whichever it
8 # finds first
9
10 [defaults]
11
12 # some basic default values...
13
14 #inventory = /etc/ansible/hosts
15 #library = /usr/share/my_modules/
16 #module_utils = /usr/share/my_module_utils/
17 #remote_tmp = ~/.ansible/tmp
18 #local_tmp = ~/.ansible/tmp
19 #plugin_filters_cfg = /etc/ansible/plugin_filters.yml
20 #forks = 5
21 #poll_interval = 15
22 #sudo_user = root
23 #ask_sudo_pass = True
24 #ask_pass = True
25 #transport = smart
26 #remote_port = 22
27 #module_lang = C
28 #module_set_locale = False