自动化运维ansible部署和常见的模块

简述

Ansible是近年越来越火的一款开源运维自动化工具,通过ansible可以实现运维自动化,提高运维工程师的工作效率。减少人为的失误,Ansible通过本身集成的非常丰富的模块实现各种管理任务,其本身自带的就有上千个,最重要的是容易上手,操作简单。在运维领域,几乎可以做任何事情。

ansible自从2012年发布以来,很快在全球流行,特点表现如下:

  • 基于python开发,运维工程师对其二次开发简单
  • ansible丰富的内置模块,基本满足一切要求
  • 管理模式非常简单,一条可以影响千台机器
  • 无客户端模式,底层通过ssh通信
  • 服务无须手动启动,被操控端不需要安装客户端或代理程序

具体可以参考ansible官方给的解释:

https://docs.ansible.com/ansible/latest/index.html
在这里插入图片描述

根据ansible使用过程中的不同角色。可将其分为以下三个部分。

  • 使用者
  • Ansible工具集
  • 作用对象

使用者参考下面表格

使用者 描述
CMDB CMDB存储和管理者企业IT架构中的各项配置信息,是构建ITIL项目的核心工具
PUBLIC/PRIVATE ansible除了提供内置模块外,还有丰富的API接口语言,如PHP,Python,Perl等,基于PUBLIC/PRIVATE,ansible以API调用的方式运行
Ad-Hoc命令集 users直接通过Ad-Hoc命令集调用ansible来完成任务
playbooks users预先编好playbooks,通过执行预先排好的任务集,按顺序执行任务

ansible工具集

ansible工具集包含InventoryModulesPluginsAPI,其中,Inventory用来管理设备列表,可以通过分组实现,对组的调用直接影响组内的所有主机;Modules是各种执行模块,几乎所有的管理任务都是通过模块执行的;Plugins提供了各种附加功能;API为编程人员提供一个接口,可以基于此做
Ansible的二次开发。

作用对象

ansible的管理端必须是linux系统,如:Redhat,Debian,Centos,它的作用对象不仅仅是linux和非linux操作系统的主机,也可以作用于各类PUBLIC/PRIVATE,商业和非商业设备的网络设施。

使用者使用AnsibleAnsible-playbooks时,Ansible会遵循预先安排的规则将Playbooks逐步拆解为Play,再将Play组织成Ansible可以识别的任务,随后调用任务涉及的所有模块插件,根据Inventory中定义的主机列表 通过
SSH将任务集以临时文件或命令的形式传输到远程客户端执行并返回执行结果,如果是临时文件则执行完毕后自动删除。

Ansible基础架构

连接插件(connecter plugins): 用来连接主机,连接被管理端 ;
核心模块(core modules): 连接主机,实现操作,依赖于具体模块来执行;
自定义模块:用户自己开发的功能模块;
剧本(playbook): 讲多个任务组合成一个剧本,由ansible自动批量执行 ;
主机清单(host inventory):定义ansible管理的客户端主机范围。

上面知识都了解以后呢,我们来开始安装ansible

准备环境:

设备 描述
192.168.10.8 ansible
192.168.10.1 web
192.168.10.7 nfs
192.168.10.4 rsync

安装ansible

(1)配置阿里云epel源

epel源:wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo  
Centos镜像源:wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

(2)yum 安装ansible

yum -y install ansible

安装完后,ansible --version查看版本
在这里插入图片描述

到这里就算是安装完成,开始对ansible配置

配置主机清单

children是子分组,必须有冒号:分隔开,在这里可以比喻成把servers是看成“爷爷”,而web,nfs,rsync则是“爸爸”,node节点就是“孙子”了。

vim /etc/ansible/hosts
添加:
[web]
node1
[nfs]
node7
[rsync]
node4

[servers:children]
web
nfs
rsync
保存退出

在ansible上配置ssh秘钥对访问,或者提供一个password,否则会因为没有权限而被拒绝

[root@localhost ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
/root/.ssh/id_rsa already exists.
Overwrite (y/n)? y
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:
6c:ac:f3:46:f9:8b:60:f1:bf:52:af:fa:2a:eb:00:90 [email protected]
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
| .               |
|E                |
| .     o         |
|  .   . S.       |
|   .   =o .      |
|    . =..o .     |
|     o.+oo. .    |
|     .o+==*+     |
+-----------------+
[root@localhost ~]# 

然后要把公钥copy到主机上,每一台都要做。否则就会有node连接不上

[root@localhost ~]# ssh-copy-id [email protected]
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]'s password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '[email protected]'"
and check to make sure that only the key(s) you wanted were added.

[root@localhost ~]# ssh-copy-id [email protected]
[root@localhost ~]# ssh-copy-id [email protected]

现在可以连接测试一下

[root@localhost ~]# ansible servers -m  ping -o
node4 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
node7 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
node1 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
[root@localhost ~]# 

