Ansible 初体验,ansible初体验
Ansible 初体验,ansible初体验
这是 Ansible 系列的开篇,主要给大家普及一下什么是 Ansible,它是用来做什么的,以及安装和简单实用。
什么是 Ansible
Ansible 是一款使用 Python
开发的自动化管理工具,由 Michael DeHaan 发起、开发、创建,先已被 Redhat 收购。Ansible 在 GitHub 上也是排名前 10 的 Python 项目,可以看到其火热程度。
官网对 Ansible 的定义是:Ansible is the simplest way to automate apps and IT infrastructure. 即 Ansible 是一个实现应用程序和 IT 基础组件自动化的东东,这里它们自信的用了 simplest
,最简单便捷!
Ansible 这个名字其实来源于
厄休拉•勒古恩
的一本书 –《罗卡农的星球》,用以表示一种能在浩瀚宇宙中即时通讯的装置。那么,勒古恩又是怎么想到这个单词的呢?在 2001 年 Usenet 的一个帖子里,戴夫•古德曼宣称勒古恩曾经告诉他Ansible
是从answerable
(可以应答)演变来的,她后来发现把这个词的字母换一下顺序就变成了lesbian
(女同性恋者),这一点也使她觉得相当有趣。
Ansible 的应用领域
- 应用部署
- 配置管理
- 任务流编排
通过使用 Ansible,无论是系统管理员、运维团队、开发者、基础架构管理员,都可以从中受益。
Ansible 的安装
下文的操作全部是在
CentOS7
下执行的,Windows 系统暂时没有涉及。由于涉及操作其他主机,建议用 VirtualBox 创建几台虚拟机。
直接使用 yum
安装即可,安装完成后可以查看下 Ansible 版本,确认是否安装成功。
# yum -y install epel-release
# yum -y install ansible
# ansible --version
ansible 2.5.3
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Nov 6 2016, 00:28:07) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]
Ansible 主要组件
- Ansible:Ansible 的核心程序
- Host Inventory:记录了每一个由 Ansible 管理的主机信息,信息包括 ssh 端口,root 帐号密码,ip 地址等等。
- Playbooks:YAML 格式文件,多个任务定义在一个文件中,使用时可以统一调用,
剧本
用来定义那些主机需要调用那些模块来完成的功能。 - Core Modules:Ansible 执行任何管理任务都不是由 Ansible 自己完成,而是由核心模块完成;Ansible 管理主机之前,先调用
core Modules
中的模块,然后指明管理 Host Inventory 中的主机,就可以完成管理主机。 - Custom Modules:自定义模块,完成 Ansible 核心模块无法完成的功能,此模块支持任何语言编写。
- Connection Plugins:连接插件,Ansible 和 Host 通信使用。
这里我们先主要讲解下 Host Inventory
和 一些模块的简单使用,后续在针对 Playbooks
进行讲解。
Host Inventory 清单文件
Ansible 使用清单文件来了解要使用的服务器,以及如何将它们分组以并行执行任务。
默认的清单文件是 /etc/ansible/hosts
,也可以在运行时通过 -i
参数来指定清单文件。
- 定义主机和组
# 可以直接用 IP 地址和 Hostname,后面加数字表示 ssh 端口号
192.168.1.2
test.ansible.com:65022
# [] 表示一个分组,紧随其后的是该组成员
# [120:123] 表示 120~123 之间所有的主机
[servers]
172.20.21.[120:123]
# 定义组变量,当与 [all:vars] 冲突时,以最小的定义为准
[servers:vars]
ansible_user=root
ansible_ssh_pass=111111
# 可以定义别名,如这里的 web1,web2
[webs]
web1 ansible_host=10.1.1.11
web2 ansible_host=10.1.1.12
# 可以针对某个主机定义变量
[db]
dbserver ansible_host=10.1.1.21 ansible_ssh_user=root ansible_ssh_pass='123com'
# 组可以嵌套,即把一个组作为另一个组的子成员
[all:children]
webs
db
# 定义组变量
[all:vars]
ansible_user=root
ansible_ssh_pass=123456
Ansible Inventory 内置参数
参数 | 用途 |
---|---|
ansible_ssh_host | 将要连接的远程主机名ssh地址 |
ansible_ssh_port | ssh端口 |
ansible_ssh_user | ssh 用户名 |
ansible_ssh_pass | ssh 密码 |
ansible_sudo | sudo 用户 |
ansible_sudo_pass | sudo 密码 |
可以参考上面的清单文件配置自己的服务器及登录信息。
Ansible 小试身手
Ansible 操作远程主机时,包含很多模块,其中常用的有 ping、yum、service、file、copy等,这里我们使用其中几个演示一下。
准备工作
测试前将 Ansible 配置文件中的下面一句注释打开,即禁止 SSH key host 的检查。
# uncomment this to disable SSH key host checking
host_key_checking = False
测试过程中使用的清单文件如下:
[apache]
192.168.31.64
192.168.31.65
[nginx]
192.168.31.66
192.168.31.65
[servers:children]
apache
nginx
[servers:vars]
ansible_ssh_user='root'
ansible_ssh_pass='123456'
测试主机连通性
# ansible www.baidu.com -m ping
[WARNING]: Could not match supplied host pattern, ignoring: www.baidu.com
[WARNING]: No hosts matched, nothing to do
发现执行结果异常,这是因为 Ansible
只纳管定义在清单文件中的主机,因此需要将主机配置到上述的清单文件中。
对 servers 组进行 ping 操作:
# ansible servers -m ping
192.168.31.66 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.31.64 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.31.65 | SUCCESS => {
"changed": false,
"ping": "pong"
}
这里 ansible 命令后面跟组名,也可以指定某个主机,-m
表示使用哪个模块。
需要注意的是,这里的 ping 操作并不是平常所说的 ping,而是进行 ssh 连通性检查。
执行远程指令
# ansible servers -m command -a 'whoami'
192.168.31.66 | SUCCESS | rc=0 >>
root
192.168.31.65 | SUCCESS | rc=0 >>
root
192.168.31.64 | SUCCESS | rc=0 >>
root
这里使用 command
模块在远程主机上运行 whoami
,-a
用于指定模块参数。也可以使用 shell
模块:
# ansible servers -m shell -a 'whoami'
192.168.31.66 | SUCCESS | rc=0 >>
root
192.168.31.65 | SUCCESS | rc=0 >>
root
192.168.31.64 | SUCCESS | rc=0 >>
root
这两个模块的区别后续我们会再介绍。
总结
Ansible 个人使用下来,感觉像一种语言,它做的就是对 shell 进行封装,提供更可靠、更丰富、可重用的功能。
这次仅仅是对 Ansible 进行一个简单的介绍,让大家对其有个大体的认识,这里仅仅列举了两三个模块的使用,其实 Ansible 还有其他很多模块,后续我会对常用模块分别进行讲解。
如果觉得有用,欢迎关注我的微信,有问题可以直接交流:
评论暂时关闭