ansible运维自动化工具

 

ansible简介

运维工具分类:

        agent:基于专用的agent程序完成管理功能,puppet, func, zabbix, …
        agentless:基于ssh服务完成管理,ansible, fabric, … 

Ansible默认通过  SSH 协议管理机器

 
ansible 架构:
  Ansible Core:absible核心
      Modules:
           Core Modules:内键模块
           Customed Modules:自定义模块
   Host Iventory:主机清单,定义要管理的主机

            可以是Files

             可以是CMDB     

   PlayBooks:定义主机要使用的那些角色      

             Hosts
             roles
  Connection Plugins:连接插件:并发连接默认一次管理5


ansible特性:

                  模块化:调用特定的模块完成特定任务

                  基于Python语言开发,由Paramilo,PYYAMLJinjia2(模板库)单个核心库实现

                  部署简单:agentless

                  强大的playbook机制

                  幂等性,一个playbook可以在同一台主机使用多次,效果一样

                  默认没有server

                  不依赖证书

                  支持任何编程语言编写自动义模块


ansible安装:

    ansible软件包位于epel源中,配置好epel源直接安装即可

    yum install ansible

    安装完成后成程序:
     ansible
     ansible-playbook
     ansible-doc

    ansible主要文件:

        配置文件:
       /etc/ansible/ansible.cfg
      主机清单:
       /etc/ansible/hosts
      插件目录:
       /usr/share/ansible_plugins/

ansible简单使用:

    ansible命令:
       Usage: ansible <host-pattern> [options] 
   常用选项:
    -m MOD_NAME  -a MOD_ARGS


ansible配置


    1、配置基于ssh无密码登录要管理的主机,在ansible管理主机上生成公钥 ssh-keygen -t rsa

        ansible运维自动化工具

       

    2、将生成的公钥发送到要管理主机的家目录中ssh-copy-id root@ip

        2.png

    3、编辑/etc/ansible/hosts文件,配置管理主机清单

       3.png


ansible管理远程主机命令:

   模块:
   获取模块列表:ansible-doc -l
   获取指定模块的使用帮助:ansible-doc -s MOD_NAME



ansible常用模块:

    1、 ping:探测目标主机是否存活;


    ansible运维自动化工具   
 

   2、command:在远程主机执行命令;不支持特性的命令

 

ansible运维自动化工具

ansible运维自动化工具


    
  

 3、shell:在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道等 ;

注意:command和shell模块的核心参数直接为命令本身;而其它模块的参数通常为“key=value”格式;

ansible运维自动化工具

  copy: 用法:
     (1) 复制文件
      -a "src=  dest=  "
     (2) 给定内容生成文件
      -a "content=  dest=  "
      
     其它参数:mode, owner, group, ...

 ansible运维自动化工具

 

file:设置文件属性

    用法:

     (1) 创建目录:

      -a "path=  state=directory"

     (2) 创建链接文件:

      -a "path=  src=  state=link"

     (3) 删除文件:

      -a "path=  state=absent“

ansible运维自动化工具

ansible运维自动化工具

ansible运维自动化工具

fetch:从远程主机拉去文件

ansible运维自动化工具

  
   cron:管理远程主机自动化任务
    -a ""
     minute=
     hour=
     day=
     month=
     weekday=
     job=
     name=
     user=
     
     state={present|absent} present:新建计划任务默认选项  absent:删除计划任务

ansible运维自动化工具

ansible运维自动化工具

ansible运维自动化工具

 
   hostname:管理主机名
    name=

ansible运维自动化工具

  
   yum:yum包管理    -a ""     (1) name=  state={present|latest}  安装包可以使用present或者absent
     (2) name=  state=absent

 ansible运维自动化工具

  
  service:服务启动管理
    -a ""
     name=
     state=
      started
      stopped
      restarted
     enabled=
     runlevel=
  
   group: A d d   o r   r e m o v e   g r o u p s
    -a ""
     name=
     state=
     system=
     gid=
     
   user:M a n a g e   u s e r   a c c o u n t s
    -a ""
     name=
     group=
     groups=
     comment=
     uid=
     system=
     shell=
     expires=
     home=
  
   setup:获取远程主机中信息

 