因为我做了域名解析,也在/etc/ansible/hosts写的是node,所以才会出现node1,node4,node7。
主机/etc/hosts文件

在这里插入图片描述

常用的调用模块

列出所有模块:
ansible-doc --list

ansible官网对这上千种模块都有解释,点我参考官方模块文档

下面列举一些运维常用的模块
command模块
#仅支持简单语法命令,但语句中不能包含管道符等复杂元素

[root@localhost ~]# ansible web -m command -a "hostname"
node1 | CHANGED | rc=0 >>
node1
[root@localhost ~]# 

shell模块
#command升级版,相当于远程开启了一个shell终端,支持复杂语句,但不支持别名,可以说shell模块用的好,就没有下面这些模块的什么事情了

[root@localhost ~]# ansible servers -m shell -a 'ping -c 5 -i 0.5 192.168.10.8 > 1.txt | ls -l 1.txt'
node7 | CHANGED | rc=0 >>
-rw-r--r--. 1 root root 295 Apr 25 21:36 1.txt
node4 | CHANGED | rc=0 >>
-rw-r--r--. 1 root root 0 Apr 25 06:37 1.txt
node1 | CHANGED | rc=0 >>
-rw-r--r--. 1 root root 0 Apr 25 21:37 1.txt
[root@localhost ~]# 

yum 模块
#基于yum 机制,对远程主机进行管理

相应的参数及其解释:

name 安装的软件包名,多个软件","分开
state 服务状态:
installed,present 安装软件包
removed,absent 卸载软件包
latest 安装最新软件包

例子:
在这里插入图片描述

copy模块

  • #复制主机文件到远程主机指定位置
注释:
		src  	源文件路径
		dest 	目标文件路径
		backup  覆盖到目标文件前,是否提前备份
		content 添加文件内容
		group   指定属组
		owner   指定属主
		mode    指定权限

例子:
在这里插入图片描述

service 模块

  • #用来管理远程主机上的服务的模块
常用的参数解释 :	
		name  指定服务名
		state 指定服务运行状态
			  started   开启服务
			  stopped   关闭服务
			  reloaded  重载服务
			  restarted 重启服务
			  enabled =yes|no  是否开机自启

例子:
在这里插入图片描述

user | group 模块
#用于管理远程主机上的用户账号|群组

常见的参数
name : 必选参数,账号名称
state :present|absent 创建或删除账号 
system=yes|no :是否为系统账号
uid:用户的UID
gid:群组的GID
group:用户的基本组
groups:用户的附加组
shell:默认使用的shell
home:用户的家目录
password:用户的密码
comment:用户的注释信息

例子:
在这里插入图片描述
file模块
#在远程主机上创建,删除,修改目录|文件 和权限的修改

dest/path/name(required):指定操作的位置,路径
owner:使用者
group:所属群组
mode:设置权限
state状态:
state=directory:创建一个空目录
state=touch:创建一个空文档
state=file:查看指定文件是否存在

创建目录,并赋权,更改属主属组在这里插入图片描述
创建文件
在这里插入图片描述
在这里插入图片描述

mount模块
#对远程主机进行挂载和卸载的操作,可以结合nfs服务器一起使用

>常见的参数:
>   fstype:挂载的文件系统类型
>   opts:挂载参数信息
>   path:挂载点
>   src:挂载设备文件 
>   state=present|mounted:挂载文件,mounted会修改/etc/fstab文件
>   state=unmounted|absent:卸载文件,absent会修改/etc/fatab文件

在已经有的nfs共享存储服务器环境下 操作,其中nfs部署我就不在这里写了

[root@localhost ~]# ansible web -m mount -a 'src=192.168.10.4:/nfs path=/var/www/html fstype=nfs state=mounted'
node1 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "dump": "0", 
    "fstab": "/etc/fstab", 
    "fstype": "nfs", 
    "name": "/var/www/html", 
    "opts": "defaults", 
    "passno": "0", 
    "src": "192.168.10.4:/nfs"
}
[root@localhost ~]# 

查看挂载情况,使用mounted挂载会自动修改/etc/fstab文件
在这里插入图片描述
cron 模块
#cron定时任务模块

相关的参数:
minute/hour/day/month/weekday :和设置时间信息相关参数,不写时默认为*
job:工作,设置定时任务相关参数
name(required):定时任务注释信息
state状态:
absent:删除指定的任务
disabled=yes|no :将指定的任务是否注释

例子:

[root@localhost ~]# ansible web -m cron -a "name='ntpdate time' minute=*/5 job='/usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null' "
node1 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "envs": [], 
    "jobs": [
        "ntpdate time"
    ]
}
[root@localhost ~]# 

在这里插入图片描述

更多模块就自己去官网看看,上面有链接,如果觉得写的不错,您的点赞和关注是给我的最大的动力,谢谢!

在这里插入图片描述

下一篇:ansible剧本的编写(ansible-playbooks)

原创文章 58 获赞 20 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43815140/article/details/105753321