ansible运维自动化工具

运维的三大化是指:html

  • 标准化
  • 自动化
  • 智能化

而对于自动化咱们今天将要给你们介绍一款ansible运维自动化工具:python

ansible是基于python开发的,能实现批量管理系统配置、批量程序部署、批量执行命令。而ansible是基于模块工做的。他的工做机制是基于ssh无密码登陆。mysql

ansible的特色以下:nginx

一、部署简单,只需在主控端部署Ansible环境,被控端无需作任何操做; 
二、默认使用SSH协议对设备进行管理; 
三、有大量常规运维操做模块,可实现平常绝大部分操做。 
四、配置简单、功能强大、扩展性强; 
五、支持API及自定义模块,可经过Python轻松扩展; 
六、经过Playbooks来定制强大的配置、状态管理; 
七、轻量级,无需在客户端安装agent,更新时,只需在操做机上进行一次更新便可; 
八、提供一个功能强大、操做性强的Web管理界面和REST API接口 ——AWX平台。

ansible的三种工做模式:web

  • ad-hoc模式:使用单个模块,支持批量执行单条命令
  • playbook模式:是ansible主要管理方式,是经过task集合完成一类功能,能够简单得分解为多个ad-hoc命令
  • roles角色定制:高级用法,它是基于把playbook分解成多个目录,更加方便,能直接调用

ansible命令执行过程:sql

一、加载本身的配置文件 默认/etc/ansible/ansible.cfg 
二、查找对应的主机配置文件,找到要执行的主机或者组 
三、加载本身对应的模块文件,如command 
四、经过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的 
五、对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件 
六、给文件+x执行 
七、执行并返回结果 
八、删除临时py文件,sleep 0退出

ansible的配置:shell

在/etc/ansible/ansible.cfg中(通常不用更改配置,根据需求去更改)vim

inventory = /etc/ansible/hosts 资产清单列表,就是须要管理主机组的列表
library = /usr/share/ansible    指Ansible模块存放的目录
forks = 5  同时开启进程数,个根据主机数去调整,一次并发处理多少。
sudo_user = root   默认设置执行命令的用户
remote_port = 22    被管理节点的端口,默认是22
host_key_checking = False   设置是否检查SSH主机的密钥
timeout = 60    设置SSH链接超时间隔,通常调高点
log_path = /var/log/ansible.log  日志存放的路径

在/etc/ansible/hosts中定义管理节点后端

一、直接指明主机地址或主机名: 
    www.magedu.com
    172.17.166.166
二、定义一个主机组【组名】把地址或者主机名加进去
    [webserver]
    172.17.166.166
    172.17.155.155
    172.17.166.[1:6]  表示匹配172.17.166.1-----172.17.166.6

ansible一些常见的模块介绍:centos

ansible-doc -l 查看模块信息
ansible all --list-host  查看全部host分组

ansible一些用法:

-a <module_args>   模块命令参数
-k  登陆密码
-C  check 只是去测试一下会改变什么内容,不会真正去执行
-f number  并行任务数
-i 指定管理节点文件的路径
-m  指定调用的模块
-S  用su命令
-o  压缩输出摘要输出,尝试一切都在一行上输出
-s  用sudo去执行
-u  远程用户,默认是Root
-v   查看执行过程信息
-vv  -vvv    更详细执行过程信息
-P  每隔多长时间收集信息

ping模块:测试主机的连通性

ansible  all  -m  ping

command模块,在远程主机执行命令(可是不支持管道|,<,>,;,&)

ansible all -m command -a ‘command’
还支持一些参数
chdir          # 在执行命令以前,先切换到该目录 
creates        #一个文件名,当这个文件存在,则该命令不执行,能够用来作判断 
executable     # 切换shell来执行命令,须要使用命令的绝对路径 
free_form      #要执行的Linux指令,通常使用Ansible的-a参数代替。 
removes        #一个文件名,这个文件不存在,则该命令不执行,与creates相反的判断

shell模块,远程执行命令,shell模块能够支持|,<,>,;,&

ansible all -m shell -a ‘command |...’

copy模块,复制文件到远程主机,能够改权限

(1)复制文件  -a “src=  dest=  ”
    ansible web -m copy -a “src=/etc/passwd dest=/app”
(2)给定内容生成文件 -a "content=  dest=  "
    ansible web -m copy -a “content=’hello world’ dest=/app/a.txt”
还支持一些参数:
backup :       #在覆盖以前,将源文件备份。=yes是备份   =no是不备份
content:       #用于替代src,能够直接指定文件的值
dest:          #必须有指定目标地址路径
directory_mode(mode):     #递归设定目录的权限,默认是系统默认权限
force:         #若是目标主机包含这个文件,yes时为强制覆盖,no不强制覆盖
others:        #全部file模块里的选项均可以在这使用
src:           #源地址路径

