ansible自动化运维工具

 

一、ansible简介

 

ansible是自动化运维工具,基于Python研发。糅合了众多老牌运维工具的优点实现了批量操作系统配置、批量程序的部署、批量运行命令等功能。仅需在管理工作站上安装ansible程序配置被管控主机的IP信息,被管控的主机无客户端。ansible应用程序存在于epel(第三方社区)源,依赖于很多python组件。主要包括:

(1)、连接插件connection plugins:负责和被监控端实现通信;

(2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;

(3)、各种模块核心模块、command模块、自定义模块;

(4)、借助于插件完成记录日志邮件等功能;

(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。

二、Ansible的核心程序
1.Host Lnventory:记录了每一个由Ansible管理的主机信息,信息包括ssh端口,root帐号密码,ip地址等等。可以通过file来加载,可以通过CMDB加载
主机库,定义可管控的主机列表
2.Playbooks:YAML格式文件,多个任务定义在一个文件中,使用时可以统一调用,“剧本”用来定义那些主机需要调用那些模块来完成的功能.
按照所设定编排的顺序执行完成安排任务
3.Core Modules:Ansible执行任何管理任务都不是由Ansible自己完成,而是由核心模块完成;Ansible管理主机之前,先调用core Modules中的模块,然后指明管理Host Lnventory中的主机,就可以完成管理主机。自带模块
4.Custom Modules:自定义模块,完成Ansible核心模块无法完成的功能,此模块支持任何语言编写。
5.Connection Plugins:连接插件,Ansible和Host通信使用
 
三、Ansible特性与优点:

模块化设计,调用特定的模块来完成特定任务,本身是核心组件,短小精悍;

基于Python语言实现,由Paramiko(python的一个可并发连接ssh主机功能库), PyYAML和Jinja2(模板化)三个关键模块实现

Stupied Simple ,上手简单,学习曲线平滑
SSH by default ,安全,无需安装客户端
配置简单、功能强大、扩展性强
支持API及自定义模块,可通过Python轻松扩展
通过Playbooks来定制强大的配置、状态管理
提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台
幂等性:一种操作重复多次结果相同(比如第一次拷贝后,在执行一遍,若原文件没有变化,不会重复拷贝)
 
ansible安装
yum install epel-release(扩展源,最新版
yum clean all
yum makecache
yum install ansible
 
ansible配置客户端(无密码登录)
ssh-keygen(一路回车)
ls -a 会有一个.ssh/的目录
其中有两个密钥:id_rsa.pud(公钥)    id_rsa(私钥)
将公钥复制到客户端有以下两种方式:
ssh-copy-id -i id_rsa.pub root@192.168.9.129
scp id_rsa.pub root@192.168.9.129:/root/.ssh/authorized_keys
链接客户机ssh 192.168.9.129测试,不用密码登陆成功

配置文件:

(1)ansible应用程序的主配置文件:/etc/ansible/ansible.cfg
(2) Host Inventory定义管控主机/etc/ansible/hosts

 

中括号中的字符是组名(可以更改);一个主机可同时属于多个组

扩展:连续域名可以定义:

www.[1:60] .benet.com

 测试:
ansible all   #测试所有组所有ip
ansible webservers -m ping   #测试webservers组的ip

# SUCCESS 成功  changed false 没有改变  ping pong 通了

ansible常用命令
 
ansible-doc -l  #查看支持的所有模块
ansible-doc -s 模块name  #查看模块用法,获取指定模块的使用信息
 
例:ansible-doc -s yum  #查看yum的用法
比如state= 安装:present   最新安装:latest
 
ansible <host-pattern> [options]语法格式

<host-pattern>

指明管控主机,以模式形式表示或者直接给定IP,必须事先定义在文件中;all设置所有

 [-f forks]

指明每批管控多少主机(启动并发线程数),默认为5个主机一批次

[-m module_name]

使用何种模块管理操作,所有的操作都需要通过模块来指定

[-a args]

特有的参数,指明模块专用参数;args一般为key=value格式

 

注意:
command模块的参数为非kv格式,而是直接给出要执行的命令即可;
<host-pattern>默认读取/etc/ansible/hosts,也可以指明自定义文件路径
例:
ansible webservers -m setup #查看客户端信息

键值对=Key Value

键:就是你存的值的编号(变量)
值:就是你要存放的数据

实例练习:
ansible all -m ping #查看client端是否正常ping通
ansible webservers -m copy -a 'src=/root/git_test/code.txt dest=/root/test' #批量copy文件到cient端
#指定组webservers 调用模块 copy -a 是命令格式的参数 原文件路径 (所有组内成员的)目标地址路径  出现CHANGED成功
ansible webservers -m user -a "name=test state=present"       #批量创建test用户,想要创建系统用户,再加system=true
ansible webservers -m user -a "name=test state=absent"       #批量删除test用户
ansible webservers -m yum -a ‘name=epel-relese state=latest‘     #yum安装
ansible webservers -m service -a ‘name=httpd state=stopped enabled=no‘ #停止httpd服务
ansible webservers -m script -a ‘/tmp/test.sh‘             #运行脚本
ansible webservers -m command -a 'date'               #查看时间

 

playbook

(1)核心元素

Tasks任务、Variables变量、Templates模板、Handlers处理器、Roles角色

(2)playbooks中定义任务:

- name: task description 注释描述信息
module_name: module_args 声明模块:定义ansible模块参数

(3)ansible-playbook执行命令

ansible-playbook <filename.yml> ... [options]

 任何目录下创建文件以".yml"为结尾,进行编辑,要严格按照格式编写
示例1:基础
- hosts: webservers   #表名
  remote_user: root     #用户
  vars:
  tasks:        #任务
  - name: yum install httpd      #操作任务名字
    yum: name=httpd state=latest   #调用yum模块,要yum的服务httpd,选择的状态=最新的
  - name: service start httpd   
service: name=httpd state=started  

 

      

 

示例2:变量
- hosts: webservers
  remote_user: root
  vars:
  - packages: tree    #把tree赋予packages变量
  tasks:
  - name: yum install tree
    yum: name={{ packages }} state=latest  #可直接调用变量
  - name: create user
    user: name=user1

 

 
示例3:迭代
在task中调用内置的item变量;在某task后面使用with_items语句来定义元素列表;
注意:迭代中,列表中的每个元素可以为字典格式;
- hosts: webservers
  remote_user: root
  vars:
  - packages: tree
  tasks:
  - name: yum install tree
    yum: name={{ packages }} state=latest
  - name: create user
    user: name=user1
  - name: create many user
    user: name={{ item }} state=absent
    with_items:    #固定不许变
    - user1      #需要迭代的用户名
    - user2       
    - user3      
    - user4
    - user5
    - user6

 

机制:一个任务轮所有主机
 
 
示例4:触发器notify
只有其关注的条件满足时,才会被触发执行的任务;
- hosts: webservers
  remote_user: root
  vars:
  - packages: tree
  tasks:
  - name: yum install tree
    yum: name={{ packages }} state=latest
  - name: create many user
    user: name={{ item }} state=absent
    with_items:
    - user1
    - user2
  - name: cp httpd.conf  #如果执行这个成功
    copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
    notify:      #触发器
    - restart httpd  #这个名字的触发器(同下面名字一样)
  handlers: 
  - name: restart httpd
    service: name=httpd state=restarted

 

  
示例5:模板templates
用于生成文本文件(配置文件);模板文件中可使用jinja2表达式,表达式要定义在{{}},也可以简单地仅执行变量替换;
Jinja2:是Python下一个被广泛应用的模版引擎
- hosts: webservers
  remote_user: root
  vars:
  - packages: tree
  tasks:
  - name: yum install tree
    yum: name={{ packages }} state=latest
  - name: create many user
    user: name={{ item }} state=absent
    with_items:
    - user1
    - user2
  - name: cp httpd.conf
    template: src=/root/templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf #拷贝
    notify: 
    - restart httpd
  handlers:
  - name: restart httpd
    dervice: name=httpd state=restarted

 

 
  
示例6:单个任务执行tags
- hosts: webservers
  remote_user: root
  vars:
  - packages: tree
  tasks:
  - name: yum install tree
    yum: name={{ packages }} state=latest
  - name: create many user
    user: name={{ item }} state=absent
    tags:
    - add_user
    with_items:
    - user1
    - user2
  - name: cp httpd.conf
    template: src=/root/templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
    notify: 
    - restart httpd
  handlers:
  - name: restart httpd
    dervice: name=httpd state=restarted

 

 
 
示例7:角色roles
roles用于实现“代码复用”;
roles以特定的层次型格式组织起来的playbook元素(variables,tasks, templates, handlers);
可被playbook以role的名字直接进行调用;
用法:在roles/下建立[group_name]子目录,并非全部都要创建;例如:
/etc/ansible/roles/(在/etc/ansible/ansible.cfg定义roles目录)
webserver/
files/:此角色中用到的所有文件均放置于此目录中;
templates/:Jinja2模板文件存放位置;
tasks/:任务列表文件;可以有多个,但至少有一个叫做main.yml的文件;
handlers/:处理器列表文件;可以有多个,但至少有一个叫做main.yml的文件;
vars/:变量字典文件;可以有多个,但至少有一个叫做main.yml的文件;
meta/:此角色的特殊设定及依赖关系;
 
mkdir -pv ansible_playbooks/roles/{webservers,dbservers}/{tasks,files,templates,meta,handlers,vars}
 
 
 
 
 
 

 

posted @ 2018-11-14 15:07  莱克时光  阅读(295)  评论(0编辑  收藏  举报