Ansible

ansible基础详解

2017-10-02  本文已影响0人  姜饼人_9e7b

一、ansible基础

1、介绍

ansible是一个自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible中文权威指南

2、特性:

无客户端:不使用时系统开销为0
无服务器:直接运行命令
基于模块工作:可以使用任何语言开放自定义模块
yaml:使用yaml语言定制playbook-
默认基于ssh工作
幂等性:多次运行,结果不变

3、架构

ansible架构

ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
(1)、connection plugins:连接插件,负责和被监控端实现通信;
(2)、host inventory:主机库,是一个配置文件里面定义监控的主机;
(3)、modules:ansible自身核心模块、command模块、自定义模块;
(4)、Plugins:借助于插件完成记录日志邮件等功能;
(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。

4、用法

在这里先解释一下ansible的用法,看不懂可以先跳过。
其基本上可以分为ad-hocplaybooks两种方式。

5、安装

ansible在epel源,使用yum可以直接安装
由于ansible是基于Python开发的,安装时还需要诸多Python包。
除此之外,还要用到PyYAML这个将yaml解析成python的工具。

yaml

二、host Inventory文件

Ansible 可以同时操作一个组的多台主机。组和主机之间的关系通过inventory文件 配置。默认路径为/etc/ansible/hosts。

/etc/ansible/hosts 文件的格式与windows的ini配置文件类似

mail.example.com                                     <==直接指定某个主机

[webservers]                                         <==组名
foo.example.com                                      <==组成员
bar.example.com                                      <==组成员

[dbservers]                                          <==组名
one.example.com:9527                                 <==指定非标准ssh端口
foo.example.com                                      <==同一台主机,可以属于多个组
172.16.80.100                                        <==直接用主机IP
[webservers]
www[1:50].example.com                <==简写数字范围
db-[a:f].example.com                  <==简写字母范围                
[atlanta]
host1 http_port=80 maxRequestsPerChild=808
host2 http_port=303 maxRequestsPerChild=909
[websuvs]
web1
web2

[websuvs:vars]
http_port=8080
https_port=443

更多定义参考:Inventory文件

三、ansible常用命令

1、ansible-doc命令

Usage: ansible-doc [options] [module...]

Options:
  -a, --all             查看所有模块的文档
  -h, --help            查看帮助
  -l, --list            列出所有可用模块
  -M MODULE_PATH, --module-path=MODULE_PATH
                        列出模块路径
  -s, --snippet         获取指定模块的使用信息
  -v, --verbose         详细信息
  --version             查看程序版本

2、ansible命令

Usage: ansible <host-pattern> [-f forks] [-m module_name] [-a args]

<host-pattern>        指定被管控的主机,需要事先定义在inventory文件中,可以是IP、组,支持模式匹配;all表示所有inventory定义的主机。
[-f forks]            指定线程数,即同时处理的主机数,默认是5
[-m module_name]      指定使用的模块
[-a args]             指明模块的参数

例子:

ansible webservers -m service -a "name=httpd state=started"
#使用service模块,启动webservers组的httpd服务

ansible webservers -m ping
#使用ping模块检查webservers组

ansible webservers -m command -a "/sbin/reboot -t now"
#使用command模块,在webservers组执行命令“/sbin/reboot -t now”

3、ansible-playbook

Usage: ansible-playbook playbook.yml
Options:
  -C, --check           干跑playbook.yml,不真正执行

四、ansible常用模块

获取模块列表:ansible-doc -l

常用模块:

1、 command模块

在远程主机运行命令
如:ansible webservers -m command -a "/sbin/reboot -t now"

2、shell模块

在远程主机在shell进程下运行命令,支持shell特性,如管道等 。command的不支持重定向、管道。

3、copy模块

从本地主机拷贝文件到远程、主机

4、cron模块

管理crontab

5、fetch模块

从远程主机上取文件

6、file模块

设置文件属性

7、yum模块

你懂的

8、service模块

管理服务

9、user模块

10、script模块

11、setup模块

获取远程主机的facts

五、playbooks

1、什么是playbooks?

playbooks直接翻译过来就是剧本的意思。这个剧本内,定义个一个或者多个任务,比如创建角色、安装程序、启动服务等等。当运行这个脚本时,就可以一次性执行多个任务。

更强大的地方在于,在 playbooks 中可以编排有序的执行过程,甚至于做到在多组机器间,来回有序的执行特别指定的步骤,并且可以同步或异步的发起任务。

我们使用 ad-hoc 时,主要是使用 /usr/bin/ansible 程序执行任务。而使用 playbooks 时,更多是将之放入源码控制之中,用之推送你的配置或是用于确认你的远程系统的配置是否符合配置规范。

playbooks用的是YAML格式,参见YAML语法

核心元素:

Play

如果说playbooks是剧本,那么剧本就是由一幕幕戏组成的。play就是剧本上的某一幕。一个或者多个plays组成一个完整的剧本。

play例子(下面的内容会以这个play讲解):

---                                                               <==YAML格式,表示一个文件的开始
- hosts: webservers                                               <==运行指定任务的目标主机
  vars:                                                           <==定义参数
    http_port: 80
    max_clients: 200
  remote_user: root                                               <==在远程主机上执行任务的用户
  tasks:                                                          <==任务列表
  - name: ensure apache is at the latest version                  <==任务1的名字
    yum: pkg=httpd state=latest                                   <==任务1具体执行的内容
  - name: write the apache config file                            <==任务2的名字
    template: src=/srv/httpd.j2 dest=/etc/httpd.conf
    notify:
    - restart apache
  - name: ensure apache is running                                <==任务3的名字
    service: name=httpd state=started
  handlers:
    - name: restart apache                                        <==触发条件
      service: name=httpd state=restarted

2、Tasks 列表

每一个 play 包含了一个 tasks 列表(任务列表),每个task拥有一个name和module。
如上面的play例子Tasks列表下有3个任务

 tasks:                                                           <==任务列表
  - name: ensure apache is at the latest version                  <==任务1的名字
    yum: pkg=httpd state=latest                                   <==任务1具体执行的内容
  - name: write the apache config file                            <==任务2的名字
    template: src=/srv/httpd.j2 dest=/etc/httpd.conf
    notify:
    - restart apache
  - name: ensure apache is running                                <==任务3的名字
    service: name=httpd state=started

3、Variables

(1)变量命名:字母、数字和下划线组成,只能以字母开头;
(2)变量类型:

playbook定义变量格式:

- hosts: webservers
  vars:
    http_port: 80

变量引用:{{ variable }}

4、Templates:包含了模板语法的文本文件;

5、Handlers:由特定条件触发的任务;

6、roles角色

上一篇 下一篇

猜你喜欢

热点阅读