playbook 编写:

YAML:
   YAML is a data serialization format designed for human readability and  interaction with scripting languages.
   YAML:编程语言
   程序包:PyYAML
   数据结构:

    key:value   
    - item1
    - item2
    - item3
    {name:jerry, age:21}
palybook作用:
   将远程操作的命令通过YAML语言编写脚本,通过执行脚本完成操作
   
PlayBook:

   核心元素:

    Tasks:任务,由模块定义的操作的列表;

    Variables:变量

    Templates:模板,即使用了模板语法的文本文件;

    Handlers:由特定条件触发的Tasks;

    Roles:角色;

    

 playbook的基础组件:

   Hosts:运行指定任务的目标主机;
   remote_user:在远程主机以哪个用户身份执行;
   sudo_user:非管理员需要拥有sudo权限;

    
        
  运行playbook:
       运行playbook,使用ansible-playbook命令

    (1) 检测语法

     ansible-playbook  --syntax-check  /path/to/playbook.yaml

    (2) 测试运行

     ansible-playbook -C /path/to/playbook.yaml

      --list-hosts

      --list-tasks

      --list-tags
   (3) 运行

     ansible-playbook  /path/to/playbook.yaml

      -t TAGS, --tags=TAGS  :只运行某TAGS的命令

      --skip-tags=SKIP_TAGS

      --start-at-task=START_AT    
   

      

    示例:

    - hosts: websrvs

      remote_user: root

      tasks:

      - name: install httpd package

         yum: name=httpd state=latest

       - name: install conf file

         copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf

         notify: restart httpd service

        - name: start httpd service

        service: name=httpd state=started

      handlers:

        - name: restart httpd service

       service: name=httpd state=restarted


playbook  tasks创建实例:

大写的注意:注意脚本之间的缩进,缩进错误也会包语法错误,缩进为2个字符


 tasks:任务列表
      模块,模块参数:
       格式:
        (1) action: module arguments
        (2) module: arguments


 1、给webservers组中的所有主机创建grp组,和用户mygrp ,并所属组为grp

 

ansible运维自动化工具

2、给所有的webservers组中的主机安装web服务,并启动端口为8080
    注意:保障每个主机中的yum源配置
    方法一:在ansible主机中编译httpd.conf文件,将端口改成8080,并将httpd.conf文件复制给每个主机
    (注意:此方法适应于相同版本的应用程序,否则配置文件不听可能会出错)
    方法二:不同版本之间可以用命令直接更改

20.png     

 

 

21.png

 

playbook  handlers介绍及实例:

  handlers:由特定条件触发的Tasks;
    调用及定义方式:
    tasks:
    - name: TASK_NAME
      module: arguments
      notify: HANDLER_NAME
    handlers:
    - name: HANDLER_NAME
      module: arguments
3、出发操作,httpd配置文件发生变化时,执行restart命令

 

22.png

playbook  tags语法及实例:

 

tags:给指定的任务定义一个调用标识;指在tasks中定义,在handlers中定义不生效
    - name: NAME
      module: arguments
      tags: TAG_ID
              
4、定义重启操作标签切restart ,下次启动时可以直接执行重启,而不执行其他脚本中的任务

23.png24.png

 

playbook  vaiable语法以及实例:

 
 Variables:
    类型
     内建:
      (1) facts
    自定义:
      (1) 命令行传递;
        -e VAR=VALUE
      (2) 在hosts Inventory(清单)中为每个主机定义专用变量值;
         (a) 向不同的主机传递不同的变量 ;
          IP/HOSTNAME variable_name=value
       (b) 向组内的所有主机传递相同的变量 ;
        [groupname:vars]
        variable_name=value
      (3) 在playbook中定义
         vars:
         - var_name: value
         vars:
         - var_name: value
      (4) Inventory还可以使用参数:

       用于定义ansible远程连接目标主机时使用的属性,而非传递给playbook的变量;
        ansible_ssh_host  :指定ansible远程连接主机使用的哪个ip地址
        ansible_ssh_port  :指定ansible远程连接主机使用的哪个端口
        ansible_ssh_user
        ansible_ssh_pass
        ansible_sudo_pass

      (5) 在角色调用时传递
       roles:
       - { role: ROLE_NAME, var: value, ...}

    变量调用:
      {{ var_name }}
    注意::-e传递的变量值会覆盖playbook和hosts传递的变量值
      
 实例:    
 5、而根据不同主机安装和卸载不同的程序包

 

      

   
   ※编写脚本vim /root/bin/install.yaml

    25.png

  
   ※通过执行脚本传递参数

