zoukankan      html  css  js  c++  java
  • 运维自动化ansible基础

    云计算三种服务架构

       IAAS:

                  不提供OS  只购买硬件(网络,存储,计算)

       PAAS:

                  提供硬件和OS和开发和运行环境  只需要开发应用软件

       SAAS:

                  提供 硬件 os 软件   相当于直接购买软件

    Ansible介绍

         1.有Paramiko,PyYAML,Jinja2(模板语言)三个关键模块 

         2.部署简单,基于python和SSH(默认已安装),agentless 

         3.支持playbook编排任务 编排定义Ansible任务集的配置 文件,由Ansible顺序依次执行,通常是JSON格式的YML文件 

         4.幂等性: 一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况 

    主机清单inventory

        ansible只有首先配置好主机清单才能够管理其它主机,如果没有配置ansible将无法管理任何主机

        默认的inventory file 为   /etc/ansible/hosts

        inventory file可以有多个,且也可以通过Dynamic Inventory来动态生成 

    Ansible执行命令流程

     ansible命令执行过程  

        1. 加载自己的配置文件 默认/etc/ansible/ansible.cfg

        2. 加载自己对应的模块文件,如command

        3. 通过ansible将模块或命令生成对应的临时py文件,并将该 文件传输至远程服务器 的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件 

        4. 给文件+x执行 

        5. 执行并返回结果 

        6. 删除临时py文件,sleep 0退出

        执行状态:

             绿色:执行成功并且不需要做改变的操作

             黄色:执行成功并且对目标主机做变更

             红色:执行失败 

    Ansible的安装和基本模块的使用

    [root@localhost ~]# yum install ansible
    [root@localhost ~]# ansible --version
    ansible 2.5.3
      config file = /etc/ansible/ansible.cfg
      configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
      ansible python module location = /usr/lib/python2.7/site-packages/ansible
      executable location = /usr/bin/ansible
      python version = 2.7.5 (default, Aug  4 2017, 00:39:18) [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)]
    [root@localhost ~]# vi /etc/ansible/hosts
    [root@localhost ~]# ansible 192.168.231.7 -m ping -k
    SSH password: 
    192.168.231.7 | SUCCESS => {
        "changed": false, 
        "ping": "pong"
    }
    [root@localhost .ssh]# ansible webservers -m ping -k
    SSH password: 
    192.168.231.7 | SUCCESS => {
        "changed": false, 
        "ping": "pong"
    }
    [root@localhost .ssh]# ansible 192.168.231.7  -vvv -m ping -k
     # -vvv 输出ansible操作的详细信息,可以当作调试日志
    [root@localhost .ssh]# ssh-keygen
    [root@localhost .ssh]# ssh-copy-id 192.168.231.7
    [root@localhost .ssh]# ansible all -m command -a 'ss -ntul'
    #command模块不支持命令管道(|),重定向(>),变量($HOSTNAME)
    [root@localhost .ssh]# ansible all -m shell -a 'echo $HOSTNAME'
    [root@localhost .ssh]# ansible all -m shell -a 'echo "333">1ansible.aaa'
    192.168.231.7 | SUCCESS | rc=0 >>
    [root@localhost .ssh]# ansible all  -a 'echo "333">1ansible.aaa'
    192.168.231.7 | SUCCESS | rc=0 >>
    333>1ansible.aaa
    [root@localhost ~]# ansible all -m fetch -a 'src=/root/guess.sh dest=/root'
    #owner  mode
    #fetch 只能拉取文件,不能拉取目录或者匹配通配符
    192.168.231.7 | SUCCESS => {
        "changed": true, 
        "checksum": "656427f4ebbcbb4745fa80fbffc456b88378c4ed", 
        "dest": "/root/192.168.231.7/root/guess.sh", 
        "md5sum": "435fe28b40aa89a35f9dc63c7063b1a7", 
        "remote_checksum": "656427f4ebbcbb4745fa80fbffc456b88378c4ed", 
        "remote_md5sum": null
    }
    [root@localhost ~]# ansible all -m file -a 'name=/root/yxh state=directory'
    #file模块包括对文件夹的操作
    #file不能删除使用通配符批量删除目录下的文件,只能删除整个目录
    [root@localhost ~]# ansible all -m shell -a 'rm -fr /data/*'
    View Code

    YAML语法简介 

       使用#号注释代码

       缩进必须是统一的,不能空格和tab混用

       缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的 

       YAML文件内容和Linux系统大小写判断方式保持一致,是区别大小写的,k/v的值均需大小写敏感 

       k/v的值可同行写也可换行写,同行使用:分隔

       v可是个字符串,也可是另一个列表 

       一个完整的代码块功能需最少元素需包括 name: task 

       一个name只能包括一个task

       YAML文件扩展名通常为yml或yaml 

       List:   列表,其所有元素均使用  "-"   打头 

       Dictionary:   字典,通常由多个key与value构成      skill: Elite

       也可以将key:value放置于{}中进行表示,   用,分隔多个key:value    {name: Example Developer, job: Developer, skill: Elite} 

       YAML的语法和其他高阶语言类似,并且可以简单表达清单、散列表、标量等数据结构.

       其结构(Structure)通过空格来展示,序列(Sequence)里的项用 "-" 来代表,Map里的键值对用":"分隔 

       children:       children表示一个序列,   name 和 age 表示序列中的一个数据项

         -   name: Jimmy Smith         

             age: 17       

         -   name: Jenny Smith       

            age 13        

     Playbook介绍

         playbook是由一个或多个  "play" 组成的列表

         play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色.

         所谓task无非是调用ansible的一个module. 将多个play组织在一个playbook中,即可以让它们联同起来按事先编排的机制顺序执行

        playbook变量介绍

         1.普通(主机)变量   在inventory中定义主机时为其添加主机变量以便于在playbook中使用 

              [websrvs]

             192.168.99.101   http_port=8080  hname=www1

             192.168.99.102   http_port=80       hname=www2 

         2.组变量    组变量是指赋予给指定组内所有主机上的在playbook中可用的变量         

              [websrvs]

              www1.magedu.com

              www2.magedu.com

             [websrvs:vars]

             ntp_server=ntp.magedu.com

             nfs_server=nfs.magedu.com

         3.命令行指定变量       

             ansible  websvrs  –e http_port=8000 –m hostname  –a  'name={{ hname }}{{ mark }}{{ http_port }}'

         4.在playbook中定义

             vars:

                 - var1: value1

                 - var2: value2 

          5.单独使用一个yaml文件定义所有的变量 

            vi    myvars.yaml    

                  var1: httpd
                  var2: vsftpd
                  var3: nginx

          vi   playbook.yaml

              vars_files:

                 -  myvars.yaml

              task:

                 - name:  install {{  var1  }} package

          6.在role中定义 

        变量的优先级

               1. 通过命令行指定变量,优先级最高            ansible-playbook –e varname=value 

               2. 在playbook中定义的变量

               3.普通(主机)变量: 主机组中主机单独定义,优先级高于公共变量 

               4.公共(组)变量: 针对主机组中所有主机定义统一变量   优先级最低

        变量的调用方式

              通过  {{ variable_name }}  调用变量,且变量名前后必须有空格,有时用  "{{ variable_name }}" 才生效 

       

    yaml文件中的缩进是非常重要的,同一级别的必须写到同一个缩进,否则程序无法运行
    yaml里面的task是按照次序依次执行,不会出现执行顺序不同的问题
    一个name只能包含一个task(命令模块)
    #按照指定的task的顺序依次执行
    #ansible的task中相对路径是相对于当前yaml文件的所在目录
    [root@localhost playbook]# ansible-playbook test2.yaml 
    
    PLAY [webservers] ***************************************************************************************
    
    TASK [Gathering Facts] **********************************************************************************
    ok: [192.168.231.7]
    
    TASK [create new file] **********************************************************************************
    changed: [192.168.231.7]
    
    TASK [create new user] **********************************************************************************
    changed: [192.168.231.7]
    
    TASK [copy file] ****************************************************************************************
    changed: [192.168.231.7]
    
    TASK [start httpd] **************************************************************************************
    changed: [192.168.231.7]
    
    PLAY RECAP **********************************************************************************************
    192.168.231.7              : ok=5    changed=4    unreachable=0    failed=0   
    
    [root@localhost playbook]# ansible-playbook test2.yaml --list-tasks
    
    playbook: test2.yaml
    
      play #1 (webservers): webservers    TAGS: []
        tasks:
          create new file    TAGS: []
          create new user    TAGS: []
          copy file    TAGS: []
          start httpd    TAGS: []
    [root@yxh6 conf]# netstat -ntlp | grep httpd
    tcp        0      0 :::9527                     :::*                        LISTEN      8013/httpd   
    
    
    
    ---
    - hosts: webservers
      remote_user: root
    
      tasks:
        - name: install httpd pagckage
          yum: name=httpd
          tags: installhttpd
        - name: copy conf file action
          copy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=yes
          notify: restart httpd service
        - name: start httpd service
          service: name=httpd state=started enabled=yes
          tags: rshttpd
    playbook执行顺序
    #tags inshttpd,rshttpd
    #通过ansible命令单独执行指定标签的task action命令,而不是执行整个playbook.
    #多个action可以共用一个标签
    [root@localhost playbook]# ansible-playbook -t inshttpd,rshttpd handler.yaml
    
    ---
    - hosts: webservers
      remote_user: root
    
      tasks:
        - name: install httpd pagckage
          yum: name=httpd
          tags: installhttpd
        - name: copy conf file action
          copy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=yes
          notify: restart httpd service
        - name: start httpd service
          service: name=httpd state=started enabled=yes
          tags: rshttpd
    playbook标签
    #ansible收集主机信息,同时也可以做为变量传递给playbook中
    [root@localhost playbook]# ansible webservers -m setup
    [root@localhost playbook]# ansible webservers -m setup -a 'filter=*address*'
    #playbook中自定义变量{{ bialiangmin }}
      tasks:
        - name: install {{ packname }}  pagckage
          yum: name={{ packname }}
          tags: installhttpd
    
    #执行的时候传递变量值
    [root@localhost playbook]# ansible-playbook -e 'packname=vsftpd' bianliang.yaml 
    [root@localhost playbook]# ansible-playbook -e 'packname=vsftpd packname2=redis' bianliang.yaml 
    
    PLAY [webservers] ***************************************************************************************
    
    TASK [Gathering Facts] **********************************************************************************
    ok: [192.168.231.6]
    
    TASK [install vsftpd  pagckage] *************************************************************************
    changed: [192.168.231.6]
    
    PLAY RECAP **********************************************************************************************
    192.168.231.6              : ok=2    changed=1    unreachable=0    failed=0   
    
    变量使用的第二种方式:
    - hosts: webservers
      remote_user: root
      vars:
        - packname: httpd
        - packname2: vsftpd
    
    变量使用的第三种方式
      在/etc/ansible/hosts中定义
    playbook变量
     1 ---
     2 - hosts: webservers
     3   remote_user: root
     4 
     5   tasks:
     6     - name: install httpd pagckage
     7       yum: name=httpd
     8       tags: installhttpd
     9     - name: copy conf file action
    10       copy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=yes
    11       notify: restart httpd service
    12     - name: start httpd service
    13       service: name=httpd state=started enabled=yes
    14       tags: rshttpd
    15 
    16   #handlers必须和notify配合使用,两者不能分开使用
    17   handlers:
    18     - name: restart httpd service
    19       service: name=httpd state=restarted
    20     - name: testaction
    21       shell: ls            
    playbook案例
  • 相关阅读:
    The OpenGL pipeline
    HLS协议实现
    用C++设计一个不能被继承的类
    Ansible@一个高效的配置管理工具--Ansible configure management--翻译(八)
    史上最简单的软件破解——5行脚本代码完美破解99%的过期软件
    oracle11g创建新的用户和改动最大连接数
    【SICP感应】1 工艺和替代模式
    ant利用先进,ant订单具体解释,ant包,ant包装删除编译jar文件
    SqlServer表EXCEL数据复制的另一种方法
    【摘要干】如何执飞前写商业计划?
  • 原文地址:https://www.cnblogs.com/yxh168/p/9096694.html
Copyright © 2011-2022 走看看