Ansible上手

怎么使用Ansible,本章通过简单的例子还说明Ansilbe上手的基本步骤。

  1. 安装Ansible
  2. Ansible管理哪些主机(主机目录管理)
  3. 使用Ansilbe命令行管理主机(Ad-hoc command)
  4. 使用Ansilbe脚本语言管理主机(脚本语言Playbook)
  5. Ansible的“命令”Module

    安装Ansile

安装Ansile

这里以RedHat系Linux为例,其他系统请参考ansible的官网

管理员的电脑上:

  • 安裝Ansible软件

yum安装即可

$ # Redhat/CentOS Linux上,Ansible目前放在的epel源中  
$ # Fedora默认源中包含ansible,直接安装包既可  
$ sudo yum install epel-release   
$ sudo yum install ansible -y  
  • 配置Ansible管理节点和主机的连接

其实就是配置从管理节点到远程主机之间基于key(无密码的方式)的SSH连接

$ # 生成ssh key  
$ ssh-keygen  
$ # 拷贝ssh key到远程主机,ssh的时候就不需要输入密码了  
$ ssh-copy-id remoteuser@remoteserver  
$ # ssh的时候不会提示是否保存key  
$ ssh-keyscan remote_servers >> ~/.ssh/known_hosts  

验证下有没有装好: 在管理节点执行下面的ssh命令,既不需要输入密码,也不会提醒你存储key,那就成功啦。

$ ssh remoteuser@remoteserver

被管理的远程主机:

不需要安装特殊的包,只需要python>2.4,RedHat Linux一般安装方式都自带。

Ansible需要管理哪些主机

Ansible的主机目录

什么是主机目录(Host Inventory)?

主机目录是配置文件,用来告诉Ansible需要管理哪些主机。并且把这些主机根据按需分类。

可以根据用途分类:数据库节点,服务节点等;根据地点分类:中部,西部机房。

主机目录配置文件:

默认的文件是: /etc/ansible/hosts

可以修改为其它的文件,下一章Ansible进阶中介绍。

例子

最简单的hosts:

192.168.1.50
aserver.example.org
bserver.example.org

带分类的hosts:

mail.example.com

[webservers]
foo.example.com
bar.example.com

[dbservers]
one.example.com
two.example.com
three.example.com

Ansible通过命令管理主机

Ansible用命令管理主机

Ansible提供了一个命令行工具,在官方文档中起给命令行起了一个名字叫Ad-Hoc Commands。

ansible命令的格式是:

ansible <host-pattern> [options]

ansible命令功能有哪些

先不用深纠命令的语法,讲完module那节,就可以理解语法。先从感官上,通过下面的命令认识下ansible的命令行都可以做什么。

检查ansible安装环境

检查所有的server,是否以bruce用户创建了ansible主机可以访问的环境。

$ansible all -m ping -u bruce

执行命令

在所有的server上,以当前bash的同名用户,在远程主机执行“echo bash”

$ansible all -a "/bin/echo hello"

拷贝文件

拷贝文件/etc/host到远程机器(组)atlanta,位置为/tmp/hosts

$ ansible web -m copy -a "src=/etc/hosts dest=/tmp/hosts"

安装包

远程机器(组)webservers安装yum包

$ ansible web -m yum -a "name=acme state=present"

添加用户

$ ansible all -m user -a "name=foo password=<crypted password here>"

下载git包

$ ansible web -m git -a "repo=git://foo.example.org/repo.git dest=/srv/myapp version=HEAD"

起服务

$ ansible web -m service -a "name=httpd state=started"

并行执行

启动10个并行进行执行重起

$ansible lb -a "/sbin/reboot" -f 10

查看远程主机的全部系统信息!!!

$ ansible all -m setup

Ansible用脚本管理主机

Ansible用脚本管理主机

只有脚本才可以重用,避免总敲重复的代码。Ansible脚本的名字叫Playbook,使用的是yml的格式。

注解:yml和json类似,是一种表示数据的格式。

执行脚本playbook的方法

$ansible-palybook deploy.yml

playbook的例子

