• 第十五节


    ansible简介

    Ansible目前是运维自动化工具中最简单、容易上手的一款优秀软件,能够用来管理各种资源,用户可以使用Ansible自动部署应用程序,以此实现IT基础架构的全面部署。

    Ansible基于SSH远程会话协议,不需要客户端程序,只要知道受管主机的账号密码,就能直接用SSH协议进行远程控制,因此使用起来优势明显。

      Ansible服务专用术语对照表

    术语 中文叫法 含义
    Control node 控制节点 指的是安装了Ansible服务的主机,也被称为Ansible控制端,主要是用来发布运行任务、调用功能模块,对其他主机进行批量控制。
    Managed nodes 受控节点 指的是被Ansible服务所管理的主机,也被称为受控主机或客户端,是模块命令的被执行对象。
    Inventory 主机清单 指的是受控节点的列表,可以是IP地址、主机名称或者域名。
    Modules 模块 指的是上文提到的特定功能代码,默认自带有上千款功能模块,在Ansible Galaxy有超多可供选择。
    Task 任务 指的是Ansible客户端上面要被执行的操作。
    Playbook 剧本 指的是通过YAML语言编写的可重复执行的任务列表,把常做的操作写入到剧本文件中,下次可以直接重复执行一遍。
    Roles 角色 从Ansible 1.2版本开始引入的新特性,用于结构化的组织Playbook,通过调用角色实现一连串的功能。

    安装ansible

    RHEL 8系统的镜像文件默认不带有Ansible服务程序,需要从Extra Packages for Enterprise Linux(EPEL)扩展软件包仓库获取。EPEL软件包仓库由红帽公司提供,是一个用于创建、维护和管理企业版Linux的高质量软件扩展仓库,通用于RHEL、CentOS、Oracle Linux等多种红帽系企业版系统,目的是对于默认系统仓库软件包进行扩展。红帽红帽EPEL地址:baseurl=https://dl.fedoraproject.org/pub/epel/8/Everything/x86_64/

    1.配置yum仓库添加epel源

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    [root@linuxprobe ~]# vim /etc/yum.repos.d/rhel.repo
    [BaseOS]
    name=BaseOS
    baseurl=file:///media/cdrom/BaseOS
    enabled=1
    gpgcheck=0
     
    [AppStream]
    name=AppStream
    baseurl=file:///media/cdrom/AppStream
    enabled=1
    gpgcheck=0
     
    [EPEL]
    name=EPEL
    baseurl=https://dl.fedoraproject.org/pub/epel/8/Everything/x86_64/
    enabled=1
    gpgcheck=0

    2.安装ansible

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    [root@linuxprobe ~]# dnf install -y ansible
    Updating Subscription Management repositories.
    Unable to read consumer identity
    This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
    Last metadata expiration check: 0:01:31 ago on Sun 04 Apr 2021 02:23:32 AM CST.
    Dependencies resolved.
    ===========================================================================================
     Package                          Arch             Version            Repository        Size
    ===========================================================================================
    Installing:
     ansible                          noarch           2.9.18-2.el8       EPEL               17 M
    Installing dependencies:
     python3-babel                    noarch           2.5.1-3.el8        AppStream         4.8 M
     python3-jinja2                   noarch           2.10-9.el8         AppStream         537 k
     python3-jmespath                 noarch           0.9.0-11.el8       AppStream          45 k
     python3-markupsafe               x86_64           0.23-19.el8        AppStream          39 k
     python3-pyasn1                   noarch           0.3.7-6.el8        AppStream         126 k
     libsodium                        x86_64           1.0.18-2.el8       EPEL              162 k
     python3-bcrypt                   x86_64           3.1.6-2.el8.1      EPEL               44 k
     python3-pynacl                   x86_64           1.3.0-5.el8        EPEL              100 k
     sshpass                          x86_64           1.06-9.el8         EPEL               27 k
    Installing weak dependencies:
     python3-paramiko                 noarch           2.4.3-1.el8        EPEL              289 k
     
    Transaction Summary
    ===========================================================================================
    Install  11 Packages
     
    ………………省略部分输出信息…………
     
    Installed:
      ansible-2.9.18-2.el8.noarch            python3-paramiko-2.4.3-1.el8.noarch
      python3-babel-2.5.1-3.el8.noarch       python3-jinja2-2.10-9.el8.noarch
      python3-jmespath-0.9.0-11.el8.noarch   python3-markupsafe-0.23-19.el8.x86_64
      python3-pyasn1-0.3.7-6.el8.noarch      libsodium-1.0.18-2.el8.x86_64                 
      python3-bcrypt-3.1.6-2.el8.1.x86_64    python3-pynacl-1.3.0-5.el8.x86_64
      sshpass-1.06-9.el8.x86_64                        
     
    Complete!

    3.检查安装信息

    安装完毕后,Ansible服务便默认已经启动。使用--version参数可以看到Ansible服务的版本及配置信息。

    1
    2
    3
    4
    5
    6
    7
    [root@linuxprobe ~]# ansible --version
    ansible 2.9.18
      config file /etc/ansible/ansible.cfg
      configured module search path = ['/root/.ansible/plugins/modules''/usr/share/ansible/plugins/modules']
      ansible python module location = /usr/lib/python3.6/site-packages/ansible
      executable location = /usr/bin/ansible
      python version = 3.6.8 (default, Jan 11 2019, 02:17:16) [GCC 8.2.1 20180905 (Red Hat 8.2.1-3)]

    设置主机清单

    Ansible服务的主配置文件存在优先级的顺序关系,默认存放在/etc/ansible目录中的主配置文件优先级最低。如果在当前目录或用户家目录中也存放着一份主配置文件,则以当前目录或用户家目录中的主配置文件为主。同时存在多个Ansible服务主配置文件时,具体优先级顺序如表所示。 

    Ansible服务主配置文件优先级顺序 

    优先级 文件位置
    ./ansible.cfg
    ~/.ansible.cfg
    /etc/ansible/ansible.cfg

    inventory主机清单的配置文件为/etc/ansible/hosts,将受控主机加入主机清单从而实现集中控制。设置主机清单时可以根据实际环境设置不同的分组,从而实现分组控制。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [root@superwu ~]# <strong>vim /etc/ansible/hosts</strong>
    [dev]              //名称为dev的组
    192.168.10.20
    [test]
    192.168.10.21
    [prod]            //名称为prod的组
    192.168.10.22
    192.168.10.23
    [balancers]
    192.168.10.24
    <strong>[all:vars]</strong>       //all表示所有主机,vars表示变量(以下设置对所有主机生效),表示使用ansible时默认使用的用户和密码(自动验证)
    <strong>ansible_user=</strong>root     //登录使用的账号
    <strong>ansible_password=</strong>111111   //账号密码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [root@superwu ~]#<strong> ansible-inventory --graph</strong>  //以结构化的方式显示受管的主机信息
    @all:
      |--@balancers:
      |  |--192.168.10.24
      |--@dev:
      |  |--192.168.10.20
      |--@prod:
      |  |--192.168.10.22
      |  |--192.168.10.23
      |--@test:
      |  |--192.168.10.21
      |--@ungrouped:

    运行临时命令

    Ansible服务的强大之处在于只需要一条命令,便可以操控成千上万台的主机节点,而ansible命令便是最得力的工具之一。

    Ansible服务实际上只是一个框架,能够完成工作的是模块化功能代码,ansible-doc命令可以查询模块信息。

    ansible是用于执行临时任务的命令,也就在是执行后即结束(与剧本文件的可重复执行不同)。在使用ansible命令时,必须指明受管主机的信息,如果已经设置过主机清单文件(/etc/ansible/hosts),则可以使用all参数来指代全体受管主机,或是用dev、test等主机组名称来指代某一组的主机。

    ansible命令常用的语法格式为“ansible 受管主机节点 -m 模块名称 [-a 模块参数]”,其中,-a是要传递给模块的参数,只有功能极其简单的模块才不需要额外参数,所以大多情况下-m与-a参数都会同时出现。

    如果想实现某个功能,但是却不知道用什么模块,又或者是知道了模块名称,但不清楚模块具体的作用,则建议使用ansible-doc命令进行查找。

    查询模块信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    [root@linuxprobe ~]# <strong>ansible-doc -l</strong> <strong> //列出所有模块信息</strong>
    a10_server                                           Manage A10 Networks AX/SoftAX/Thunder/v...
    a10_server_axapi3                                    Manage A10 Networks AX/SoftAX/Thunder/v...          
    a10_service_group                                    Manage A10 Networks AX/SoftAX/Thunder/v...
    a10_virtual_server                                   Manage A10 Networks AX/SoftAX/Thunder/v...
    aci_aaa_user                                         Manage AAA users (aaa:User)                                             
    aci_aaa_user_certificate                             Manage AAA user certificates (aaa:User...                       
    aci_access_port_block_to_access_port                 Manage port blocks of Fabric interface ...
    aci_access_port_to_interface_policy_leaf_profile     Manage Fabric interface policy leaf pro...
    aci_access_sub_port_block_to_access_port             Manage sub port blocks of Fabric interf...
    aci_aep                                              Manage attachable Access Entity Profile...
    aci_aep_to_domain                                    Bind AEPs to Physical or Virtual Domain...  
    aci_bd_subnet                                        Manage Subnets (fv:Subnet)                
    ………………省略部分输出信息………………
    1
    2
    3
    4
    5
    6
    7
    [root@linuxprobe ~]#<strong> ansible-doc a10_server  //查看模块的具体信息</strong>
    > A10_SERVER    (/usr/lib/python3.6/site-packages/ansible/modules/network/a10/a10_server.py)
     
         Manage SLB (Server Load Balancer) server objects on A10 Networks devices via aXAPIv2.
     
      * This module is maintained by The Ansible Community
    ………………省略部分输出信息………………
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    [root@linuxprobe ~]#<strong> ansible all -m ping  //对所有主机执行ping模块</strong>
    192.168.10.20 | SUCCESS => {
        "ansible_facts": {
            "discovered_interpreter_python""/usr/libexec/platform-python"
        },
        "changed"false,
        "ping""pong"
    }
    192.168.10.21 | SUCCESS => {
        "ansible_facts": {
            "discovered_interpreter_python""/usr/libexec/platform-python"
        },
        "changed"false,
        "ping""pong"
    }
    192.168.10.22 | SUCCESS => {
        "ansible_facts": {
            "discovered_interpreter_python""/usr/libexec/platform-python"
        },
        "changed"false,
        "ping""pong"
    }
    192.168.10.23 | SUCCESS => {
        "ansible_facts": {
            "discovered_interpreter_python""/usr/libexec/platform-python"
        },
        "changed"false,
        "ping""pong"
    }192.168.10.24 | SUCCESS => {
        "ansible_facts": {
            "discovered_interpreter_python""/usr/libexec/platform-python"
        },
        "changed"false,
        "ping""pong"
    }

    使用ansible安装yum仓库

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [root@linuxprobe ~]# ansible all -m yum_repository -a 'name="EX294_BASE" description="EX294 base software" baseurl="file:///media/cdrom/BaseOS" gpgcheck=yes enabled=1 gpgkey="file:///media/cdrom/RPM-GPG-KEY-redhat-release"'
     
    192.168.10.20 | CHANGED => {
        "ansible_facts": {
            "discovered_interpreter_python""/usr/libexec/platform-python"
        },
        "changed"true,
        "repo""EX294_BASE",
        "state""present"
    }

    使用-m参数直接指定模块名称,用-a参数将参数传递给模块,让模块的功能更高级。

    剧本ansible-playbook

    在很多情况下,仅仅执行单个命令或调用某一个模块,根本无法满足复杂工作的需要。Ansible服务允许用户根据需求,在类似于Shell脚本的模式下编写自动化运维脚本,然后由程序自动、重复地执行,从而大大提高了工作效率。

    Ansible服务的剧本(playbook)文件采用YAML语言编写,具有强制性的格式规范,它通过空格将不同信息分组,因此有时会因一两个空格错位而导致报错。

    YAML文件的开头需要先写3个减号(---),多个分组的信息需要间隔一致才能执行,而且上下也要对齐,后缀名一般为.yml。剧本文件在执行后,会在屏幕上输出运行界面,内容会根据工作的不同而变化。在运行界面中,绿色表示成功,黄色表示执行成功并进行了修改,而红色则表示执行失败

    YAML语言编写的Ansible剧本文件会按照从上到下的顺序自动运行,其形式类似于Shell脚本,但格式有严格的要求。

    剧本文件的结构由4部分组成,分别是target、variable、task、handler,其各自的作用如下。 

    target:用于定义要执行剧本的主机范围。

    variable:用于定义剧本执行时要用到的变量。

    task:用于定义将在远程主机上执行的任务列表。

    handler:用于定义执行完成后需要调用的后续任务。

    示例1

    创建一个名为packages.yml的剧本,让dev、test和prod组的主机可以自动安装数据库软件,并且将dev组主机的软件更新至最新。

    查看模块帮助信息

    安装和更新软件需要使用yum模块。先看一下帮助信息中的示例吧:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    [root@linuxprobe ~]# <strong>ansible-doc yum</strong>
    > YUM    (/usr/lib/python3.6/site-packages/ansible/modules/packaging/os/yum.py)
     
            Installs, upgrade, downgrades, removes, and lists packages and
            groups with the `yum' package manager. This module only works
            on Python 2. If you require Python 3 support see the [dnf]
            module.
     
      * This module is maintained by The Ansible Core Team
      * note: This module has a corresponding action plugin.
     
    ………………省略部分输出信息………………
     
    <strong>EXAMPLES:
     
    - name: install the latest version of Apache
      yum:
        name: httpd
        state: latest
    </strong>

    编辑剧本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [root@linuxprobe ~]# vim packages.yml
    ---
    - name: 安装软件包
      hosts: dev,test,prod
      tasks:
              - name: one
                yum:
                        name: mariadb
                        state: latest
    [root@linuxprobe ~]#

    其中,name字段表示此项play(动作)的名字,用于在执行过程中提示用户执行到了哪一步,以及帮助管理员在日后阅读时能想起这段代码的作用。大家可以在name字段自行命名,没有任何限制。hosts字段表示要在哪些主机上执行该剧本,多个主机组之间用逗号间隔;如果需要对全部主机进行操作,则使用all参数。tasks字段用于定义要执行的任务,每个任务都要有一个独立的name字段进行命名,并且每个任务的name字段和模块名称都要严格上下对齐,参数要单独缩进。

    执行剧本

    ansible-playbook命令用于执行剧本。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    [root@linuxprobe ~]# <strong>ansible-playbook packages.yml</strong>
     
    PLAY [安装软件包] *******************************************************************
     
    TASK [Gathering Facts] **************************************************************
    ok: [192.168.10.20]
    ok: [192.168.10.21]
    ok: [192.168.10.22]
    ok: [192.168.10.23]
     
    TASK [one] **************************************************************************
    changed: [192.168.10.20]
    changed: [192.168.10.21]
    changed: [192.168.10.22]
    changed: [192.168.10.23]
     
    PLAY RECAP **************************************************************************
    192.168.10.20  : ok=2   <strong>changed=1  unreachable=0   failed=0</strong>   skipped=0   rescued=0   ignored=0  
    192.168.10.21  : ok=2   changed=1  unreachable=0   failed=0   skipped=0   rescued=0   ignored=0  
    192.168.10.22  : ok=2   changed=1  unreachable=0   failed=0   skipped=0   rescued=0   ignored=0  
    192.168.10.23  : ok=2   changed=1  unreachable=0   failed=0   skipped=0   rescued=0   ignored=0  

    其中,ok和changed表示执行及修改成功。如遇到unreachable或failed大于0的情况,建议手动检查剧本是否在所有主机中都正确运行了,以及有无安装失败的情况。  

  • 相关阅读:
    调用同一个类的另一个方法,导致该方法的事物失效问题。。做记录
    JS点名功能
    JS复制功能
    js局部刷新
    基于 Token 的身份验证方法
    JS获取URL“#”后的值
    JS批量打包下载图片(笔记)
    九阴真经
    弹框播放腾讯视频(Iframe)
    js sessionStorage会话存取/删除
  • 原文地址:https://www.cnblogs.com/wushuai2018/p/15915542.html
Copyright © 2020-2023  润新知