传统运维
传统运维工作比较繁琐,尤其是新的系统上线的场景,一切都是从零开始,包括虚拟机的创建,主机名的修改,系统的初始化等等,在机器不多的情况下人工还能应付的过来,如果有上百台机器呢?最初也是用堆人的方法来做的。但这样的方式出错率高,而且有时还会遗漏。只能通过相互检查的方式来验证,但这样就会花费更多的时间,相应的时间/人工成本也会上升。人工的方式因个人部署习惯千差万别,导致一些项目难以维护。
自动运维

运维自动化的目标
1、组件故障无需人工干预自动修复
2、出现异常人工一键干预
3、监控运维故障自动恢复
为啥会选择Ansible
名称 | 优势 | 劣势 | 成本 |
Puppet |
•
模块由
Ruby
或
Ruby
子集编写
•
push
命令可以即可触发变更
•
Web
界面生成处理报表、资源清单、实时节点管理
•
代理运行端进行详细、深入的报告和对节点进行配置
|
•
相对其他工具较复杂,需学习
Puppet
的
DSL
或
Ruby
•
安装过程缺少错误校验和产生错误报表
|
•
开源软件免费
•
•
puppet
企业版每年内个节点花费约¥
100
|
SaltStack |
•
状态文件可用简单
YAML
配置模块或复杂的
Python/
PyDSL
脚本
•
与客户端可以基于
SSH
或在被管节点安装代理
•
Web
界面可看到运行的工作、
minion
状态、事件日志、可在客户端执行命令
•
扩展能力极强
|
•
Web
界面像毒药竞争产品不稳定与相对不完善
•
缺乏生成深度报告的能力
|
•
开源软件免费
•
SaltStack
企业版每年内个节点花费约¥
150
,随着数量增加相应的会有折扣
|
Ansible |
•
模块可以用任何语言开发
•
被管节点不需要安装代理软件
•
有
Web
管理界面、可配置用户、组、资源清单和执行
Playbook
•
安装、运行极其简单
|
•
对备管理节点为
Windows
有待加强
•
Web
管理界面是内置的
Ansible
的一部分
•
需导入资源清单
•
执行效率较低
|
•
开源版本免费
•
Ansible
Tower
小于
10
台被管理节点免费
•
超过
10
台后每年每台需支付¥
100~$250
的支持服务费用
|
Ansible特性
官方介绍“Ansible is Simple IT Automation”——简单的自动化IT工具。这个工具的目标有这么几项:

Ansible安装
yum安装:
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/repo/centos7_base.repo
EPEL源 :yum -y install epel-release
yum install ansible -y
pip安装:
pip是安装Python包的管理器,类似yum
yum install python-pip python-devel
yum install gcc glibc-devel zibl-devel rpm-bulid openssl-devel
确认安装: ansible --version
Ansible相关文件
/etc/ansible/hosts文件格式
在这里添加的是IP,在下文中都是all,全部的意思,要是在IP上面加组,那就是直接用添加的组,或者直接使用某个IP。
可以直接加要被控机的IP,或者分组后在组的下面写被控机的IP
Ansible配置文件
连接被管卡机
1、在管理节点生成公钥
ssh-keygen 路径为:~/.ssh/id_rsa.pub,可以直接enter 免密登陆
2、添加目标节点的SSH认证信息,在管理节点执行如下命令
ssh-copy-id root@目标节点IP
以下是模块的介绍。
Command模块具有局限性
ansible 是工具 all (这里指的是我在配置文件里面写的两个IP) -m command是选择这个模块 -a 写后面要跟的参数。command模块不支持特殊符号,也不支持变量。
Shell 模块
shell模块是一个比较强大的模块,是通过/bin/sh执行的,支持特殊符号和变量
支持正则,也支持特殊符号
script模块 远程机器上执行本地脚本
ansible all -m script -a "/root/a.sh" # 执行本地的文件,管控机的文件
ansible all -m script -a "creates=/tmp /root/a.sh" # 判断被控机上的文件
这里可以看到在管控机执行一个都有的脚本文件,被管控机都同时执行
ansible all -m script -a "creates=/root/a.sh /root/a.sh" # 判断被控机上的文件是否存在,如果不存在,就执行,如果存在,就跳过
Copy模块
从ansible服务器主控端复制文件到远程主机
ansible all -m copy -a "src=/root/f1 dest=/root/tmp/”
#如果目标存在,默认覆盖,此处指定先备份
ansible all -m copy -a “src=/root/test.sh dest=/tmp/test2.sh owner=wang mode=600 backup=yes”
#指定内容,直接生成目标文件
ansible all -m copy -a “content=‘test line1\ntest lin2’ dest=/tmp/test.txt”
#复制/etc/下的文件,不包括/etc/目录本身
ansible all -m copy -a “src=/etc/ dest=/backup”
Fetch模块
从远程主机提取文件至ansible的主控端,copy相反,目前不支持目录
ansible all -m fetch -a ‘src=/root/test1.sh dest=/data/scripts’
file模块
功能:设置文件属性
#创建空文件
ansible all -m file -a ‘path=/data/test.txt state=touch’
ansible all -m file -a ‘path=/data/test.txt state=absent’
ansible all -m file -a ‘path=/root/test.txt owner=linux mod=755’
#创建目录
ansible all -m file -a ‘path=/data/mysql state=directory owner=mysql group=mysql’
#创建软链接
ansible all -m file -a ‘src=/data/testfile dest=/data/testfile-link state=link’
#删除软链接
ansible all -m file -a ‘src=/data/testfile dest=/data/testfile-link state=absent’
创建目录
ansible all -m file -a "path=/transfer state=directory"
yum模块
#enablerepo启用某个源
#name:要进行操作的软件包的名字,也可以传递一个url或者一个本地的rpm包的路径
State定义软件包状态
-present:安装
-absent:删除
-latest:安装最新的
示例:
ansible all –m yum –a “name=httpd state=present”
这是被管控的机器,可以通过rpm去查看
ansible all –m yum –a “name=httpd state=latest”
ansible all –m yum –a ‘name=“@Development tools” state=present’
ansible all –m yum –a “name=http://nginx.org/packages/centos/6/noarch/RPMS/
nginx-release-centos-6-0.el6.ngx.noarch.rpm state=present”
cron模块
功能:cron模块主要用于添加、删除、更新操作系统的crontab任务计划
name:任务计划名称
cron_file:替换客户端该用户的任务计划的文件
minute:分(0-59, * ,*/2)
hour:时(0-23, * ,*/2)
day:日(1-31, * ,*/2)
month:月(1-12, * , */2)
weekday:周(0-6或1-7, *)
job:任何计划执行的命令
backup:是否备份之前的任务计划
user:新建任务计划的用户
state:指定任务计划present、absent
#特殊的时间范围,参数:reboot(重启时),annually(每年),monthly(每月),weekly(每周),
daily(每天),hourly(每小时)
# 添加时名字必须不同,不加名称为None(crontab -l查看计划任务)
ansible all -m cron -a "minute=12 name=touchfile job='touch /tmp/xiaoqiang.txt'" # 创建
定时任务:分钟为12的时候创建一个名字为touchfile job具体的创建命令
ansible all -m cron -a "name=touchfile state=absent" # 删除
ansible all -m cron -a "minute=12 name=touchfile2 job='touch /tmp/jason.txt' disabled=yes" # 注释
ansible all -m cron -a "name=None state=absent" # 删除名称为空的计划任务
ansible all -m cron -a “name=‘check dirs’ hour=5,2 job=‘ls -alh’"
service模块
功能:实现远程管理服务的生命周期
# 关键参数
enabled #开机启动 yes|no
name #服务名称,必选项
runlevel #运行级别
state #状态
started
stopped
restarted
reloaded
ansible all -m service -a "name=httpd state=started" #启动
ansible all -m service -a "name=nginx state=stopped" #关闭
ansible all -m service -a "name=keepalived enabled=yes" #设置开机自启动
user模块
# 关键参数
group # 属组
groups # 附加组
home # 设置家目录
name # 用户名
remove # 删除用户并删除用户的家目录
shell # 用户登录后的shell
system # 系统用户
uid # 用户的id
state #创建或删除
shell #制定用户shell环境
#创建用户,并指定用户的shell,家目录,uid,以及附加组
ansible all -m user -a "name=alex10 shell=/sbin/nologin home=/opt/alex10 uid=3000 groups=root“
可以在被管控机上查到创建的用户
ansible all -m user -a "name=alex11 shell=/sbin/nologin home=/opt/alex11"
ansible all -m user -a "name=alex12 system=yes" #创建系统用户
(0是超级用户(root)的标识号,centos7是1~999由系统保留,作为管理账号,普通用户的标识号从500开始)
ansible all -m user -a "name=alex12 state=absent" #删除用户,单不删除家目录
ansible all -m user -a "name=alex11 state=absent remove=yes" # 删除用户并删除用户的家目录
hostname模块
ansible all -m shell -a 'hostname'
ansible all -m shell -a 'hostnamectl set-hostname localhost'
setup模块
setup 模块用于收集远程主机的一些基本信息。
filter参数:用于进行条件过滤。如果设置,仅返回匹配过滤条件的信息。
返回的信息非常多,很多情况我们并不需要全部的信息,可以通过过滤获得指定的信息。
ansible all -m setup -a "filter=ansible_all_ipv4_addresses”
获取对应主机的内存信息
ansible all -m setup -a "filter=ansible_memory_mb“
通过通配符实现模糊匹配,比如以”mb”关键字结尾的信息
ansible all -m setup -a "filter=*mb"
总结:
以上是Ansible自动化工具的一部分,后续还有一期继续写关于自动化运维,
总结一下,自动化运维工具很好的解决了批量新的服务器安装修改文件的好处
格式: ansible + 配置文件里面的IP或者IP所属的组 + -m +模块 -a “所要执行的参数”
以上是一些比较常用的模块,大家共同学习
配置文件
/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性(一般无需修改)
/etc/ansible/hosts 主机清单(将被管理的主机放到此文件)
/etc/ansible/roles/ 存放角色的目录
程序
/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界面与用户交互的执行工具