file设置文件属性

建立目录:       ansible web -m file -a ‘path=/app/test state=directory’
建立连接文件:    -a “path=   src=   state=link”
删除文件:       -a “path=/app/test    state=absent”

还支持一些参数:
force:    #须要在两种状况下强制建立软连接,一种是源文件不存在,但以后会创建的状况下;另外一种是目标软连接已存在,须要先取消以前的软链,而后建立新的软链,有两个选项:yes|no
group:    #定义文件/目录的属组 
mode:     #定义文件/目录的权限 
owner:    #定义文件/目录的属主 
path:     #必选项,定义文件/目录的路径 
recurse:  #递归设置文件的属性,只对目录有效
src:      #被连接的源文件路径,只应用 于state=link的状况 
dest:     #被连接到的路径,只应用于state=link的状况 
state:    #状态
    directory:    #若是目录不存在,就建立目录         
    file:         #即便文件不存在,也不会被建立         
    link:         #建立软连接         
    hard:         #建立硬连接         
    touch:        #若是文件不存在,则会建立一个新的文件,若是文件或目录已存在,则更新其最后修改时间         
    absent:       #删除目录、文件或者取消连接文件

fetch模块,从远程某主机获取文件到本地

ansible web -m fetch  -a ‘src=/app/a.txt dest=/app’

还有一些参数:
src:          #远程主机文件路径
dest:         #保存本地路径

cron模块,管理cron计划任务(若是添加多条,name不能相同)

ansible web -m cron -a "name='ntp update every 5 min' minute=*/5 job='/sbin/update 172.17.0.1 &> /dev/null' "          #每5分钟同步一下时间。

还有一些参数:
day=       #日应该运行的工做( 1-31, *, */2,  )   
hour=      # 小时 ( 0-23, *, */2, )  
minute=    #分钟( 0-59, *, */2, )   
month=     # 月( 1-12, *, /2,  )   
weekday    # 周 ( 0-6 for Sunday-Saturday,,  ) 
job=       #指明运行的命令是什么   
name=      #定时任务描述   
special_time     #特殊的时间范围,参数:reboot(重启时),annually(每一年),monthly(每个月),weekly (每周),daily(天天),hourly(每小时)  
state      #指定状态,present表示添加定时任务,也是默认设置,absent表示删除定时任务  
user       # 以哪一个用户的身份执行

yum模块,安装软件

ansible web -m yum -a "name=vsftpd state=present disable_gpg_check=yes"             #安装vsftpd包

还有一些参数:
conf_file           #设定远程yum安装时所依赖的配置文件。如配置文件没有在默认的位置。
disable_gpg_check   #是否禁止GPG checking,只用于`present‘ or `latest’。
    disablerepo     #临时禁止使用yum库。 只用于安装或更新时。
    enablerepo      #临时使用的yum库。只用于安装或更新时。
    name=           #所安装的包的名称
state=              #present安装, latest安装最新的, absent 卸载软件。 
update_cache        #强制更新yum的缓存。

service模块:服务程序管理

支持的参数:
arguments         #命令行提供额外的参数   
enabled           #设置开机启动。   
name=             #服务名称   
runlevel          #开机启动的级别,通常不用指定。   
sleep             #在重启服务的过程当中,是否等待。如在服务关闭之后等待2秒再启动。   
state             #started启动 stopped中止 restarted重启reloaded重载配置

例如:启动vsftpd服务,并设置开启自启
ansible web -m service -a "name=vsftpd enabled=yes state=started"

user模块管理

comment           # 用户的描述信息 
createhome        # 是否建立家目录 
force             # 在使用state=absent是, 行为与userdel –force一致. 
group             # 指定基本组 
groups            # 指定附加组,若是指定为(groups=)表示删除全部组 
home              # 指定用户家目录 
move_home         # 若是设置为home=时, 试图将用户主目录移动到指定的目录 
name              # 指定用户名 
non_unique        # 该选项容许改变非惟一的用户ID值 
password          # 指定用户密码 此处指定密码在/etc/shadow里面不是加密的
remove            # 在使用state=absent时, 行为是与userdel –remove一致 
shell             # 指定默认shell 
state             # 设置账号状态,不指定为建立,指定值为absent表示删除 
system            # 当建立一个用户,设置这个用户是系统用户。这个设置不能更改现有用户 
uid               # 指定用户的uid 
update_password   #密码更新模式

例如:建立magedu01用户
ansible web -m user -a "name=magedu01 createhome=yes  password=magedu shell=/bin/sh uid=10001"

group模块

还有一些参数
gid=             # 设置组的GID号 
name=            # 管理组的名称 
state=           # 指定组状态,默认为建立,设置值为absent为删除 
system=          # 设置值为yes,表示为建立系统组

