前言:
实行自动化运维的好处是为了节省时间,提高工作效率,消除重复任务,减少更少的错误风险,改善协作和工作满意度,这时从团队的一个角度出发,给企业会带来什么影响呢,那就是克服复杂性,能够更多的创新资源,加强问责制和合规性。本文就来主要介绍一下自动化运维工具ansible
一,什么是ansible?
-
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
-
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
- (1)、连接插件,connection plugins:负责和被监控端实现通信;
- (2)、主机清单,host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
- (3)、核心模块,种模块核心模块、command模块、自定义模块;
- (4)、插件,借助于插件完成记录日志邮件等功能;
- (5)、剧本,playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
- (6)核心引擎,也就是主模块ansible
二,ansible的特点
- 部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;
- 默认使用SSH协议对设备进行管理;
- 有大量常规运维操作模块,可实现日常绝大部分操作;
- 配置简单、功能强大、扩展性强;
- 支持API及自定义模块,可通过Python轻松扩展;
- 通过Playbooks来定制强大的配置、状态管理;
- 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
- 提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台。
三,ansible的架构图
下图为ansible结构与管理用户的一个过程:
工作机制过程:
上图中我们主要看到的模块如下:
-
Ansible:核心引擎,Ansible核心程序。
-
Host Inventory:主机清单,记录由Ansible管理的主机信息,包括端口、密码、ip等。一般到小环境我们只需要在host文件中写入主机的ip地址即可,但是到了中大型环境可能需要使用动态主机清单来生成我们所需要执行的目标主机(需要云环境支持动态生成ansible).
-
Playbooks:剧本,“剧本”YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能。
-
Core Modules:核心模块,主要操作是通过调用核心模块来完成管理任务。
-
CustomModules:自定义模块,完成核心模块无法完成的功能,支持多种语言。
-
ConnectionPlugins:连接插件,Ansible和Host通信使用
ansible执行任务模式:
Ansible 系统由控制主机对被管节点的操作方式可分为两类,即adhoc和playbook:
- ad-hoc模式(点对点模式)
使用单个模块,支持批量执行单条命令。ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell。 - playbook模式(剧本模式)
是Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件。
简单理解就是Ansible在运行时, 首先读取ansible.cfg中的配置, 根据规则获取Inventory中的管理主机列表, 并行的在这些主机中执行配置的任务, 最后等待执行返回的结果。
四,ansible环境
控制端 | 20.0.0.10 |
---|---|
被控制节点1 | 20.0.0.20 |
被控制节点2 | 20.0.0.30 |
五,ansible安装及生成密钥做免交互远程管理节点
ansible master主节点配置以及Node节点验证免交互是否成功:
所有关闭防火墙关闭核心防护:
[root@server1 ~]# systemctl stop firewalld
[root@server1 ~]# iptables -F
[root@server1 ~]# setenforce 0
setenforce: SELinux is disabled
修改节点名称,便于后面操作
[root@server1 ~]# hostname master /node1/node2
[root@server1 ~]# bsah
安装epel源之后安装ansible
[root@master ~]# yum -y install epel-release // 另外一种安装方式:yum install python-pip 完了之后 pip install ansible
[root@master ~]# yum -y install ansible
[root@master ~]# tree /etc/ansible/ //树状结构展示文件夹
/etc/ansible/
├── ansible.cfg //ansible配置文件
├── hosts //ansible的主仓库,用户存储需要管理的远程主机相关文件
└── roles //角色
ansible程序结构如下:
######安装目录如下(yum安装):
配置文件目录:/etc/ansible/
执行文件目录:/usr/bin/
Lib库依赖目录:/usr/lib/pythonX.X/site-packages/ansible/
Help文档目录:/usr/share/doc/ansible-X.X.X/
Man文档目录:/usr/share/man/man1/
#####ansible配置文件查找顺序
ansible与我们其他的服务在这一点上有很大不同,这里的配置文件查找是从多个地方找的,顺序如下:
1,检查环境变量ANSIBLE_CONFIG指向的路径文件(export ANSIBLE_CONFIG=/etc/ansible.cfg);
2,~/.ansible.cfg,检查当前目录下的ansible.cfg配置文件;
3,/etc/ansible.cfg检查etc目录的配置文件。
######在配置文件中,我们提到了资源清单,这个清单就是我们的主机清单,里面保存的是
一些 ansible 需要连接管理的主机列表。我们可以来看看他的定义方式:
[root@master ~]# vi /etc/ansible/hosts //配置主机清单
[webserver] // 定义主机组[组名]把地址或主机名加进去
20.0.0.20
[mysql]
20.0.0.30
#######ansible 是基于 ssh 协议实现的,所以其配置公私钥的方式与
ssh 协议的方式相同,具体操作步骤如下:
[root@master ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:01ho/bag+Ugh6gfX5EjwVW50odkzJndaYo3gXTo4XxU root@master
The key's randomart image is:
+---[RSA 2048]----+
| .+ o..Eo|
| . .* O = . |
| o .o % & = |
| o..= O X |
| ..=S o = |
| ..o.o= o . |
| .o + . |
| . .. o |
| .. . . |
+----[SHA256]-----+
[root@master ~]# ls -a
. original-ks.cfg
.. .pki
anaconda-ks.cfg .redhat
.ansible .ssh
[root@master ~]# cd .ssh/
[root@master .ssh]# ls
id_rsa id_rsa.pub
#######向主机分发私钥:
[root@master ~]# ssh-copy-id root@20.0.0.20
[root@master ~]# ssh-copy-id root@20.0.0.30
就可以实现无密码登录,操作过程也会顺畅很多。
注意,如果出现了一下报错:
-bash: ssh-copy-id: command not found
那么就证明我们需要安装一个包:
yum -y install openssh 把包安装上即可。
###### 免交互处理
[root@master .ssh]# ssh-agent bash
[root@master .ssh]# ssh-add
六,ansible常用命令模块
- 格式 : ansible [主机] -m 模块 -a 执行内容
例如:
command模块
[root@master .ssh]# ansible 20.0.0.20 -m command -a 'date' 查看时间
Enter passphrase for key '/root/.ssh/id_rsa':
20.0.0.20 | CHANGED | rc=0 >>
2021年 01月 11日 星期一 12:06:54 +09
[root@master .ssh]# ansible webserver -m command -a 'ls'
[root@master .ssh]# ansible webserver -a 'ls' //默认的模块就是command
[root@master .ssh]# ansible all -a 'date' //查看所有的节点
20.0.0.20 | CHANGED | rc=0 >>
2021年 01月 11日 星期一 12:12:30 +09
20.0.0.30 | CHANGED | rc=0 >>
2021年 01月 11日 星期一 12:12:30 +09
cron模块
两种状态(state) : present表示添加(可以省略),absent表示移除
ansible-doc -s cron1/查看cron模块信息
ansible webserver -m cron -a 'minute="*/1" job="/usr/bin/echo heihei >>/opt/info.txt" name="test_hello" '
ansible webserver -a 'crontab -I'
ansible webserver -m cron -a 'name= "test_hello" state=absent’//移除计划任务,假如该计划任务没有取名字
name=None即可
注意:移除的时候出现以下几种错误情况只有第一种是正确的,还有一种不会报错,但实际上移除失败。
user模块
user模块是请求的是useradd, userdel, usermod三个指令ansible-doc -s user
ansible mysql -m user -a 'name="test01"1/创建用户test01
ansible mysql -m command -a 'tail /etc/passwd'
ansible mysql -m user -a 'name="test01" state=absent' //删除用户test01
group模块
group模块请求的是groupadd, groupdel, groupmod三个指令。
ansible-doc -s group
ansible mysql -m group -a 'name=mysql gid=306 system=yes'
ansible mysql -a 'tail /etc/group'
ansible mysql -m user -a 'name=test01 uid=306 system=yes group=mysql'
ansible mysql -a 'tail /etc/passwd'
ansible mysql -a 'id test01'
copy模块
copy模块用于实现文件复制和批量下发文件。其中使用src来定义本地源文件路径,使用dest定义被管理主机文件路径,使用content则是通过指定信息内容来生成目标文件
nsible-doc -s copy
ansible mysql -m copy -a 'src=/etc/fstab dest=/opt/fstab.back owner=root mode=640"
ansible mysql -a 'ls -l /opt'
ansible mysql -a 'cat /opt/fstab.back'
ansible mysql -m copy -a 'content="hello heihei!" dest=/opt/fstab.back’1 //将hello heihei!写入/opt/fstab.back
ansible mysql -a 'cat /opt/fstab.back'
file模块
file模块来设置文件属性。其中使用path指定文件路径,使用src定义源文件路径,使用name或dest来替换创建文件的符号链接。
ansible-doc -s file //查看file模块信息
ansible mysql -m user -a 'name=mysql system=yes' //创建一个mysql用户
ansible mysql -m group -a 'name=mysql system=yes' //创建一个mysql的组
ansible mysql -m file -a 'owner=mysql group=mysql mode=644 path=/opt/fstab.back' //修改文件的属主属组权限等
ansible mysql-m fle -a 'path=/opt/fstab.link src=/opt/fstab.back state=link’ //设置/opt/fstablink为/opt/fstab.back的链接文件ansible mysql -m file -a "path=/opt/fstab.back state=absent" //删除一个文件
ansible mysql -m file -a "path=/opt/test state=touch" //创建一个文件
ansible webserver -m file -a 'path=/opt/temp state=directory mode=755' //创建目录
ping模块
[root@server1 ~]# ansible all -m ping
20.0.0.20 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
20.0.0.30 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
yum模块
yum模块复责在被管理主机上安装与卸载软件包,其中使用name指定要安装的软件包,使用state指定安装软件包的状态,present、latest用来表示安装,absent表示卸载。
ansible-doc -s yum
[root@server1 ~]# ansible webserver -m yum -a 'name=tree'
在相应节点上验证时候安装成功:
[root@server2 .ssh]# rpm -qa tree
tree-1.6.0-10.el7.x86_64
[root@server2 .ssh]#
####### 卸载
[root@server1 ~]# ansible webserver -m yum -a 'name=tree state=absent'
###### 查看已经成功卸载
[root@server2 .ssh]# tree
-bash: /usr/bin/tree: 没有那个文件或目录
[root@server2 .ssh]#
service模块
service模块通常与yum模块结合使用,需要在yum安装好的基础上做,主要用来控制管理服务的运行状态。其中enabled表示是否开机自启动,取值为true或false,使用name定义服务名称,使用state指定服务状态,取值分别为started、stoped、restarted.
如果节点上已经装好httpd
在ansible端查看服务开启状态
[root@server1 ~]# ansible webserver -a 'systemctl status httpd'
关闭服务
[root@server1 ~]# ansible webserver -m service -a 'enabled=true name=httpd state=stopped'
查看已关闭
重新再启动之后关闭防火墙
[root@server1 ~]# ansible webserver -m service -a 'name=firewalld state=stopped'
shell模块
shell模块可以在被管理主机上运行命令,并支持像管道符等功能的复杂命令。
解释一下几个参数:
- chdir:指定工作目录,在执行对应的命令之前,会先进入到chdir参数指定的目录中
- creates:指定一个文件,当指定的文件存在时,就不执行对应的命令。
- removes:使用此参数指定一个文件,当指定的文件不存在时,就不执行对应命令。
[root@server1 ~]# ansible webserver -m shell -a 'echo ky06 > /opt/ky06.txt' //重定向只能用在shell
20.0.0.20 | CHANGED | rc=0 >>
或者
[root@server1 ~]# ansible webserver -m shell -a 'chdir=/usr/local echo ky01 > /opt/ky06.txt'
如果使用command只能使用追加的方法
[root@server1 ~]# ansible webserver -m shell -a 'chdir=/usr/local echo ky0000 >> /opt/ky06.txt'
到节点查看:
[root@server2 opt]# cat ky06.txt
ky01
ky01
ky0000
### 可以做一个apache页面正好来验证上面server模块装的httpd服务
[root@server1 ~]# ansible webserver -m shell -a 'echo this is ky006 > /var/www/html/index.html'
20.0.0.20 | CHANGED | rc=0 >>
浏览器访问80端口查看是否成功:
script模块
主要是可以将本地脚本复制到被管理主机上进行运行,需要注意的是,使用相对路径来指定脚本。
例如:编写一个test脚本里面写入this is ky06的内容
[root@server1 ~]# vi test.sh
#!/bin/bash
echo "this is ky06" > /opt/scripts.txt
[root@server1 ~]# chmod +x test.sh
[root@server1 ~]# ansible webserver -m script -a 'test.sh'
20.0.0.20 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 20.0.0.20 closed.\r\n",
"stderr_lines": [
"Shared connection to 20.0.0.20 closed."
],
"stdout": "",
"stdout_lines": []
}
在节点上查看是否执行成功
[root@server2 ~]# cd /opt/
[root@server2 opt]# ls
ky06.txt rh scripts.txt test.txt
[root@server2 opt]# cat scripts.txt
this is ky06
[root@server2 opt]#
setup模块
setup模块收集、查看被管理主机的facts。每个被管理主机在接并运行管理命令之前,都会将自己的相关信息(操作系统、IP地址)发送给控制主机。
ansible-doc -s setup
ansible webserver -m setup
例如查看webserver组的facts信息
[root@server1 ~]# ansible webserver -m setup
20.0.0.20 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"192.168.122.1",
"20.0.0.20"
],
"ansible_all_ipv6_addresses": [
"fe80::a401:b94c:a38:56cc"
],
"ansible_apparmor": {
"status": "disabled"
},
"ansible_architecture": "x86_64",
"ansible_bios_date": "02/27/2020",
"ansible_bios_version": "6.00",
"ansible_cmdline": {
"BOOT_IMAGE": "/vmlinuz-3.10.0-693.el7.x86_64",
"LANG": "en_US.UTF-8",
"crashkernel": "auto",
"quiet": true,
"rhgb": true,
"ro": true,
"root": "UUID=7c6135c6-3c6d-42bb-b7af-608cfe4e2263"
},
省略部分内容