一.Ansible 介绍
常用的自动化运维工具
Puppet ―基于 Ruby 开发,采用 C/S 架构,扩展性强,基于 SSL,远程命令执行相对较弱
SaltStack ―基于 Python 开发,采用 C/S 架构,相对 puppet 更轻量级,配置语法使用 YMAL,使得配置脚本更简单
Ansible ―基于 Python paramiko 开发,分布式,无需客户端,轻量级,配置语法使用 YMAL 及 Jinja2模板语言,更强的远程命令执行操作
其他 DevOps 请参看:https://github.com/geekwolf/sascripts/blob/master/devops.md
Ansible 是一个简单的自动化运维管理工具,可以用来自动化部署应用、配置、编排 task(持续交付、无宕机更新等),采用 paramiko 协议库(fabric 也使用这个),通过 SSH 或者 ZeroMQ 等连接主机,大概每 2 个月发布一个主版本
Ansible 工作机制
Ansible 在管理节点将 Ansible 模块通过 SSH 协议(或者 Kerberos、LDAP)推送到被管理端执行,执行完之后自动删除,可以使用 SVN 等来管理自定义模块及编排
由上面的图可以看到 Ansible 的组成由 5 个部分组成:
Ansible:核心
Modules:包括 Ansible 自带的核心模块及自定义模块
Plugins:完成模块功能的补充,包括连接插件、邮件插件等
Playbooks:网上很多翻译为剧本,个人觉得理解为编排更为合理;定义 Ansible 多任务配置文件,有 Ansible 自动执行
Inventory:定义 Ansible 管理主机的清单
二.Ansible 安装
使用环境 Ubuntu 14.04.1 LTS
Control Machine: 192.168.25.134
Managed Nodes0: 192.168.25.137
注意:Ansible 默认使用 SSH 协议管理节点
方式一:源码安装
git clone git://github.com/ansible/ansible.git --recursive
cd ./ansible
source ./hacking/env-setup
sudo easy_install pip
sudo pip install paramiko PyYAML Jinja2 httplib2
Ansible 升级操作:
git pull --rebase
git submodule update --init --recursive
Git 知识请参考: http://blog.csdn.net/huangyabin001/article/details/30100287
http://git-scm.com/docs/git-submodule
执行脚本 evn-setup 时会读取默认的主机清单文件/etc/ansible/hosts,主机清单文件路径可以通过环境
变量 ANSIBLE_HOSTS 设置或者执行 ansible 时-i 参数指定
最后可以执行 sudo make install 将 ansible 安装到 control server 问题 1:
x86_64-linux-gnu-gcc -pthread -fno-strict-aliasing -fwrapv -Wall -Wstrict-prototypes -fPIC -std=c99 -O3 -fomit-frame-pointer -Isrc/ -I/usr/include/python2.7 -c src/MD2.c -o build/temp.linux-x86_64-2.7/src/MD2.osrc/MD2.c:31:20: fatal error: Python.h: No such file or directory
#include "Python.h" ^
compilation terminated. error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
解决办法:
sudo apt-get install python-dev
方式二:yum 和 apt 安装
针对 RedHat 系列(由于 Ansible 可以管理包含 Python2.4+版本的早期启动,故适用 EL5):
安装 EPEL 源
rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
sudo yum install ansible
或者可以使用源码自己打包 rpm 安装
git clone git://github.com/ansible/ansible.git
cd ./ansible$ make rpm
sudo rpm -Uvh ~/rpmbuild/ansible-*.noarch.rpm
针对 Ubuntu 系列
添加 apt 源
vim /etc/apt/source.list
deb http://ppa.launchpad.net/ansible/ansible/ubuntu trusty main
deb-src http://ppa.launchpad.net/ansible/ansible/ubuntu trusty main
sudo apt-get install software-properties-common
sudo apt-add-repository ppa:ansible/ansible
sudo apt-get update
sudo apt-get install ansible
注释:旧的 ubuntu 发行版 software-properties-common 包叫 python-software-properties
也可以通过源码 make deb 生成 deb 包 apt 去安装
通用方法:使用 pip 或者 pipsi 的 python 包管理工具安装
sudo pip install ansible
curl https://raw.githubusercontent.com/mitsuhiko/pipsi/master/get-pipsi.py | \
python
pipsi install ansible
三.开始使用
默认情况下,Ansible1.2 之前的版本,需要加参数-c 显式指定;Ansible1.3+版本默认使用Openssh 来远程连接主机,并开启 ControlPersist 来优化连接速度和认证;如果使用 RHEL6 系作为 Ansible 控制端,由于 OpenSSH 版本太老无法支持 ControlPersist,这时候 Ansible 将会使用高效的 Python 实现的 OpenSSH 即 paramiko;若果想使用原生的 OpenSSH 连接被控端,需要升级OpenSSH 到 5.6+或者选择 Ansible 的加速模式
针对不支持 ControlPersist 的系统如 RHEL6 可以通过使用 Ansible 加速模式或者 SSH
pipelining(pipelining=on)进行优化来提高连接速度
Ansible 加速模式支持 RHEL6 控制端和其他受限的环境
加速模式使用方法:
在定义的 playbooks 里面添加 accelerate: true 参数
更改 Ansible 用于加速连接的端口,使用参数 accelerate_port,端口配置可以设置系统环境变量
ACCELERATE_PORT 或者修改 ansible.cfg 配置文件,accelerate_multi_key 允许使用多把密钥
[accelerate]
accelerate_port = 5099
---
- hosts: all
accelerate: true
# default port is 5099
accelerate_port: 10000
accelerate_multi_key = yes
注释:Ansible 加速模式支持 sudo 操作,但需要注释 /etc/sudoers #Defaults requiretty;sudo 密码还未支持,所以 sudo 执行需要 NOPASSWD
官方鼓励使用 SSH Keys,也可以通过参数--ask-pass 及--ask-sudo-pass 使用密码
尝鲜 Ansible
控制端:
vim /etc/ansilbe/hosts
[group]
192.168.25.134
192.168.25.137
配置无密码登陆,密码认证使用 Ansible 的-k 参数
root@geekwolf:~# ssh-keygen
root@geekwolf:~# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
测试 ping:
ansible group -m ping
192.168.25.137 | success >> {
"changed": false,
"ping": "pong"
}
192.168.25.134 | success >> {
"changed": false,
"ping": "pong"
}
其他事例:
以 bruce 身份 ping 所有主机
ansible all -m ping -u bruce --ask-pass (第一次执行要加这个,以后就不用了)
在所有节点上执行命令
ansible all -a "/bin/echo hello"
注释:
1.在首次连接或者重装系统之后会出现检查 keys 的提示
The authenticity of host '192.168.0.5 (192.168.0.5)' can't be established.
ECDSA key fingerprint is 05:51:e5:c4:d4:66:9b:af:5b:c9:ba:e9:e6:a4:2b:fe.
Are you sure you want to continue connecting (yes/no)?
解决办法: vim /etc/ansible/ansible.cfg 或者 ~/.ansible.cfg
[defaults]
host_key_checking = False
也可以通过设置系统环境变量来禁止这样的提示
export ANSIBLE_HOST_KEY_CHECKING=False
2.在使用 paramiko 模式时,主机 keys 的检查会很慢
3.默认情况下 Ansible 会记录一些模块的参数等信息到每个被控端的 syslog 日志文件里,除非在任务或者剧本里设置了 no_log: True 会不记录日志
四.主机清单 Inventory
Ansible 通过读取默认的主机清单配置/etc/ansible/hosts,可以同时连接到多个远程主机上执行任务, 默认路径可以通过修改 ansible.cfg 的 hostfile 参数指定路径
/etc/ansible/hosts 主机清单配置格式如下
为每个主机指定连接类型和连接用户:
再用anansible创建文件或者目录时,要看上一级目录的属主是谁,要不是你用的这个用户很可能创建失败,切记,例子如下:
在/mnt 下建立dgf目录相当于,mkdir -p /mnt/dgf
-s 是用户用su do权限创建
--ask-sudo-pass 提示输入sudo密码
ansible group -m file -a "dest=/mnt/dgf mode=755 state=directory" -s --ask-sudo-pass
删除上一步在mnt下新建的dgf
ansible group -m file -a "dest=/mnt/dgf state=absent" -s -K
管理软件包: