首页 > 数据库 > 数据库开发技术 > 干货篇 | 一文带你了解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密码.默认为Falseask_pass = True #每次执行ansible命令是否询问ssh密码,默认为Falsetransport = 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.10010.11.11.101#主机名www.salted1.comwww.salted2.com
我们还可以以主机组的形式来进行编写
vi /etc/ansible/hosts[server1]www.salted1.comwww.salted2.com[server2]
介绍完 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 ping192.168.244.135 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"},"changed": false,"ping": "pong"}
如果能够 ping 通,那么结果字体是显示绿色,反之黄色
command
ansible 192.168.244.135 -m command -a "ls -l /data"#(这里不能用别名 ll )
ansible 192.168.244.135 -a "useradd xianyu"ansible 192.168.244.135 -m shell -a "echo 123456 | passwd --stdin xianyu
ansible all -m copy -a 'src=/etc/hosts dest=/etc/hosts'# all 代表主机列表里面所有主机
ansible all -m copy -a 'content="test content"dest=/data/test1.txt '
owner = #用户mode = #权限backup = yes/no #如果目标文件存在,默认覆盖然后备份
ansible all -m fetch -a "src=/test1.sh dest=/data/scripts"# 打包多个文件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"
path:指定文件路径mode:指定文件权限state:文件的属性,可以是普通文件、目录、软链接文件等并且可以删除、创建文件name:指定文件名字
ansible all -m file -a "path=/root/test1.sh owner=lisi mode=777"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"

例如我们想要下载 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"
ansible all -m service -a "name=httpd state=started "ansible all -m service -a "name=httpd state=stopped"ansible all -m service -a "name=httpd state=started enabled=yes"#创建用户ansible 192.168.244.101 -m user -a "name=nginx shell=/sbin/nologin system=yes home=/var/nginx groups=root,bin uid=80comment='nginx server'"system:是否为系统用户shell:指定shellhome:指定家目录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"

原文作者:咸鱼运维杂谈;如有侵权,请联系管理员删除。