26.png

   
   ※通过/etc/absible/hosts传递参数,

ansible运维自动化工具

ansible运维自动化工具

  
  ※通过playbook中传递参数

30.png

 

playbook Templates 语法以及使用:

  
  什么是模板:文本文件,内部嵌套有模板语言脚本(使用模板语言编写)
  编写语言:jinja2
  语法:
     字面量:
     字符串:使用单引号或双引号; 
      数字:整数、浮点数;
      列表:[item1, item2, ...] 
      元组:(item1, item2, ...) 是一个不可变类型
      字典:{key1:value1, key2:value2, ...} :以键值对队存储数据
      布尔型:true/false
  
     算术运算:
      +, -, *, /, //, %, **

     比较操作:
      ==, !=, >, <, >=, <=
     逻辑运算:and, or, not 
  
     执行模板文件中的脚本,并生成结果数据流,需要使用template模块;
     template:
      -a ”“
       src=
       dest=
       mode=
       onwer=
       group=

     注意:此模板不能在命令行使用,而只能用于playbook;
     
     
     示例:
     题目:将nginx安装到ngxsrvs组中的服务器中,并启动nginx,启动时的wordpress为cpu核心数
     思路:每台主机的cup核心数不同,要完成操作,就必须用变量代表,ansible内嵌了ansible_process_vpus
     变量,可获取每台主机的cpu核心数
     步骤:  
     1、 在ansible主机中安装nginx为了生成nginx.conf文件
     2、更改配置文件nginx.conf文件worker_processes {{ ansible_processes_vpus }};
     3、复制文件到/root/目录下并更改名称为/etc/nginx.conf.j2
     4、编写脚本 :installnginx.yaml
      - hosts: ngxsrvs
      remote_user: root
      tasks:
      - name: install nginx package
      yum: name=nginx state=latest
      - name: install conf file
      template: src=/root/nginx.conf.j2 dest=/etc/nginx/nginx.conf
      tags: ngxconf
      notify: reload nginx service
      - name: start nginx service
      service: name=nginx state=started enabled=true
      handlers:
      - name: reload nginx service
      shell: /usr/sbin/nginx -s reload       

   条件测试:
    when语句:在tasks中使用,Jinja2的语法格式;
     -  hosts: all
     remote_user: root
     tasks:
     - name: install nginx package
     yum: name=nginx state=latest
     - name: start nginx service on CentOS6
     shell: service nginx start
     when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "6"
     - name: start nginx service
     shell: systemctl start nginx.service
     when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "7"     

   循环:迭代,需要重复执行的任务;

    对迭代项的引用,固定变量名为"item”,使用with_item属性给定要迭代的元素;
     元素:列表
      字符串
      字典     
   基于字符串列表给出元素示例:
    - hosts: websrvs
      remote_user: root
      tasks:
      - name: install packages
        yum: name={{ item }} state=latest
        with_items:
        - httpd
        - php
        - php-mysql
        - php-mbstring
        - php-gd

        

    基于字典列表给元素示例:
      -  hosts: all
      remote_user: root
      tasks:
      - name: create groups
      group: name={{ item }} state=present
      with_items:
      - groupx1
      - groupx2
      - groupx3
      - name: create users
      user: name={{ item.name }} group={{ item.group }} state=present
      with_items:
      - {name: 'userx1', group: 'groupx1'}
      - {name: 'userx2', group: 'groupx2'}
      - {name: 'userx3', group: 'groupx3'}

ansible roles语法和使用:

 

