目录
一:自动化运维简介
1.1 Puppet工具特点
1.2 Saltstack工具特点
二:ansible概述
2.1 Ansible 运维工具原理
2.2 ansible 架构图
2.3 Ansible的作用目标
2.4 为什么选择Ansible?
2.5 ansible 任务执行
ansible 任务执行模式
ansible 执行流程:
ansible 命令执行过程
三:Ansible的安装
3.1 ansible 安装方式
3.2 Ansible的相关文件
3.3 Ansible的相关命令
3.4 安装ansible
3.4.1安装准备
3.4.2Ansible控制端安装epel扩展源并安装ansible自动化管理工具
3.4.3配置主机清单
3.4.4生成密钥对
3.4.5使用ssh-agent代理
四:ansible命令模块
4.1 command模块
4.2 cron模块
4.3 user模块
4.4 group模块
4.5 copy模块
4.6 file模块
4.7 ping模块
4.8 service模块
4.9 shell模块
4.10 script模块
4.11 yum模块
4.12 setup模块
4.12.1 查看信息
4.12.2 保存信息
4.13 fetch 模块
五: 总结
一:自动化运维简介
目前,随着IT行业的高速发展,市场上出现了一大批自动化管理工具,这些工具可以使得我们通过一台设备管理控制成千上万台不同的设备,使得我们更方便、更快捷的进行运维管理。
目前主流的自动化运维工具有PSSH、Puppet、Chef、SaltStack、Ansible等等,互联网企业使用最多的是Ansible、Saltstack和Puppet。下面,我主要介绍一下Puppet和Saltstack工具的特点:
1.1 Puppet工具特点
Puppet是早期的Linux自动化运维管理工具,可以集中管理Linux、Windows和Unix等平台。Puppet发展至今已经非常成熟,可以批量管理远程服务器,模块丰富,配置复杂,基于Ruby语言编写,是典型的C/S模式,需要安装服务端与客户端。Puppet的管理设备是服务端、被管理设备是客户端,每个客户端周期(周期默认是30分钟)性的向服务端发送请求,获取最新的配置信息,保证配置同步。Puppet适用于服务器管理的整个过程,比如初始化安装、配置、更新以及系统下线。
1.2 Saltstack工具特点
Saltstack与Puppet类似,也是基于C/S模式的自动化管理控制工具。Slatstack基于Python语言编写,并且加入了MQ消息队列和ELK消息同步,可以使执行命令和执行结果高效返回,但其执行过程需要等待客户端全部返回,如果客户端未及时返回或未响应的话,可能导致部分设备没有执行结果。
二:ansible概述
- ansible是新出的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
- ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。
- ansible目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。是每位运维工程师必须掌握的技能之一。
2.1 Ansible 运维工具原理
Ansible分为控制端和被控端,主要是基于SSH协议去管理客户端,被控端是无需安装Agent插件的,Ansible会读取控制端hosts文件,根据文件中定义IP列表信息,调取本地的各个模块对被控端机器实现批量、并发的配置管理和维护,如果任务比较复杂可以写成PlayBook剧本进行分发管理;
Ansible 自动运维管理工具优点:
- 轻量级,更新时,只需要在操作机上进行一次更新即可;
- 采用 SSH 协议;
- 不需要去客户端安装 agent;
- 批量任务执行可以写成脚本,而且不用分发到远程就可以执行;
- 使用 python 编写的,维护更简单;
- 支持 sudo 普通用户命令;
- 去中心化管理。
2.2 ansible 架构图
上图中我们看到的主要模块如下:
Ansible:Ansible核心程序。
Host Inventory:记录由Ansible管理的主机信息,包括端口、密码、ip等。
Play books:“剧本”YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能。
Core Modules:核心模块,主要操作是通过调用核心模块来完成管理任务。
Custom Modules:自定义模块,完成核心模块无法完成的功能,支持多种语言。
Connection Plugins:连接插件,Ansible和Host通信使用
2.3 Ansible的作用目标
- 自动化部署APP
- 自动化管理配置项
- 自动化的持续交付
- 自动化的云服务管理
2.4 为什么选择Ansible?
(1) Ansible完全基于Python开发,而 DevOps(促进开发、技术运营和质量保障(QA)部门之间的沟通、协作与整合)在国内已然是一种趋势,Python被逐渐普及,运维人员自己开发工具的门槛逐渐降低,因此,方便对Ansible的二次开发
(2) Ansible丰富的内置模块,甚至还有专门为商业平台开发的功能模块,完全可以满足日常功能所需
(3) 在Ansible去中心化概念(任何人都是一个节点,任何人也都能够成为一个中心)下,复制操作即可完成管理配置中心的迁移
(4) Agentless(无客户端),客户端无需任何配置,由管理端配置好后即可使用
2.5 ansible 任务执行
ansible 任务执行模式
Ansible 系统由控制主机对被管节点的操作方式可分为两类,即adhoc
和playbook
:
- ad-hoc模式(点对点模式):使用单个模块,支持批量执行单条命令。ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell。
- playbook模式(剧本模式):是Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件。
ansible 执行流程:
简单理解就是Ansible在运行时, 首先读取
中的配置, 根据规则获取
Inventory
中的管理主机列表, 并行的在这些主机中执行配置的任务, 最后等待执行返回的结果。
ansible 命令执行过程
- 加载自己的配置文件,默认/etc/ansible/;
- 查找对应的主机配置文件,找到要执行的主机或者组;
- 加载自己对应的模块文件,如 command;
- 通过ansible将模块或命令生成对应的临时py文件(python脚本), 并将该文件传输至远程服务器;
- 对应执行用户的家目录的.ansible/tmp/XXX/文件;
- 给文件 +x 执行权限;
- 执行并返回结果;
- 删除临时py文件,sleep 0退出;
三:Ansible的安装
3.1 ansible 安装方式
ansible安装常用两种方式:yum安装和pip程序安装
使用 pip(python的包管理模块)安装
首先,我们需要安装一个python-pip
包,安装完成以后,则直接使用pip
命令来安装我们的包,具体操作过程如下:
-
yum install python-pip
-
pip install ansible
使用 yum 安装
yum 安装是我们很熟悉的安装方式了。我们需要先安装一个epel-release
包,然后再安装我们的 ansible 即可。
-
yum install epel-release -y
-
yum install ansible –y
3.2 Ansible的相关文件
配置文件:
- /etc/ansible/ 主配置文件,配置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界面与用户交互的执行工具
3.3 Ansible的相关命令
3.4 安装ansible
3.4.1安装准备
-
#192.168.111.60
-
hostname ansible
-
su
-
#192.168.111.50
-
hostname webserver
-
su
-
#192.168.111.15
-
hostname mysql
-
su
-
systemctl stop firewalld
-
setenforce 0
3.4.2Ansible控制端安装epel扩展源并安装ansible自动化管理工具
-
#安装epel扩展源
-
yum -y install epel-release
-
yum -y install ansible
-
#树型查询工具
-
yum -y install tree
-
-
tree /etc/ansible
3.4.3配置主机清单
-
vim /etc/ansible/hosts
-
-
#配置主机清单
-
[webserver]
-
192.168.111.60
-
[mysql]
-
192.168.111.15
3.4.4生成密钥对
-
#生成密钥对
-
ssh-keygen -t rsa
-
123123
-
123123
-
-
ssh-copy-id root@192.168.111.60
-
ssh-copy-id root@192.168.111.15
3.4.5使用ssh-agent代理
-
#每次查询都需要输入密钥
-
#可以使用ssh-agent代理
-
ssh-agent bash
-
ssh-add
-
123123
-
-
查询webserver组中主机的日期
-
ansible webserver -m command -a 'date'
-
-
查询mysql组中主机的日期
-
ansible mysql -m command -a 'date'
四:ansible命令模块
4.1 command模块
这个模块可以直接在远程主机上执行命令,并将结果返回本主机。
命令模块接受命令名称,后面是空格分隔的列表参数。给定的命令将在所有选定的节点上执行。它不会通过shell进行处理,比如$HOME和操作如"<",">","|",";","&" 工作(需要使用(shell)模块实现这些功能)。注意,该命令不支持 | 管道命令。
下面来看一看该模块下常用的几个命令:
chdir # 在执行命令之前,先切换到该目录
executable # 切换shell来执行命令,需要使用命令的绝对路径
free_form # 要执行的Linux指令,一般使用Ansible的-a参数代替。
creates # 一个文件名,当这个文件存在,则该命令不执行,可以
用来做判断
removes # 一个文件名,这个文件不存在,则该命令不执行
-
命令格式:ansible [主机] [-m 模块] [-a args]
-
-
#列出所有已安装的模块,按q退出
-
ansible-doc -l
-
-
#所有主机执行data命令,其中all可以换成IP或者分类名称,例:192.168.111.60 / webserver
-
ansible all -m command -a 'date'
-
-
#不加-m模块,则默认使用command模块
-
ansible all -a 'date'
-
ansible all -a 'ls /'
4.2 cron模块
该模块适用于管理cron
计划任务的。
两种状态(state):present表示添加(可以省略),absent表示移除
其使用的语法跟我们的crontab
文件中的语法一致,同时,可以指定以下选项:
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 # 以哪个用户的身份执行
-
两种状态(state):present表示添加(可以省略),absent表示移除
-
-
#查看cron模块信息
-
ansible-doc -s cron
-
-
#webserver:分类 -m指定模块 -a输出模块内的指令 分钟:每分钟,工作:输出hello,工作名称:test
-
ansible webserver -m cron -a 'minute="*/1" job="/usr/bin/echo hello" name="test"'
-
-
#查看计划性任务命令
-
ansible webserver -a 'crontab -l'
-
-
#移除计划性任务
-
ansible webserver -m cron -a 'name="test" state=absent'
4.3 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
user模块是请求三条指令,useradd,userdel,usermod
-
#模块信息
-
ansible-doc -s user
-
-
#创建用户
-
ansible all -m user -a 'name=zhangsan'
-
-
#查看用户账户信息
-
ansible all -m 'command' -a 'tail -1 /etc/passwd'
-
-
#移除指令
-
ansible all -m user -a 'name="zhangsan" state=absent'
4.4 group模块
该模块主要用于添加或删除组。
gid=
#设置组的GID号name=
#指定组的名称state=
#指定组的状态,默认为创建,设置值为absent
为删除system=
#设置值为yes
,表示创建为系统组
group模块请求的是groupadd、groupdel、groupmod模块
-
#查看模块信息
-
ansible-doc -s group
-
-
#system=yes 创建系统组
-
ansible mysql -m group -a 'name=lisi gid=1111 system=yes'
-
-
#查看组账户信息
-
ansible mysql -a 'tail -1 /etc/group'
-
-
#创建用户并加入组
-
ansible mysql -m user -a 'name=zhangsan uid=1234 group=lisi system=yes'
-
-
#查看用户test02的用户id和组id信息
-
ansible mysql -a 'id zhangsan'
-
-
#删除组
-
ansible mysql -m group -a 'name=lisi state=absent'
4.5 copy模块
这个模块用于将文件复制到远程主机,同时支持给定内容生成文件和修改权限等。
src#被复制到远程主机的本地文件。可以是绝对路径,也可以是相对路径。如果路径是一个目录,则会递归复制,用法类似于"rsync"
content #用于替换"src",可以直接指定文件的值
dest#必选项,将源文件复制到的远程主机的绝对路径
backup #当文件内容发生改变后,在覆盖之前把源文件备份,备份文件包含时间信息
directory_mode#递归设定目录的权限,默认为系统默认权限
force#当目标主机包含该文件,但内容不同时,设为"yes",表示强制覆盖;设为"no",表示目标主机的目标位置不存在该文件才复制。默认为"yes"
others#所有的 file 模块中的选项可以在这里使用
-
ansible-doc -s copy
-
-
ansible mysql -m copy -a 'src=/etc/fstab dest=/opt/'
-
-
ansible mysql -a 'ls /opt'
-
ansible mysql -a 'cat /opt/'
-
-
ansible mysql -m copy -a 'content="hello lic" dest=/opt/'
-
ansible mysql -a 'cat /opt/'
4.6 file模块
该模块主要用于设置文件的属性,比如创建文件、创建链接文件、删除文件等。
force#需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
group#定义文件/目录的属组。后面可以加上mode:定义文件/目录的权限
owner#定义文件/目录的属主。后面必须跟上path:定义文件/目录的路径
recurse#递归设置文件的属性,只对目录有效,后面跟上src:被链接的源文件路径,只应用于state=link的情况
dest#被链接到的路径,只应用于state=link的情况
state #状态,有以下选项:
- directory:如果目录不存在,就创建目录
- file:即使文件不存在,也不会被创建
- link:创建软链接
- hard:创建硬链接
- touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
- absent:删除目录、文件或者取消链接文件
-
ansible-doc -s file
-
-
ansible mysql -m user -a 'name=mysql system=yes'
-
-
ansible mysql -m file -a 'owner=mysql group=mysql mode=600 path=/opt/'
-
ansible mysql -a 'ls -l /opt/'
-
-
#创建
-
#ansible mysql -m file -a 'path=/opt/ state=touch'
-
-
ansible mysql -m file -a 'src=/opt/ path=/opt/ state=link'
-
ansible mysql -a 'ls -l /opt'
-
-
#移除文件/opt/test.txt
-
ansible mysql -m file -a 'path=/opt/ state=absent'
4.7 ping模块
主机连通性测试
我们使用ansible web -m ping
命令来进行主机连通性测试
ansible all -m ping
4.8 service模块
该模块用于服务程序的管理。
主要选项:
arguments #命令行提供额外的参数
enabled #设置开机启动。
name= #服务名称
runlevel #开机启动的级别,一般不用指定。
sleep #在重启服务的过程中,是否等待。如在服务关闭以后等待2秒再启动。(定义在剧本中。)
state #有四种状态,分别为:started--->启动服务, stopped--->停止服务, restarted--->重启服务, reloaded--->重载配置
-
ansible-doc -s service
-
-
#192.168.111.60 执行
-
yum -y install httpd
-
ansible webserver -a 'systemctl status httpd'
-
-
ansible webserver -m service -a 'enabled=true name=httpd state=started'
-
systemctl status httpd
-
systemctl is-enabled httpd
4.9 shell模块
-
ansible-doc -s shell
-
-
ansible mysql -m user -a 'name=zhangsan'
-
ansible mysql -m shell -a 'echo 123123 | passwd --stdin zhangsan'
4.10 script模块
该模块用于将本机的脚本在被管理端的机器上运行。
该模块直接指定脚本的路径即可,我们通过例子来看一看到底如何使用的:
首先,我们写一个脚本,并给其加上执行权限:
-
ansible-doc -s script
-
-
vim test.sh
-
#!/bin/bash
-
echo 'hello ansible from script' > /opt/
-
-
chmod +x test.sh
-
ansible all -m script -a ''
4.11 yum模块
该模块主要用于软件的安装
-
name=#所安装的包的名称
-
state=#present--->安装, latest--->安装最新的, absent---> 卸载软件。
-
update_cache#强制更新yum的缓存
-
conf_file#指定远程yum安装时所依赖的配置文件(安装本地已有的包)。
-
disable_pgp_check#是否禁止GPG checking,只用于presentor latest。
-
disablerepo#临时禁止使用yum库。 只用于安装或更新时。
-
enablerepo#临时使用的yum库。只用于安装或更新时。
-
ansible-doc -s yum
-
-
ansible mysql -m yum -a 'name=httpd'
-
ansible mysql -a 'rpm -q httpd'
-
-
ansible mysql -m yum -a 'name=httpd state=absent'
-
ansible mysql -a 'rpm -q httpd'
4.12 setup模块
该模块主要用于收集信息,是通过调用facts组件来实现的
facts组件是Ansible用于采集被管机器设备信息的一个功能,我们可以使用setup模块查机器的所有facts信息,可以使用filter来查看指定信息。整个facts信息被包装在一个JSON格式的数据结构中,ansible_facts是最上层的值。
facts就是变量,内建变量 。每个主机的各种信息,cpu颗数、内存大小等。会存在facts中的某个变量中。调用后返回很多对应主机的信息,在后面的操作中可以根据不同的信息来做不同的操作。如redhat系列用yum安装,而debian系列用apt来安装软件。
-
ansible-doc -s setup
-
-
#获取MySQL组主机的facts信息
-
ansible mysql -m setup
Ansible facts 是远程系统的信息,主要包含IP地址,操作系统,以太网设备,mac 地址,时间/日期相关数据,硬件信息等信息。
/etc/ansible/hosts
是ansible默认主机清单
如果名称类似的主机,可以使用列表的方式标识各个主机
[webserver]
www[01:50]. ansible_ssh_user=root ansible_ssh_pass=123123
表示~的主机,ssh登陆用户为root,密码为123123
4.12.1 查看信息
-
ansible webserver -m setup -a 'filter="*mem*"'
-
#查看内存信息
我们可以通过命令查看一下内存的大小以确认一下是否一致:
可以看出信息是一致的
4.12.2 保存信息
我们的setup模块还有一个很好用的功能就是可以保存我们所筛选的信息至我们的主机上,同时,文件名为我们被管制的主机的IP,这样方便我们知道是哪台机器出的问题。
-
ansible webserver -m setup -a 'filter="*mem*"' --tree /tmp/facts
-
-
[root@ansible ~]# cd /tmp/facts/
-
[root@ansible facts]# ls
-
192.168.111.60
-
[root@ansible facts]# cat 192.168.111.60
-
{"ansible_facts": {"ansible_memfree_mb": 404, "ansible_memory_mb": {"nocache": {"free": 1167, "used": 652}, "real": {"free": 404, "total": 1819, "used": 1415}, "swap": {"cached": 0, "free": 39999, "total": 39999, "used": 0}}, "ansible_memtotal_mb": 1819, "discovered_interpreter_python": "/usr/bin/python"}, "changed": false}
4.13 fetch 模块
该模块用于从远程某主机获取(复制)文件到本地
dest
:用来存放文件的目录src
:在远程拉取的文件,并且必须是一个file,不能是目录
-
#实例
-
ansible all -m fetch -a "src=/etc/hostname dest=/mnt"
-
ansible all -m fetch -a "src=/etc/hostname dest=/mnt flat=yes"
-
加了flat=yes是表示只复制最后一个文件,
-
从受控主机拷贝到/mnt/hostname同一个文件里后一个会覆盖掉前一个的内容,
-
不加表示复制所有文件,一层一层的
-
[root@server ~]# ansible webserver -m fetch -a 'src=/data/hello dest=/data'
-
192.168.111.60 | SUCCESS => {
-
"changed": true,
-
"checksum": "22596363b3de40b06f981fb85d82312e8c0ed511",
-
"dest": "/data/192.168.111.60/data/hello",
-
"md5sum": "6f5902ac237024bdd0c176cb93063dc4",
-
"remote_checksum": "22596363b3de40b06f981fb85d82312e8c0ed511",
-
"remote_md5sum": null
-
}
我们可以在本机上查看一下文件是否复制成功。要注意,文件保存的路径是我们设置的接收目录下的被管制主机ip
目录下:
-
[root@server ~]# cd /data/
-
[root@server data]# ls
-
1 192.168.111.60 fastdfs web
-
[root@server data]# cd 192.168.111.60
-
[root@server 192.168.111.60]# ls
-
data
-
[root@server 192.168.111.60]# cd data/
-
[root@server data]# ls
-
hello
五: 总结
ansible是开源自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。
主要包括:
(1)、连接插件connection plugins:负责和被监控端实现通信;
(2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
(3)、各种模块核心模块、command模块、自定义模块;
(4)、借助于插件完成记录日志邮件等功能;
(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。