哈喽各位小伙伴们大家好!今天我们来聊一聊 Ansible
有些小伙伴可能会疑惑——什么是 Ansible ?它是用来干什么的?
我举个例子:我们在运维的过程中,往往会遇到大批量服务器同时报错的情况,而且这种情况往往都是一样的错误,如果是一两台或者几台服务器,我们可以远程登录到这些设备并一个一个去处理。
但如果是几十台呢?如果我们还像传统方法那样一台一台去处理,则会大大降低了我们的运维效率。
我们需要一个解决方案,一个工具来帮我们解决这些重复性高,枯燥的运维操作。这时候,ansible 出现了。
其实早在 ansible 出现之前,还是有其他的解决方案的。但是我个人认为 ansible 在我心中占很大的分量
初识ansible
如果让我用一句话来介绍 ansible,我觉得这句话再合适不过了
无主无从无架构,开箱即用,用完即走
ansible 是新出现的自动化运维工具,它基于 Python 开发,集合了众多运维工具(puppet、cfengine、chef、func、 fabric)的优点实现了批量系统配置、批量程序部署、批量运行命令等功能。
除此之外,ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。
还有,ansible 是基于ssh协议来实现远程管理(这个可是面试官爱问的问题哦),它不需要在被执行主机上安装代理。
接下来,我们来看一下 ansible 核心组件
-
Ansible:核心组件
-
Modules:包括Ansible自带的核心模块及自定义模块
-
Plugins:完成模块功能的补充,包括连接插件、邮箱插件
-
Playbooks:剧本;定义Ansible多任务配置文件,完成对主机批量部署操作
-
Inventory:定义Ansible管理主机的清单 /etc/ansibe/hosts
-
- 主机清单里面包含了被执行的主机
- 仅对主机清单内的主机列表进行操作,可以实现主机分组
-
Connection Plugins:负责和被监控端实现通信
安装和配置文件
在初步了解什么是 ansible 之后,我们先将它下载安装并配置到我们的机器上
首先安装我们的epel扩展源
yum -y install epel-release
之后安装 ansible
yum -y install ansible
安装完成之后我们检验一下是否安装成功
#检测版本ansible --version
接下来我们看一下 ansible 的一些常见配置文件
配置文件
ansible 的主配置文件包含了一些常用的、基本的配置
[defaults]
# some basic default values...
inventory = /etc/ansible/hosts #主机列表配置文件
library = /usr/share/my_modules/ #库文件存放位置
module_utils = /usr/share/my_module_utils/ #Ansible默认搜寻模块的位置
remote_tmp = ~/.ansible/tmp #生成的临时py命令文件存放在远程主机的目录
local_tmp = ~/.ansible/tmp #本机的临时命令执行目录
forks = 5 #默认的并发数
poll_interval = 15 #默认的线程池
sudo_user = root #默认sudo用户
ask_sudo_pass = True #在执行sudo之前是否询问sudo密码.默认为False
ask_pass = True #每次执行ansible命令是否询问ssh密码,默认为False
transport = smart #通信机制.默认 值为’smart’。如果本地系统支持 ControlPersist技术的话,将会使用(基于OpenSSH)‘ssh’,如果不支持讲使用‘paramiko’.其他传输选项包括‘local’, ‘chroot’,’jail’等等
remote_port = 22 #远程连接的端口号
host_ key_checking = False #检查对应服务器的host_ key ,建议取消注释。这样的话控制其他主机相连的时候就不用先ssh连一次
log_path=/var/log/ansible.log #日志文件,建议开启
主机清单
什么是主机清单?顾名思义,就是一个包含了主机的清单文件,你要操控的目标主机都在这个主机清单里面
在主机清单里面,我们直接指明主机地址或者主机名,如果是主机名的话,你得先做好dns解析配置
除此之外,我们还可以编写主机组,我们想要操控这个主机组里面的所有主机的话,直接指定主机名即可
主机清单的文件路径
/etc/ansible/hosts
接下来我们试着编写一下编写主机列表
vi /etc/ansible/hosts
#主机ip地址
10.11.11.100
10.11.11.101
#主机名
www.salted1.com
www.salted2.com
我们还可以以主机组的形式来进行编写
vi /etc/ansible/hosts
[server1]
www.salted1.com
www.salted2.com
[server2]
www.edison1.com
www.edison2.com
命令系列
介绍完 ansible 的安装和基础的配置文件之后,我们来简单看一下 ansible 的一些命令
我们在面对不懂的命令时候,可以查看官方的文档帮助,而以下这个命令就能帮助我们理解关于 ansible 模块的一些帮助
ansible ‐doc #显示模块帮助
-a #显示所有模块的文档,不建议使用
-l , --list #列出可用模块
-s #显示指定模块的playbook片段
如果我们想要显示出 ansible 的版本信息,可以使用
ansible --version
我们在使用 ansible 去操控目标主机时,往往会使用到一些模块,而这个命令可以帮助我们指定相关的模块
ansible -m 模块名字
如果希望命令只是检测一下,并不是真正执行,这样就可以在执行前检查到有没有出错,我们可以用下面这个参数
ansible -C
我们在上面列出了一些常用的 ansible 的命令,那么你知道 ansible 命令执行的大概过程吗?
1.加载自己的配置文件 默认是/etc/ansible/ansible.cfg
2.加载自己对应的模块文件,如command
3.通过ansible将模块或命令生成对应的临时py文件
4.并将该文件传输至远程服务器的对应执行用户的家目录的 ~/.ansible/tmp/XXX/XXX.PY文件。
5.给文件+x执行 执行并返回结果 删除临时py文件,sleep 0 退出
当命令执行后,我们可以通过观察结果的字体颜色来判断执行是否成功
一般分为三种颜色:
- 绿色:执行成功并且对目标主机没做改变
- 黄色:执行成功并且对目标主机做了改变
- 红色:执行失败
常用模块
接下来我们来着重介绍一下 ansible 的灵魂——模块
正是这些模块,才让 ansible 发挥出了它强大的功能
ping
ping 模块,这个很好理解,跟我们常用的 ping 命令是一样的,用来检测与目标主机的连通性
ansible 192.168.244.135 -m ping
192.168.244.135 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
如果能够 ping 通,那么结果字体是显示绿色,反之黄色
command
这个是默认模块,我们敲命令的时候可以省略,在后面写上我们要执行的命令
例如我想查看一下目标主机 data 目录下的详细信息
ansible 192.168.244.135 -m command -a "ls -l /data"
#(这里不能用别名 ll )
又或者我想在目标主机上添加用户 xianyu
ansible 192.168.244.135 -a "useradd xianyu"
shell
我们在上面介绍了 command 模块,其实 shell 模块跟 command 模块没什么大区别,主要区别还是在于 shell 模块中支持命令带有 $、< >、|、;、&等特殊符号
例如说我想给 xianyu 这个用户添加密码,用到的命令里面带有 “|”(管道符),这时候我们就可以使用 shell 模块
ansible 192.168.244.135 -m shell -a "echo 123456 | passwd --stdin xianyu
copy
如果我们想要将 ansible 机器上的文件发送给远程目标主机,可以使用 copy 模块
例如,我想要将 dns 解析文件发送到远程目标主机
ansible all -m copy -a 'src=/etc/hosts dest=/etc/hosts'
# all 代表主机列表里面所有主机
又或者我可以在命令行中写上内容然后直接生成目标文件
ansible all -m copy -a 'content="test content"
dest=/data/test1.txt '
除此之外,copy 模块还有一些选项供我们使用
owner = #用户
mode = #权限
backup = yes/no #如果目标文件存在,默认覆盖然后备份
fetch
既然有 copy 模块将 ansible 机器上的文件发送(复制)到远程目标主机上,那么也可以将远程目标主机上的文件抓取(下载)到 ansible 机器上
例如:我们将远程目标主机上的 test.sh 脚本获取并下载到本地 ansible 主机上的 data 目录下
ansible all -m fetch -a "src=/test1.sh dest=/data/scripts"
如果我们想一次性获取多个文件,我们可以先将用 shell 模块将这些文件打包到一起,再用 fetch 模块将其下载下来
# 打包多个文件
ansible all -m shell -a "tar jcf log.tar.xz /var/log/*.log"
#获取文件
ansible all -m fetch -a "src=/root/log.tar.xz dest=/data"
file
在 linux “一切皆文件” 的理念下,file 模块就显得尤其重要,下面我们来讲讲关于 file 模块的一些使用
path:指定文件路径
mode:指定文件权限
state:文件的属性,可以是普通文件、目录、软链接文件等并且可以删除、创建文件
name:指定文件名字
例如,我们想要将远程目标主机上的某个文件的属主和权限修改,可以这样
ansible all -m file -a "path=/root/test1.sh owner=lisi mode=777"
如果我们想要创建一个软链接文件,并且指向 /data/test 文件
ansible all -m file -a "src=/data/test1 dest=/data/test1.link state=link"
# state=link 说明创建一个软链接文件
下面命令是对文件的删除和创建操作
#创建文件
ansible all -m file -a "name=/data/test2 state=touch"
#删除文件
ansible all -m file -a "name=/data/test2 state=absent"
对目录进行删除和创建操作
#创建目录
ansible all -m file -a "name=/data/dir1 state=directory"
#删除目录
ansible all -m file -a "name=/data/dir1 state=absent"
yum
包管理器模块
相关参数
例如我们想要下载 httpd服务,并且在安装前执行更新操作
ansible 192.168.244.101 -m yum -a "name=httpd update_cache=yes"
移除 httpd
ansible 192.168.244.101 -m yum -a "name=httpd state=absent"
service
用于服务管理
相关参数
例如我们想开启 httpd 服务
ansible all -m service -a "name=httpd state=started "
关闭 httpd 服务
ansible all -m service -a "name=httpd state=stopped"
在开启服务的同时设置开机自启动
ansible all -m service -a "name=httpd state=started enabled=yes"
user 和 group
这两个模块分别用于用户管理和组管理
#创建用户
ansible 192.168.244.101 -m user -a "name=nginx shell=/sbin/nologin system=yes home=/var/nginx groups=root,bin uid=80
comment='nginx server'"
system:是否为系统用户
shell:指定shell
home:指定家目录
group:主组
groups:指定附家组
comment:注释
#删除用户
ansible 192.168.244.101 -m user "-a remove=yes"
remove:删除用户的时候删除家目录数据
#创建组
ansible 192.168.244.101 -m group -a "name=testgroup system=yes"
name:组名
system:是否为系统组
#删除组
ansible 192.168.244.101 -m group -a "state=absent"
总结
今天我们介绍了 ansible 的一些概念、基础命令和基础模块等,在下篇文章中,我们将会介绍 ansible 中的 playbooks(剧本)和 roles(角色)
这两个组件才是将 ansible 的自动运维功能推向神坛必不可少的东西之一