例如建立为tom组:
ansible web -m group -a ‘name=tom state=present’

script模块,在指定节点运行服务端的脚本

例如:
    先编写一个脚本:vim /app/a.txt
    而后再传过去ansible web -m script -a '/app/a.txt'

setup模块,收集信息用的(主要引用变量,加判断用)

facts组件是ansible采集信息的一个功能,可使用setup模块查机器上的素有Facts信息,而后直接调用变量,facts就是变量,内建变量。
ansible playbook:
setup模块,主要用于获取主机信息,在playbooks里常常会用到的一个参数gather_facts就与该模块相关。 
setup模块下常用的一个参数是filter参数,filter是过滤器

例如:
ansible 10.212.52.252 -m setup -a 'filter=ansible_*_mb' //查看主机内存信息 
ansible 10.212.52.252 -m setup -a 'filter=ansible_eth[0-2]' //查看地接口为eth0-2的网卡信息

--tree=    输出的信息保存在文件中
例如:ansible web -m setup -a 'filter=*mem*' - -tree=/app/mem.txt

ansible playbook命令介绍:

  • playbook是ansible用于配置,部署,和管理被控节点的剧本。
  • playbook就是ad-hoc命令的集合,须要大量操做的时候,用playbook更加方便,使用playbook你能够方便的重用这些代码,能够移植到不一样的机器上面,像函数同样 ,最大化的利用代码
  • playbook是由YMAL语言编写的

playbook中主要有三部分组成:

  • hosts部分:主要代表哪一个主机组来运行下面的tasks,每一个playbook都必须指定hosts
  • remote_user部分:指定远端主机中哪一个用户来登陆远端系统,能够任意指定,可是用户执行必须有相应的task的权限
  • tasks部分:指定远端主机将要执行的一系列动做,task的核心是ansible模块,name是可选的,可是建议加上去,还能够给予相应的参数。

playbook的简单配置以下:

例如:安装samba并启动服务
---
- hosts: web
  remote_user: root
  tasks:
      - name: yum install samba
        yum: name=samba state=latest
      - name: start service
        service: name=smb state=started

还能够打标签:(直接运行这个模块)

tags: startsmb
而后直接运行标签处的模块:ansible-playbook a.yml -t startsmb

notify的使用:(配置文件修改须要重新加载)

---
- hosts: web
  remote_user: root
  tasks:
      - name: yum install nginx
        yum: name=nginx state=latest
      - name: copy nginx.conf (推送配置文件)
        copy: src=/app/nginx.conf dest=/etc/nginx/nginx.conf backup=yes
        notify: reload
        tags: reloadnginx
      - name: start nginx
        service: name=nginx state=started
        tags: startnginx
  handlers:
      - name: reload        (与前面notify同样)
        service: name=nginx state=restarted
执行命令:ansible-playbook nginx.yml -t reloadnginx
    至关于打个reloadnginx标签,而后直接指定标签,运行到notify就会触动handlers,就会restarted从启nginx服务。

剧本里面还能直接引用变量:

一、facts:能够直接调用,可以使用setup模块直接获取目标主机的facters

二、用户自定义变量

---
- hosts: web
  remote_user: root
  tasks:
      - name: yum install {{ rpmname }}
        yum: name={{ rpmname }} state=latest
      - name: copy {{ rpmname }}.conf
        copy: src=/app/{{ rpmname }}.conf dest=/etc/{{ rpmname }}/{{ rpmname }}.c
onf backup=yes
        notify: reload
        tags: reload{{ rpmname }}
      - name: start {{ rpmname }}
        service: name={{ rpmname }} state=started
        tags: start{{ rpmname }}
  handlers:
      - name: reload
        service: name={{ rpmname }} state=restarted

执行命令能够直接调用变量:ansible-playbook nginx.yml -e rpmname=vsftpd
也能够直接在剧本里面定义:vars:
                            - rpmname: vsftpd

剧本里面还能够先定义一个模板,而后直接调用变量:

例如nginx:
(1)先把nginx.conf改为nginx.j2(以.j2结尾就行)
(2)而后在nginx.j2里面设置一些变量: 
    worker_processes  {{ ansible_processor_vcpus }};  CPU数量
    listen       {{ nginxport }};        监听端口变量