角色:roles

   角色概念:以特定的层级目录结构进行组织的tasks、variables、handlers、templates、files等,方便调用;
    role_name/:角色名称,例如安装httpd,在/etc/ansible/roles中常见httpd文件,在httpd文件中常见以下的目录。httpd则为角色名

     files/:存储由copy或script等模块调用的文件; 
     tasks/:此目录中至少应该有一个名为main.yml的文件,用于定义各task;其它的文件需要由main.yml进行“包含”调用;
     handlers/:此目录中至少应该有一个名为main.yml的文件,用于定义各handler;其它的文件需要由main.yml进行“包含”调用;
     vars/:此目录中至少应该有一个名为main.yml的文件,用于定义各variable;其它的文件需要由main.yml进行“包含”调用;
     templates/:存储由template模块调用的模板文本;
     meta/:此目录中至少应该有一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要由main.yml进行“包含”调用;
     default/:此目录中至少应该有一个名为main.yml的文件,用于设定默认变量;

   ansible中角色默认存放路径为:/etc/ansible/roles中
   更改角色路径:便捷/etc/ansible/ansible.cfg
   roles_path=/path/to/somefile
     
   在playbook中调用角色的方法:
   - hosts: HOSTS
      remote_user: USERNAME
      roles:
      - ROLE1:角色名
      - ROLE2
      - { role: ROLE3, VARIABLE: VALUE, ...} :在调用角色的同时传递参数
      - { role: ROLE4, when: CONDITION }:在调用角色的同时给出条件
  
  角色实用实战:
  利用角色安装memcache,并将启动的内存设置为总内存的4分之一
  步骤一:
  1、创建memcache角色
    mkdir /etc/ensible/roles/memcached 
  2、在memcached创建tasks 和templates文件
  3、在tasks文件中创建main.yml文件
  4、修改memcache配置文件/etc/sysconfig/memcached文件并将文件拷贝到/etc/ansible/roles/memcahced/templates中,重名为为
  memcahced.conf.j2
  5、编写playbook调用此角色

1、main.yml 和 playbook文件

 

ansible运维自动化工具

ansible运维自动化工具

 

原创文章,作者:wangnannan,如若转载,请注明出处:http://www.178linux.com/57578

(1)
wangnannanwangnannan
上一篇 2016-11-10
下一篇 2016-11-11

相关推荐

  • Linux文本处理三剑客之awk详解

    前言 awk是一款强大的报告生成器,不同于sed和grep,它的侧重点是如何把文本信息更好的展示出来,常用与统计和格式化输出。awk相当于微型的shell,有着自己一套语法结构,例如:循环结构,数组,条件判断,函数,内置变量等功能。处理对象一般纯文本文件或纯文本信息。 用法详解 基本语法 awk [options] 'progra…

    Linux干货 2015-04-29
  • 高可用集群基本概念与heartbeat文本配置接口

    一、高可用集群基本概念:     什么是高可用集群:          所谓高可用集群,就是在出现故障时,可以把业务自动转移到其他主机上并让服务正常运行的集群构架     高可用集群的构架层…

    Linux干货 2016-01-13
  • Linux权限管理练习

    1、当用户xiaoming对/testdir 目录无执行权限时,意味着无法做哪些操作? 无法cd切换进入此目录,无法创建文件,无法删除文件,无法查看里面文件的内容,只能ls列出目录下的内容 2、当用户xiaoqiang对/testdir 目录无读权限时,意味着无法做哪些操作? 无法ls查看目录下的内容 3、当用户wangcai 对/testdir 目录无写权…

    Linux干货 2016-08-05
  • 虚拟主机的实现

    示例1:基于ip 编辑配置文件,切换到最后一行,增加: <VirtualHost 192.168.1.117:80>     ServerName web1.ams.com     DocumentRoot "/vhosts/web1/htdocs" </VirtualHost&g…

    Linux干货 2016-08-05
  • 一起学WINS系列(三)界面、概览

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://jeffyyko.blog.51cto.com/28563/159542 上节我们讨论了有关WINS服务器的安装,本节将开始讨论WINS配置等内容。 一般情况下,我们可以在控制面板的管理工具中找到WINS,或者在【运行】内…

    Linux干货 2015-03-25
  • nginx模块–proxy,upstream,header,stream

    ngx_http_proxy_module     proxy模块的作用:将请求传递给对应的服务器     示例:     location / {        &nb…

    Linux干货 2016-10-29