deploy.yml的功能为web主机部署apache, 其中包含以下部署步骤:

  1. 安装apache包;
  2. 拷贝配置文件httpd,并保证拷贝文件后,apache服务会被重启;
  3. 拷贝默认的网页文件index.html;
  4. 启动apache服务;

playbook deploy.yml包含下面几个关键字,每个关键字的含义:

  • hosts:为主机的IP,或者主机组名,或者关键字all
  • remote_user: 以哪个用户身份执行。
  • vars: 变量
  • tasks: playbook的核心,定义顺序执行的动作action。每个action调用一个ansbile module。

  • action 语法: module: module_parameter=module_value

  • 常用的module有yum、copy、template等,module在ansible的作用,相当于bash脚本中yum,copy这样的命令。下一节会介绍。

  • handers: 是playbook的event,默认不会执行,在action里触发才会执行。多次触发只执行一次。

deploy.yml文件

---
- hosts: web
  vars:
    http_port: 80
    max_clients: 200
  remote_user: root
  tasks:
  - name: ensure apache is at the latest version
    yum: pkg=httpd state=latest

  - name: Write the configuration file
    template: src=templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
    notify:
    - restart apache

  - name: Write the default index.html file
    template: src=templates/index.html.j2 dest=/var/www/html/index.html

  - name: ensure apache is running
    service: name=httpd state=started
  handlers:
    - name: restart apache
      service: name=httpd state=restarted

不懂yml,没关系,上面的deploy.yml格式转化为json格式为:

[
  {
    "hosts": "web",
    "vars": {
      "http_port": 80,
      "max_clients": 200
    },
    "remote_user": "root",
    "tasks": [
      {
        "name": "ensure apache is at the latest version",
        "yum": "pkg=httpd state=latest"
      },
      {
        "name": "Write the configuration file",
        "template": "src=templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf",
        "notify": [
          "restart apache"
        ]
      },
      {
        "name": "Write the default index.html file",
        "template": "src=templates/index.html.j2 dest=/var/www/html/index.html"
      },
      {
        "name": "ensure apache is running",
        "service": "name=httpd state=started"
      }
    ],
    "handlers": [
      {
        "name": "restart apache",
        "service": "name=httpd state=restarted"
      }
    ]
  }
]

提供json和yml互转的在线网站: http://www.json2yaml.com/

Ansible模块Module

Ansible模块Module

什么是Ansible Module?

bash无论在命令行上执行,还是bash脚本中,都需要调用cd、ls、copy、yum等命令;module就是Ansible的“命令”,module是ansible命令行和脚本中都需要调用的。常用的Ansible module有yum、copy、template等。

在bash,调用命令时可以跟不同的参数,每个命令的参数都是该命令自定义的;同样,ansible中调用module也可以跟不同的参数,每个module的参数也都是由module自定义的。

每个module的用法可以查阅文档。http://docs.ansible.com/ansible/modules_by_category.html

Ansible在命令行里使用Module

在命令行中

-m后面接调用module的名字

-a后面接调用module的参数

$ #使用module copy拷贝管理员节点文件/etc/hosts到所有远程主机/tmp/hosts
$ ansible all -m copy -a "src=/etc/hosts dest=/tmp/hosts"
$ #使用module yum在远程主机web上安装httpd包
$ ansible web -m yum -a "name=httpd state=present"

Ansilbe在Playbook脚本使用Module

在playbook脚本中,tasks中的每一个action都是对module的一次调用。在每个action中:

冒号:前面是module的名字

冒号:后面是调用module的参数

---
  tasks:
  - name: ensure apache is at the latest version
    yum: pkg=httpd state=latest
  - name: write the apache config file
    template: src=templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
  - name: ensure apache is running
    service: name=httpd state=started

Module的特性

  • Module是通过命令或者Playbook可以执行的task的插件

  • Module是用Python写的。

  • Ansible提供一些常用的Module http://docs.ansible.com/ansible/modules_by_category.html

  • 通过命令ansible-doc可以查看module的用法

  • Ansible提供API,用户可以自己写Module