ansible

一.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

管理软件包:


你可能感兴趣的:(ansible)