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

哈喽各位小伙伴们大家好!今天我们来聊一聊 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 的自动运维功能推向神坛必不可少的东西之一

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咸鱼Linux运维

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值