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 还有其他很多模块,后续我会对常用模块分别进行讲解。


如果觉得有用,欢迎关注我的微信,有问题可以直接交流:

相关内容

    暂无相关文章