一, Ansible 的介绍
Ansible 是新出现的自动化运维工具, 基于 Python 开发, 集合了众多运维工具 (puppet,cfengine,chef,func,fabric) 的优点. 实现了批量系统配置, 批量程序部署, 批量运行命令等功能. Ansible 是基于模块工作的, 本身没有批量部署的能力. 真正具有批量部署的是 Ansible 所运行的模块, Ansible 只是提供一种框架.
1,Ansible 框架
连接插件 connection plugins: 负责和被监控端实现通信;
host inventory: 指定操作的主机, 是一个配置文件里面定义监控的主机;
各种模块核心模块, command 模块, 自定义模块;
借助于插件完成记录日志邮件等功能;
playbook: 剧本执行多个任务时, 非必需可以让节点一次性运行多个任务.
2,Ansible 架构图
Ansible 核心组件说明
Ansible:Ansible 的核心程序;
Host Lnventory: 记录了每一个由 Ansible 管理的主机信息, 信息包括 ssh 端口, root 帐号密码, ip 地址等等. 可以通过 file 来加载, 可以通过 CMDB 加载;
Playbooks:YAML 格式文件, 多个任务定义在一个文件中, 使用时可以统一调用,"剧本" 用来定义那些主机需要调用那些模块来完成的功能;
Core Modules:Ansible 执行任何管理任务都不是由 Ansible 自己完成, 而是由核心模块完成; Ansible 管理主机之前, 先调用 core Modules 中的模块, 然后指明管理 Host Lnventory 中的主机, 就可以完成管理主机;
Custom Modules: 自定义模块, 完成 Ansible 核心模块无法完成的功能, 此模块支持任何语言编写;
Connection Plugins: 连接插件, Ansible 和 Host 通信使用.
3,Ansible 基本特性
no agents: 不需要在被管控主机上安装任何客户端;
no server: 无服务器端, 使用时直接运行命令即可;
modules in any languages: 基于模块工作, 可使用任意语言开发模块;
yaml,not code: 使用 yaml 语言定制剧本 playbook;
ssh by default: 基于 SSH 工作;
strong multi-tier solution: 可实现多级指挥.
4,Ansible 的优点
轻量级, 无需在客户端安装 agent, 更新时, 只需在操作机上进行一次更新即可;
批量任务执行可以写成脚本, 而且不用分发到远程就可以执行;
使用 python 编写, 维护更简单, ruby 语法过于复杂;
支持 sudo.
5,Ansible 任务执行流程
说明: 以上内容大多是基于他人分享的基础上总结而来, 学习借鉴之用;
三, Ansible 的安装
1, 系统环境
系统平台: CentOS 7.3
- Ansible Server: 192.168.8.55
- Ansible Client: 192.168.8.66
(1)写 hosts 记录
- [root@Ansible ~]# echo "192.168.8.55 Ansible">> /etc/hosts
- [root@Ansible ~]# echo "192.168.8.66 Client">> /etc/hosts
(2)关闭 firewalld 和 selinux
[root@Ansible ~]# systemctl stop firewalld && systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
(3)关闭 selinux
- [root@Ansible ~]# setenforce 0
- [root@Ansible ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
2,yum 源安装
(1)配置好 epel yum 源安装相应的基础模块, 可以使用 yum 直接安装
[root@Ansible ~]# yum -y install python PyYAML python-paramiko python-jinja2 python-simplejson
(2)安装 Ansible
[root@Ansible ~]# yum -y install ansible
3, 源码包安装(推荐使用)
Ansible 安装所依赖插件较多, 所以首先安装插件
[root@Ansible ~]# yum -y install gcc zlib zlib-devel openssl openssl-devel libffi-devel
(1)python3.6 安装
Ansible 是用 Python 开发的, 使用 Ansible 需要操作系统有 Python, 建议 Python 版本 2.6 以上.
- [root@Ansible ~]# wget https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tgz
- [root@Ansible ~]# tar xvzf Python-3.6.4.tgz -C /usr/src/
- [root@Ansible ~]# cd /usr/src/Python-3.6.4/
- [root@Ansible Python-3.6.4]# ./configure --prefix=/usr/local
- [root@Ansible Python-3.6.4]# make
- [root@Ansible Python-3.6.4]# make install
将 python 头文件拷贝到标准目录, 以避免编译 ansible 时, 找不到所需的头文件
- [root@Ansible Python-3.6.4]# cd /usr/local/include/python3.6m/
- [root@Ansible python3.6m]# cp -a ./*/usr/local/include/
备份旧版本的 python, 并符号链接新版本的 python
- [root@Ansible python3.6m]# cd /usr/bin/
- [root@Ansible bin]# mv python python.old
- [root@Ansible bin]# ln -s /usr/local/bin/python3.6 /usr/local/bin/python
- [root@Ansible bin]# rm -rf /usr/bin/python
- [root@Ansible bin]# cp /usr/local/bin/python3.6 /usr/bin/python
修改 yum 脚本, 使其指向旧版本的 python, 已避免其无法运行
[root@Ansible bin]# vim /usr/bin/yum
将 #!/usr/bin/python 修改为 #!/usr/bin/python2.7
[root@Ansible bin]# vim /usr/libexec/urlgrabber-ext-down
将 #!/usr/bin/python 修改为 #!/usr/bin/python2.7
[root@Ansible bin]# python -- 测试安装版本是否为 Python 3.6.4
Python 3.6.4 (default, Apr 17 2018, 11:03:21)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> exit() -- 退出 python
(2)setuptools 模块安装
- [root@Ansible ~]# wget https://files.pythonhosted.org/packages/72/c2/c09362ab29338413ab687b47dab03bab4a792e2bbb727a1eb5e0a88e3b86/setuptools-39.0.1.zip
- [root@Ansible ~]# unzip setuptools-39.0.1.zip -d /usr/src/
- [root@Ansible ~]# cd /usr/src/setuptools-39.0.1/
- [root@Ansible setuptools-39.0.1]# python setup.py install
安装好 setuptools 后就可以利用 easy_install 这个工具安装下面的 python 模块了, 但我的电脑是虚拟机, 配置太低了, 所以基本无法安装, 所以只好一个一个下载下来再安装了.
(3)pycrypto 模块安装
- [root@Ansible ~]# wget https://pypi.python.org/packages/source/p/pycrypto/pycrypto-2.6.1.tar.gz
- [root@Ansible ~]# tar xvzf pycrypto-2.6.1.tar.gz -C /usr/src/
- [root@Ansible ~]# cd /usr/src/pycrypto-2.6.1/
- [root@Ansible pycrypto-2.6.1]# python setup.py install
(4) PyYAML 模块安装
- [root@Ansible ~]# wget http://pyyaml.org/download/libyaml/yaml-0.1.7.tar.gz
- [root@Ansible ~]# tar xvzf yaml-0.1.7.tar.gz -C /usr/src/
- [root@Ansible ~]# cd /usr/src/yaml-0.1.7/
- [root@Ansible yaml-0.1.7]# ./configure --prefix=/usr/local
- [root@Ansible yaml-0.1.7]# make --jobs=`grep processor /proc/cpuinfo | wc -l`
- [root@Ansible yaml-0.1.7]# make install
- [root@Ansible ~]# wget http://pyyaml.org/download/pyyaml/PyYAML-3.12.tar.gz
- [root@Ansible ~]# tar xvzf PyYAML-3.12.tar.gz -C /usr/src/
- [root@Ansible ~]# cd /usr/src/PyYAML-3.12/
- [root@Ansible PyYAML-3.12]# python setup.py install
(5)Jinja2 模块安装
- [root@Ansible ~]# wget https://pypi.python.org/packages/source/M/MarkupSafe/MarkupSafe-0.9.3.tar.gz
- [root@Ansible ~]# tar xvzf MarkupSafe-0.9.3.tar.gz -C /usr/src/
- [root@Ansible ~]# cd /usr/src/MarkupSafe-0.9.3/
- [root@Ansible MarkupSafe-0.9.3]# python setup.py install
- [root@Ansible ~]# wget https://files.pythonhosted.org/packages/56/e6/332789f295cf22308386cf5bbd1f4e00ed11484299c5d7383378cf48ba47/Jinja2-2.10.tar.gz
- [root@Ansible ~]# tar xvzf Jinja2-2.10.tar.gz -C /usr/src/
- [root@Ansible ~]# cd /usr/src/Jinja2-2.10/
- [root@Ansible Jinja2-2.10]# python setup.py install
(6)paramiko 模块安装
- [root@Ansible ~]# wget https://files.pythonhosted.org/packages/f9/e5/99ebb176e47f150ac115ffeda5fedb6a3dbb3c00c74a59fd84ddf12f5857/ecdsa-0.13.tar.gz
- [root@Ansible ~]# tar xvzf ecdsa-0.13.tar.gz -C /usr/src/
- [root@Ansible ~]# cd /usr/src/ecdsa-0.13/
- [root@Ansible ecdsa-0.13]# python setup.py install
- [root@Ansible ~]# https://files.pythonhosted.org/packages/29/65/83181630befb17cd1370a6abb9a87957947a43c2332216e5975353f61d64/paramiko-2.4.1.tar.gz
- [root@Ansible ~]# tar xvzf paramiko-2.4.1.tar.gz -C /usr/src/
- [root@Ansible ~]# cd /usr/src/paramiko-2.4.1/
- [root@Ansible paramiko-2.4.1]# python setup.py install
(7)simplejson 模块安装
- [root@Ansible ~]# wget https://files.pythonhosted.org/packages/0d/3f/3a16847fe5c010110a8f54dd8fe7b091b4e22922def374fe1cce9c1cb7e9/simplejson-3.13.2.tar.gz
- [root@Ansible ~]# tar xvff simplejson-3.13.2.tar.gz -C /usr/src/
- [root@Ansible src]# cd /usr/src/simplejson-3.13.2/
- [root@Ansible simplejson-3.13.2]# python setup.py install
(8) ansible 安装
- [root@Ansible ~]# wget https://files.pythonhosted.org/packages/4a/3b/9d98e132074bb6a3f18fd811db2819fbde6fc8a26fad9a40b49e53cb2455/ansible-2.5.0.tar.gz
- [root@Ansible ~]# tar xf ansible-2.5.0.tar.gz -C /usr/src/
- [root@Ansible ~]# cd /usr/src/ansible-2.5.0/
- [root@Ansible ansible-2.5.0]# python setup.py install
三, Ansible 的配置
1,Ansible 配置
注: centos7.0 安装 Ansible 后发现找不到 ansible.cfg, 配置文件的路径如下图, 并将配置文件拷贝过去
- [root@Ansible ansible-2.5.0]# cd examples/
- [root@Ansible examples]# pwd -- 注意路径
- /usr/src/ansible-2.5.0/examples
- [root@Ansible examples]# ls
- ansible.cfg hosts
- [root@Ansible examples]# mkdir /etc/ansible -- 创建 ansible 目录
- [root@Ansible examples]# cp ansible.cfg hosts /etc/ansible/ -- 拷贝文件
- [root@Ansible examples]# ls -l /etc/ansible/
总用量 24
-rw-r--r-- 1 root root 19315 4 月 17 14:25 ansible.cfg
-rw-r--r-- 1 root root 1016 4 月 17 14:25 hosts
2, 配置 ssh 免密登录(只在控制端使用)
- [root@Ansible ~]# ssh-keygen -t rsa -- 直接回车即可, 不用设置密钥密码.
- Generating public/private rsa key pair.
- Enter file in which to save the key (/root/.ssh/id_rsa):
- 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:
- bc:4e:4e:5f:61:a3:37:08:b0:c4:00:98:90:5b:c6:9f root@Ansible.01.com
- The key's randomart image is:
- +--[ RSA 2048]----+
- |o=... |
- |+ + o |
- | + . .+ |
|. E. + |
| . S + |
| o + o |
| + o + |
| = . o . |
| o . |
- +-----------------+
- [root@Ansible ~]# cat /root/.ssh/id_rsa.pub>> /root/.ssh/authorized_keys
- [root@Ansible ~]# chmod 600 /root/.ssh/authorized_keys
将公钥传给被管理的机器节点
- [root@Ansible ~]# scp /root/.ssh/authorized_keys 192.168.8.66:/root/.ssh/
- root@192.168.8.66's password:
- authorized_keys 100% 401 0.4KB/s 00:00
3, 远程连接测试
- [root@Ansible ~]# vim /etc/ansible/hosts -- 文件末尾添加以下内容
- [web]
- 192.168.8.55
- [root@Ansible ~]# ansible web -m command -a 'uptime'
- 192.168.8.55 | SUCCESS | rc=0>>
- 14:56:03 up 12:53, 4 users, load average: 0.00, 0.01, 0.05
至此, Ansible 的安装配置已经完成, 接下来进行模块的讲解.
来源: http://blog.51cto.com/13525470/2104916