【假装正经的前言】
想要做一名优秀的运维师,首先要时刻铭记的就是效率!效率!效率!同样的一份工作,你拼死拼活做了一小时,人家做了10分钟,而且完美,你说你气不气,你说老板给不给人家加鸡腿。至于你,还是顶着老板的白眼多学习吧。所以,这篇博文就来介绍一个自动化运维工具,让你嗑着瓜子喝着茶分分钟搞定工作!
【严肃的说】
先来介绍一些自动化运维常用工具:
场景 | 工具 | 用途 |
---|---|---|
安装系统 | pxe/cobbler | 安装系统 |
虚拟化系统 | kvm/xen/vmware | 虚拟机 |
应用部署 | puppet/ansible/saltstack | 中大型规模 |
命令执行 | ansible/fabric/ffunc/shell | 中小型 |
ansible聚集以上部署和命令执行于一身,能够完整轻易的实现应用部署和批量命令功能,适用于主机数量中型规模,再大的使用puppet。
【自动化运维之ansible】
ansible是新出现的自动运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置,批量程序部署、批量运行命令等功能。
ansible是基于paramiko开发的,并且基于模块化工作,本身没有批量部署的能力。真正具备批量部署的是ansible所运行的模块,ansible只是提供一种框架。ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。目前已经被红帽官方收购。
【ansible特点】
1、部署简单,只需在主控制端部署ansible环境,被控制端无需做任何操作;
2、默认使用ssh协议对设备进行管理
3、有大量常规运维操作模板,可实现日常绝大部分操作。
4、配置简单、功能强大、扩展性强
5、支持API及自定义模块,可通过Python轻松扩展
6、通过playbooks来定制强大的配置、状态管理;
7、轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可。
8、提供一个功能强大、操作性强的web管理界面REST API接口—AWX平台
[ansible任务执行模式]
ad-hoc和playbook
ad-hoc:
ad-hoc模式使用单个模块,支持批量执行单条命令。ad-hoc命令是一种可以快速输入的命令,而且不需要保存起来的命令。相当于bash中的一句shell。
playbook:
playbook模式是ansible主要管理方式,也是ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件。
本篇就先来介绍ad-hoc模式。
[ansible命令执行过程]
1、加载自己的配置文件,默认/etc/ansible/ansible.cfg
2、查找对应的主机配置文件,找到要执行的主机或者组。
3、加载自己对应的模块文件,如command
4、通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器
5、对应执行用户家目录的.ansible/tmp/XXX/XXX.PY文件
6、给文件+x执行
7、执行并返回结果
8、删除临时py文件,sleep 0 退出。
【ansible安装方式】
ansible安装常用两种方式,yum安装和pip程序安装
1、使用yum安装
yum install epel-release -y
yum install ansible –y
2、使用pip(python的包管理模块)安装
pip install ansible
如果没pip,需先安装pip.yum可直接安装:
yum install python-pip
pip install ansible
安装后来看一下ansible的配置文件:
[root@centos7 ansible]# vim /etc/ansible/ansible.cfg
[defaults]
# some basic default values...
#inventory = /etc/ansible/hosts
#library = /usr/share/my_modules/
#remote_tmp = ~/.ansible/tmp
#local_tmp = ~/.ansible/tmp
#forks = 5
#poll_interval = 15
#sudo_user = root
#ask_sudo_pass = True
#ask_pass = True
#transport = smart
#remote_port = 22
#module_lang = C
#module_set_locale = False
#这里只截取了小段,并不是全部的文档
既然ansible要管理节点,那么就需要定义被管理节点的地址,此项要在/etc/ansible/hosts文件中定义:
可以直接知名主机地址或者定义一个主机组两种方法都可以。
[root@centos7 ansible]# vim /etc/ansible/hosts
[web] #定义主机组
192.168.64.129 #被管理节点
192.168.64.130 #被管理节点
ansible还有一些常用命令,例如
/usr/bin/ansible和/usr/bin/ansible-doc
/usr/bin/ansible是临时命令执行工具,常用于临时命令的执行
/usr/bin/ansible-doc是ansible模块功能查看工具。前面已经说过,ansible本身没有部署能力,真正的大佬是它所运行的模块。
下面就正式介绍ansible的常用模块,同时加上ansible任务执行的一种模式:ad-hoc。
1、ping 主机连通测试
[root@centos7 ansible]# ansible web -m ping #web是之前定义的主机组,也可以直接指定主机地址,前提是已经在文件中定义好
192.168.64.130 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.64.129 | SUCCESS => {
"changed": false,
"ping": "pong"
}
2、command:在远程主机执行命令;不支持管道命令(|)
ansible的默认模块,不必指定模块参数也可。
[root@centos7 ansible]# ansible web -m command -a "date"
192.168.64.130 | SUCCESS | rc=0 >>
Tue Dec 5 23:19:37 CST 2017
192.168.64.129 | SUCCESS | rc=0 >>
Tue Dec 5 23:19:48 CST 2017
命令模块接受命令名称,后面是空格分隔的列表参数。
给定的命令将在所有选定的节点上执行。它不会通过shell进行处理。
例如HOME和比如HOME和操作如” 小于 “<”, “>”, “|”, ” ; “, “&” “工作(需要使用(shell)模块实现这些功能)。
action:
chdir #在执行命令之前,先切换到该目录
creates #一个文件名,当文件名存在,则该命令不执行,可以用来做判断
executable #切换shell来执行命令,需要使用命令的绝对路径
free_form #要执行的Linux指令,一般使用ansible的-a 参数代替
removes #一个文件名,这个文件不存在,则该命令不执行,于creates相反的判断。
[root@centos7 ansible]# ansible web -m command -a "ls -l chdir=/tmp creates=test"
192.168.64.130 | SUCCESS | rc=0 >>
skipped, since test exists
192.168.64.129 | SUCCESS | rc=0 >>
skipped, since test exists
3、shell模块
在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道等。在执行命令的时候使用的是/bin/sh。
[root@centos7 ansible]# ansible web -m shell -a 'cat /etc/passwd|grep "root"'
192.168.64.130 | SUCCESS | rc=0 >>
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
192.168.64.129 | SUCCESS | rc=0 >>
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
4、copy:复制文件到远程主机,可以改权限等。
(1)复制文件
# ansible web -m copy -a “src= dest= ”
(2)给定内容生成文件
# ansible web -m copy -a “content= dest= ”
一些选项:
backup:在覆盖之前,将源文件备份,备份文件包含时间信息。有两个选项:yes|no
eg: # ansible web -m copy -a “content=cidchewudhwiedwetest dest=/app/test backup=yes”
在远程主机上,会将源文件备份,并在文件名后面加上随机数和时间作为标注。
content:用于替代”src”,可以直接设定指定文件的值
dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录。
force:如果目标主机包含该文件,但内容不同。如果设置为yes,则强制覆盖;如果为no,则只有当目标主机的目标位置不存在该文件时才进行复制。默认为yes。
others:所有的file模块里的选项都可以在这里使用
src:被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径,如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用”/” 来结尾,则只复制目录里的内容,如果没有使用”/” 来结尾,则包含目录在内的整个内容全部复制,类似于rsync。
server:
[root@centos7 app]# ansible web -m copy -a "src=test dest=/app"
[root@centos7 app]# ansible web -m copy -a "content=cidchewudhwiedwetest dest=/app/test backup=yes"
node1:
[root@node1 app]# ll
total 656
-rw-r--r-- 1 root root 20 Dec 5 20:39 test
-rw-r--r-- 1 root root 13 Dec 5 20:36 test.4939.2017-12-05@20:40:02~
在远程主机上,会将源文件备份,并在文件名后面加上随机数和时间作为标注
5、file 设置文件属性
创建目录: -a “path= state=directory ”
创建链接文件: -a “path= src= state=link”
删除文件:-a “path= state=absent”
一些属性:
force:
需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,有两种选项:yes|no
group:
定义文件/目录的属性 mode:定义文件/目录的权限
owner:
定义文件/目录的属主 path:必选项,定义文件/目录的路径
recurse:
递归设置文件的属性,只对目录有效 src:被链接的源文件路径,只应用于state=link的情况
dest:被链接到的路径,只应用于state=link的情况
state:
directory:如果目录不存在,就创建目录
file:即使文件不存在,也不会被创建
link:创建软链接
hard:创建硬链接
touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
absent:删除目录、文件或者取消链接文件。
server:
[root@centos7 app]# ansible web -m file -a "path=/app/test3 state=directory"
[root@centos7 app]# ansible web -m file -a "path=/app/test3 src=/app/d1 state=link"
node:
[root@node1 app]# ll
total 656
drwxr-xr-x 2 root root 6 Dec 5 20:47 d1
lrwxrwxrwx 1 root root 7 Dec 5 20:48 test3 -> /app/d1
-rw-r--r-- 1 root root 13 Dec 5 20:36 test.4939.2017-12-05@20:40:02~
6、fetch 从远程某主机获取文件到本地
dest:用来存放文件的目录,例如存放目录为backup,源文件名称为/etc/profile ;那么在主机中,保存为/backup/master/etc/profile
src:在远程拉取的文件,并且必须是一个file,不能是目录。
[root@centos7 app]# ansible web -m fetch -a "src=/app/fstab dest=/app"
[root@centos7 app]# tree
.
├── 192.168.64.129
│ └── app
│ └── fstab
├── 192.168.64.130
│ └── app
│ └── fstab
└── test
7、cron 管理crontab计划任务
action:cron backup= #如果设置,则创建一个crontab备份[yes|no]
cron_file= #如果指定,使用这个文件cron.d,而不是单个用户
day= #日应该运行的工作( 1-31, , /2, )
hour= #小时 ( 0-23, , /2, )
minute= #分钟( 0-59, , /2, )
month= #月( 1-12, *, /2, )
weekday= #周 ( 0-6 for Sunday-Saturday,, )
job= #指明运行的命令是什么
name= #定时任务描述
reboot #任务在重启时运行,不建议使用,建议使用special_time
special_time #特殊的时间范围,参数:reboot(重启时),annually(每年),monthly(每月),weekly(每周),daily(每天),hourly(每小时)
state #指定状态,present表示添加定时任务,也是默认设置, absent表示删除定时任务
user #以哪个用户的身份执行
server:
[root@centos7 ansible]# ansible web -m cron -a 'name="sync time from ntpserver" minute="*/10" job="/sbin/ntpdate 172.17.0.1 &> /dev/null" '
node:
[root@node1 app]# crontab -l
#Ansible: sync time from ntpserver
*/10 * * * * /sbin/ntpdate 172.17.0.1 &> /dev/null
8、yum 安装软件
conf_file
#设定远程yum安装时所依赖的配置文件。如配置文件没有在默认的位置。
disable_gpg_check
#是否禁止 gpg checking ,只用于’ present ’ or ’ latest ’
disablerepo
#临时禁止使用yum库。只用于安装或更新时
enablerepo
#临时使用的yum库。只用于安装或更新时
name=
#所安装包的名称
state=
# present 安装,latest 安装最新版本 ,absent 卸载软件
update_cache
#强制更新yum的缓存
server:
[root@centos7 ansible]# ansible web -m yum -a "name=tree state=latest"
node:
[root@node1 app]# which tree
/usr/bin/tree
9、service 服务程序管理
arguments #命令行提供额外的参数
enabled #设置开机启动
name= #服务名称
runlevel #开机启动的级别,一般不用指定
sleep #在重启服务的过程中,是否等待。如在服务关闭以后等待2秒再启动
state # started启动服务, stopped停止服务,restarted重启,reloaded重载配置文件
10、user 用户模块,管理用户账号
comment #用户的描述信息
createhome #是否创建家目录
force #在使用state=absent时,行为与userdel-force一致
group #指定基本组
groups #指定附加组,如果指定为(groups=)表示删除所有组
home #指定用户家目录
move_home #如果设置为home=时,试图将用户主目录移动到指定的目录
name #指定用户名
non_unique #该选项允许改变非唯一的用户ID值
password #指定用户密码
remove #在使用state=absent时,行为是与userdel-remove 一致
shell #指定默认shell
state #设置账号状态,不指定为创建,指定值为absent表示删除
system #当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户。
uid #指定用户的uid
update_password #always' will update passwords if they differ.
on_create’ will only
set the password for
newly created users.
server:
[root@centos7 ansible]# ansible web -m user -a 'name=tom comment="tom is tom" uid=1066 group=tom groups=wheel'
node:
[root@node1 app]# getent passwd tom
tom:x:1066:1000:tom is tom:/home/tom:/bin/bash
11、group 用户组模块,添加或删除组
gid #设置组的GID号
name= #管理组的名称
state #指定组状态,默认为创建,设置值为absent为删除
system #设置值为yes,表示创建系统组
12、script 在指定节点运行服务端的脚本
将服务器端上的脚本放在节点机器上运行
[root@centos7 app]# vim wan.sh
#!/bin/bash
date > /app/date.log
[root@centos7 app]# ansible web -m script -a "./wan.sh"
node:
[root@node1 app]# ll
total 8
-rw-r--r-- 1 root root 29 Dec 6 01:49 date.log
13、setup 模块
facts组件是ansible用于采集被管理及其设备信息的一个功能,我们可以使用setup模块查看机器的所有facts信息,可以使用filter来查看指定信息。整个facts信息被包装在一个JSON格式的数据结构中,ansible_facts是最上层的值。
facts就是变量,内建变量。每个主机的各种信息,CPU颗数,内存大小等。会存在facts中的某个变量中。调用后返回很多对应主机的信息,在后面的操作中可以根据不同的信息来做不同的操作。如reahat系列用yum安装,而debian系列用apt来安装软件。
setup模块主要用于收集一些硬件信息,在playbooks里经常会用到的一个参数gather_facts就与该模块相关。setup模块下经常使用的一个参数就是filter参数。
ansible的基本模块以及任务模式之一的ad-hoc的常见方法基本就是这些了,它的另一种任务模式playbook就找下次再说吧~~~