介绍

Ansible是一个开源的基于Python的服务器配置管理工具。

在众多配置管理工具中,最著名的当属Puppet, Chef, Salt和Ansible这四大金刚。

其中Puppet最老牌,开创了配置管理软件这一领域。其初始版本发布于2005年,由ruby实现而成。 Chef后来据上,初始版本发布于2009年,由ruby和erlang实现而成。 Salt和Ansible算是后起之秀,近两年成长势头很猛。它们都是由python实现而成的。

本文主要介绍Ansible,它是由Puppet的前员工自立门户而创建的,相比其它几位,有一些独门秘籍。

不得不说,随着云计算的飞速发展,管理配置工具也得到了突飞猛进的进步,大大简化了云服务器的管理。 依靠它,可以帮你简化以下这些工作:

  • 应用部署
  • 应用配置管理
  • 持续部署,将CI生成的包部署到远程服务器
  • 管理AWS
  • 管理Docker容器

工作原理

Ansible默认使用SSH来管理机器。

一旦Ansible安装后,它不需要添加数据库,也不会有守护进程启动或在后台运行。 你只需要在一台机器上安装,然后它可以以该机器为中心管理多台远程机器。 当Ansible管理远程机器时,它不需要在远程机器上安装软件,所以也不用考虑Ansible版本升级的问题。

用作管理的机器成为控制机器(Control Machine),被管理的机器称为管理节点(Managed Node)。

macOS安装

使用Homebrew来安装最新版本,目前最新版本是2.4(2017-12-28)

brew install ansible

Linux安装

我们以Ubuntu 12.04操作系统为例,将Ansible安装到控制主机上。

通过APT-GET安装

$ sudo apt-get install software-properties-common
$ sudo apt-add-repository ppa:ansible/ansible
$ sudo apt-get update
$ sudo apt-get install ansible

配置

准备节点机器

先通过VirtualBox安装一个CentOS的虚机。 系统为CentOS 6.5。如果你使用过Vagrant的话,新建一个虚机将变得十分简单。

安装完成后,登录虚机,用ifconfig命令获取虚机的IP地址。假设IP为192.168.56.10,登录用户名为user。

配置节点机器地址

打开编辑/etc/ansible/hosts文件,将默认的地址都先注释掉,然后在[webservers]下面添加一行192.168.56.10。

$ sudo nano /etc/ansible/hosts

将SSH公钥添加到节点机器

如果你的机器当前用户下已经生成过SSH密钥对的话,则可以跳过这一步。否则请参考该网页的第一和第二步生成一个无密码的私钥和公钥。

接下来,需要将公钥添加到节点机器的authorized_keys文件中(~/.ssh/authorized_keys ),这样就可以通过SSH在不输入密码的情况下登录远程节点机器。 执行以下命令:

$ ssh-copy-id user@192.168.56.10

user就是节点机器已有的用户。

成功后,尝试输入$ ssh user@192.168.56.10,看看是不是不需要输入密码就能远程登录该机器了。

最后结束该远程登录,输入$ logout

实践

第一个命令Ping

在命令行输入:

$ ansible all -m ping -u user

可以得到返回结果:

192.168.56.10 | success >> {
    "changed": false, 
    "ping": "pong"
}

至此,我们已经成功地用ansible把控制主机和管理节点连接起来了。接下来我们要进行一些管理操作。

如果报错的话,说明你hosts文件有问题或者SSH密钥没有生成好。

随机命令

随机命令可以为我们提供以下功能来管理远程节点:

  1. 文件拷贝: $ ansible atlanta -m copy -a "src=/etc/hosts dest=/tmp/hosts"
  2. 安装包管理:$ ansible webservers -m yum -a "name=acme state=removed"
  3. 用户和组管理:$ ansible all -m user -a "name=foo password=<crypted password here>"
  4. 服务管理:ansible webservers -m service -a "name=httpd state=started"

Playbook

前面介绍的随机命令,可以方便地进行节点机器的日常管理。 如果要执行批量操作来安装软件和部署应用的话,就需要借助Playbook了。

可以说Playbook是ansible的精髓所在。通过它可以实现很复杂的部署任务。

由于本文只是浅显的介绍,对Playbook的使用就不展开了。以后会写一些专题来分享一些实战经验。

下面我们直接使用ansible附带的例子来展示下它的强大。

Use playbook to install wordpress

用GIT克隆https://github.com/ansible/ansible-examples

可以输入以下命令:

$ git clone https://github.com/ansible/ansible-examples.git
$ cd wordpress-nginx
$ ansible-playbook site.yml -u user

接下去,等待命令结束后,一台部署了wordpress的服务器就好了。是不是很容易啊?

和Jenkins集成需要注意的地方

关于SSH密钥

如果ubuntu下是用apt-get安装jenkins的话,jenkins会被安装到var/lib/jenkins下。jenkins服务进程会用jenkins用户启动。

所有我们需要切换到jenkins用户后,再执行生成密钥和添加密钥到远程节点的操作。

可以使用如下命令切换到jenkins用户: $ sudo su - jenkins

这样就可以CD到var/lib/jenkins/.ssh去查看密钥情况了。

Job

编辑Job时,只需要选择执行Shell脚本任务,然后输入ansible或者ansible-playbook的命令行就可以了。