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

相关推荐

  • 脚本数组及yum软件包管理器

    一、数组 变量:存储单个元素的内存空间 数组:存储多个元素的连续的内存空间,相当于多个变量的集合。 数组名和索引索引:编号从0开始,属于数值索引注意:索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash4.0版本之后开始支持。bash的数组支持稀疏格式(索引不连续) 1.定义数组声明数组:    declare …

    Linux干货 2016-08-25
  • linux文件管理类命令学习总结练习

    1、常用文件管理类命令:cp, mv, rm   cp: copy命令       单元复制 cp [OPTION]… [-T] SOURCE DEST                     DEST不存在…

    Linux干货 2016-11-06
  • 浅述vim操作

    vim是一种比vi更加强大的模式化的全屏文本编辑器。vim在工作过程中有三种模式:编辑模式、插入模式、末行模式。 编辑模式(默认):又称命令模式,其工作内容包括移动光标、剪切、粘贴、删除等 输入模式:亦可称为插入模式,主要是在文件中修改文本内容 末行模式:亦称扩展命令模式,主要是执行vim内置命令的 vim三种模式之间的切换:如下图   (1)编辑…

    Linux干货 2016-08-11
  • 网络管理之配置静态ip和多网卡绑定

    不知怎的,这几天教室的网络异常诡异,各种不稳定啊。原先小编都是通过自动获取(dhcp)的方式来进行网络连接的,现在这种网络情况下需要(static)的方式来配置一个固定的ip。步骤如下: 一、在终端中输入:vim /etc/sysconfig/network-scripts/ifcfg-eth0 二、进行编辑并保存退出 三、重启网络服务:service ne…

    2017-09-10
  • 高级变量-有类型变量

    一.高级变量用法– 有类型变量   Shell 变量一般是无类型的,但是bash Shell 提供了declare和 typeset 两个命令用于指定变量的类型,两个命令是等价的 declare [ 选项]  变量名 -r  将变量设置为只读属性 -i  将变量定义为整型数 -a  将变量定义为数…

    Linux干货 2016-11-24
  • Linux 的shell脚本编程

    shell脚本编程 程序:指令+数据 程序编辑风格:             过程式:以指令为中心,数据服务于指令             对象式:以数据为中心,指令服务于数据 shell程序:提供了编程能力,解释执行 计算机:运行二进制指…

    Linux干货 2016-08-15