(3)而后在nginx.yml中配置:(变量能够定义在里面也能够直接-e指定变量)
---
- hosts: web  (主机组)
  remote_user: root            (远程执行命令的用户)
  vars:                        (定义变量)
      - rpmname: nginx         (rpmname变量是nginx)
        nginxport: 8899        (nginxport变量时8899)
  tasks:                       (任务段)
      - name: yum install {{ rpmname }}
        yum: name={{ rpmname }} state=latest    (调用yum模块)
      - name: copy {{ rpmname }}.conf
        template: src=/app/{{ rpmname }}.j2 dest=/etc/nginx/{{ rpmname }}.conf backup=yes          (调用模板,这里不能用copy)
        notify: reload                         (通常和handlers配合使用)
        tags: reload{{ rpmname }}              (定义标签)
      - name: start {{ rpmname }}
        service: name={{ rpmname }} state=started   (调用service模块)
        tags: start{{ rpmname }}               (定义标签)
  handlers:                                    (与前面的notify同样)
      - name: reload
        service: name={{ rpmname }} state=restarted  (触动notify时候调用service模块)
    (4)执行命令:ansible-playbook nginx.yml

剧本里面还可使用循环语句:

when语句:在task中使用,jinja2的语法格式 
tasks: 
    - name: install conf file to centos7 
      template: src=files/nginx.conf.c7.j2 
      when: ansible_distribution_major_version == "7" 
    - name: install conf file to centos6 
      template: src=files/nginx.conf.c6.j2 
      when: ansible_distribution_major_version == "6"
--------判断版本号是7的时候安装c7.j2,是6的时候安装c6.j2-----------

循环:须要重复执行的任务
          对迭代项的引用,固定变量名为“item”,然后在tasks中使用with_items给定要迭代的元素列表

角色定制roles:

  • 对以上的全部方式,有个弊端就是没法实现复用假设在同时部署Web,db,ha时,或者不一样服务器组合不一样的应用就须要写多个yml文件,这样不灵活。
  • roles用于层次性、结构性地组织playbook。roles可以层次型结构自动装载变量文件、tasks以及handlers等。要是用roles只须要在playbook中使用include指令便可。
  • roles就是经过分别将变量(vars)、文件(file)、任务(tasks)、模块 (modules)及处理器(handlers)放置于单独的目录中,并能够便捷地include它们的一种机制

定义角色案例:

一、在/etc/ansible/roles目录下生成对应的目录结构:
    mkdir -pv ./{nginx,mysql,tomcat}/{files,templates,vars,tasks,handlers,meta,default}
二、定义/tasks/main.yml的配置文件
    - name: cp  
      copy: src=nginx-1.10.2-1.el7.ngx.x86_64.rpm  dest=/tmp/nginx-1.10.21.el7.ngx.x86_64.rpm 
    - name: install  
      yum: name=/tmp/nginx-1.10.2-1.el7.ngx.x86_64.rpm  state=latest 
    - name: conf  
      template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf  
      tags: nginxconf  
      notify: new conf to reload  
    - name: start service  
      service: name=nginx state=started enabled=true
三、修改vars/main.yml变量文件
    nginx_port: “8888”
四、定义handlers文件handlers/main.yml 
    - name: new conf to reload  
      service: name=nginx state=restarted   
五、定义/etc/ansible/roles.yml的playbook文件 
    - hosts: nginx  
      remote_user: root  
  roles:    
    - nginx
六、能够经过roles传递变量
    - hosts: nginx  
      remote_user: root  
  roles:    
    - { role: nginx, nginxport: 12345 }
七、也能够配置多个角色

实验:在Tomcat上部署的.war包升级版本的具体步骤

一、在ansible的配置文件中配置.yml剧本
vim war.yml
---
- hosts: web
  remote_user: root
  serial: 1   (一个服务器的task执行完毕在执行另外一个服务器)
  tasks:
      - name: check index.html not ok
        copy: content=no dest=/usr/local/tomcat/webapps/ROOT/check
      - name: sleep
        shell: sleep 10
      - name: stoptomcat
        shell: /usr/local/tomcat/bin/catalina.sh stop
      - name: delete solo.war
        shell: rm -rf /usr/local/tomcat/webapps/solo.war /usr/local/tomcat/webapps/solo
      - name: cp.war
        copy: src=/root/solo-2.2.0.war dest=/usr/local/tomcat/ backup=no
      - name: links
        file: path=/usr/local/tomcat/webapps/solo.war src=/usr/local/tomcat/solo-2.2.0.war state=link
      - name: starttomcat
        shell: /usr/local/tomcat/bin/catalina.sh start
      - name: check index.html ok
        copy: content=ok dest=/usr/local/tomcat/webapps/ROOT/check
二、配置前段haproxy负载均衡器
    vim /etc/haproxy/haproxy.cfg
    frontend http
        bind 172.17.177.177:80
        default_backend webserver

    backend webserver
        balance roundrobin
        option httpchk GET /check
        http-check expect string ok
        server web1 172.17.166.166:8080 check weight 1
    server web2 172.17.155.155:8080 check weight 1
三、配置后端两台Tomcat服务器
四、而后直接在ansible上执行剧本就能够了 ansible-playbook war.yml
相关文章
相关标签/搜索