简述
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工具集包含Inventory
,Modules
,Plugins
和API
,其中,Inventory用来管理设备列表,可以通过分组实现,对组的调用直接影响组内的所有主机;Modules是各种执行模块,几乎所有的管理任务都是通过模块执行的;Plugins提供了各种附加功能;API为编程人员提供一个接口,可以基于此做
Ansible的二次开发。
作用对象
ansible的管理端必须是linux系统
,如:Redhat,Debian,Centos,它的作用对象不仅仅是linux和非linux操作系统的主机,也可以作用于各类PUBLIC/PRIVATE,商业和非商业设备的网络设施。
使用者使用Ansible
或Ansible-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 root@localhost.localdomain
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 root@192.168.10.4
/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
root@192.168.10.4's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@192.168.10.4'"
and check to make sure that only the key(s) you wanted were added.
[root@localhost ~]# ssh-copy-id root@192.168.10.7
[root@localhost ~]# ssh-copy-id root@192.168.10.1
现在可以连接测试一下
[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)