ITPub博客

首页 > 数据库 > 数据库开发技术 > 干货篇 | 一文带你了解Ansible(上)

干货篇 | 一文带你了解Ansible(上)

原创 数据库开发技术 作者:咸鱼运维杂谈 时间:2021-07-31 19:27:00 0 删除 编辑
点击上方"蓝字"
关注我们吧!


哈喽各位小伙伴们大家好!


今天我们来聊一聊 Ansible 


有些小伙伴可能会疑惑——什么是 Ansible ?它是用来干什么的?


我举个例子:我们在运维的过程中,往往会遇到大批量服务器同时报错的情况,而且这种情况往往都是一样的错误,如果是一两台或者几台服务器,我们可以远程登录到这些设备并一个一个去处理。


但如果是几十台呢?如果我们还像传统方法那样一台一台去处理,则会大大降低了我们的运维效率。


我们需要一个解决方案,一个工具来帮我们解决这些重复性高,枯燥的运维操作。这时候,ansible 出现了。


其实早在 ansible 出现之前,还是有其他的解决方案的。但是我个人认为 ansible 在我心中占很大的分量



01
初识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:负责和被监控端实现通信



02
安装和配置文件


在初步了解什么是 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]


03
命令系列


介绍完 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 退出


当命令执行后,我们可以通过观察结果的字体颜色来判断执行是否成功


一般分为三种颜色:


  • 绿色:执行成功并且对目标主机没做改变
  • 黄色:执行成功并且对目标主机做了改变
  • 红色:执行失败

03
常用模块

接下来我们来着重介绍一下 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=80comment='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"

04
总结



今天我们介绍了 ansible 的一些概念、基础命令和基础模块等,在下篇文章中,我们将会介绍 ansible 中的 playbooks(剧本)和 roles(角色)

这两个组件才是将 ansible 的自动运维功能推向神坛必不可少的东西之一


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

下一篇: 好久不见
请登录后发表评论 登录
全部评论
最新的技术文章首先发布在微信公众号:咸鱼运维杂谈 擅长Linux系统维护、开源软件维护、自动化运维等领域,博客主要偏向于学习笔记及经历分享

注册时间:2021-05-29

  • 博文量
    193
  • 访问量
    84225