Ansible_自动化运维《Ansible之初识-1》

时间:2023-12-30 20:38:26
  • 1.Ansible简介
    • 1.1 Ansible介绍

        Ansible 是一个简单的自动化运维管理工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。可以用来自动化部署应用、配置、编排 task(持续 交付、无宕机更新等),采用 paramiko 协议库(fabric 也使用这个),通过 SSH 或者 ZeroMQ 等连 接主机。

      Ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。Ansible的强大在于丰富的模块,目前已经存在的模块有750+,所有的功能是由ansible核心来调度,基于模块来完成和工作的。

    • 1.2 Ansible结构

      Ansible_自动化运维《Ansible之初识-1》

    • 1.3 Ansible特性

      (1)no agents:不需要在被管控主机上安装任何客户端;
      (2)no server:无服务器端,使用时直接运行命令即可;
      (3)modules in any languages:基于模块工作,可使用任意语言开发模块;
      (4)yaml:使用yaml语言定制剧本playbook;
      (5)ssh by default:基于SSH工作;
      (6)strong multi-tier solution:可实现多级指挥

    • 1.4 Ansible优点

      (1)轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新操作即可;
      (2)批量任务执行可以写成剧本(脚本),而且不用分      发到远程就可以执行;
      (3)使用python编写,维护更简单;
      (4)支持角色(roles)
      (5)支持sudo

  • 2.Ansible安装
    • 2.1 安装要求

      控制机的需求:
      (1)控制机服务器系统:Linux系统
      (2)控制机安装python2.6或者python2.7

      说明:
      由于目前python3.0及以上版本并没有在市场上普及使用,
      Ansible2.2对python3.0 有个技术预览版,本文章以python2.7 为例。

    • 2.2 常用安装方式
      • 2.2.1 基于redhat/centos安装
        • YUM安装

          方法:

           (1) 安装epel源

          源地址:http://fedoraproject.org/wiki/EPEL,如下图:

          Ansible_自动化运维《Ansible之初识-1》

          进入epel源页面,选择相应的系统的安装源rpm包,下载之后进行安装,例如centos7.2 系统,

          下载源地址为:https://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-8.noarch.rpm

           #wget https://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-8.noarch.rpm
          #rpm -ivh epel-release--.noarch.rpm

          (2) 安装ansible

           # yum install ansible -y

          等待完成安装即可。

          (3) 测试安装,执行如下命令:

           [root@ ~]# ansible --version
          ansible 2.2.0.0
          config file = /etc/ansible/ansible.cfg
          configured module search path = Default w/o overrides

          如果能正确显示ansible的版本,则说明安装成功了。

      • 2.2.2 基于ubuntu安装
        • PPA安装

          方法:

          (1)利用PPA软件包管理器进行安装,执行如下:

           $ sudo apt-get install software-properties-common
          $ sudo apt-add-repository ppa:ansible/ansible
          $ sudo apt-get update
          $ sudo apt-get install ansible

          等待安装完成即可。

      • 2.2.3 基于Debian安装

        方法:

        • Debian安装方式与ubuntu大致形同,也可以利用ubuntu的PPA进行安装;
        • (1)编辑/etc/apt/sources.list 文件,增加以下内容:
        • #vi /etc/apt/sources.list
          deb http://ppa.launchpad.net/ansible/ansible/ubuntu trusty main
        • (2)运行以下执行安装命令

           $ sudo apt-get update
          $ sudo apt-get install ansible

          等待安装完成即可。

    • 2.3 其他安装方式
        • 2.3.1 pip安装

          利用Pip-Python包管理器进行安装,然后安装ansible:

           $ sudo easy_install pip
          $ sudo pip install ansible
      • 2.3.2 其他安装方式

        其他的安装方式较多,请参考官方文档介绍:
        http://docs.ansible.com/ansible/intro_installation.html

  • 3.Ansible配置
    • 3.1 Ansible配置
      • 3.1.1 Ansible总配置文件:

        Ansible的配置文件其实只有一个文件,相对较简单,配置文件为:ansible.cfg,配置文件路径为:/etc/ansible/ansible.cfg

      • 3.1.2 配置说明:

        简单的配置说明如下:

        [defaults]
        #inventory = /etc/ansible/hosts #定义inventory
        #forks = #默认开启的并发数
        #sudo_user = root #默认sudo用户
        #ask_sudo_pass = True #是否需要sudo密码
        #ask_pass = True #是否需要密码
        #host_key_checking = False #首次连接是否需要检查key认证
        #

        以上为简单需要的配置文件,如果没有特别需要,则保持默认配置即可。

    • 3.2 主机组配置
      • 定义主机和组

          inventory的配置文件默认遵循INI文件风格,中括号[]中的名字为主机组名称。其中可以将同一个主机IP放到不同的主机组中,分组的功能给IT 维护人提供了非常强大的便利。此外,如果目标主机使用了非默认的22端口,还可以在主机后面使用冒号加端口来表示连接端口,文件以行来分隔配置。具体请看示例:

        以/etc/ansible/hosts为例:
        #inventory主机配置可以直接写IP
        192.168.100.2
        #同样支持hostname主机名的方式
        web.test.com
        #后跟冒号加端口表示新连接端口
        db-a.test.cn: #主机组定义
        [web-server]
        Web1.test.com
        Web[:].test.com #支持数值范围的表示方法 [db-server]
        db-b.test.cn
        db-[c:f].test.cn #不仅支持数字,还支持字母表示
    • 3.3 主机/主机组变量配置
      • 主机变量:
             在日常部署和为维护中,我们会经常碰到非标准化的需求配置。
        例如:
             配置http环境时候,为了安全,需要将192.168.100.2 这台服务器的http端口设置为8080,默认情况下,我们配置文件的端口都是80端口,那么如何在自动配置过程中我们就设置为8080 端口呢 ?

        可否为192.168.100.2定义一个变量http_port,把端口设置为http_port = 8080,当配置的时候,直接读取这个变量,生成一个8080 的端口配置文件。
        那么只需要在hosts文件里面,在192.168.100.2主机后面加上变量即可:

        #/etc/ansible/hosts 文件
        192.168.100.2 http_port =
      • 主机组变量:
            Ansible支持给主机组定义变量(相当于此主机组内的全局变量),支持大量机器的变量定义需求,赋予指定主机组内所有主机在执行playbook中的可用变量。

        演示案例,/etc/ansible/hosts文件:

        [web-server]
        Web1.test.com
        Web5.test.com
        192.168.100.3 [web-server:vars]
        http_port=
        Dns_name=202.106.0.20

        以上案例,就是为[web-server]主机组设置了组变量,变量http_port、Dns_name等变量均适用于[web-server]主机组包含的所有主机,当有调用的时候就会获取变量的值。

    • 3.4 定义组嵌套以及组变量
      • 嵌套组:
            inventory中,组可以包含其他组(嵌套),并且也可以向组中的主机指定变量。
            注意:这些嵌套组定义的变量,只能在playbook中使用,直接使用ansible的AD-HOC 是不生效的。

        说明:ansible的AD-HOC 是指使用ansible执行的临时或者一次的命令,例如:

        #ansible web-server -m command -a "df -h"

        演示例子,/etc/ansible/hosts文件:

        [Apache]
        http.test.com [Nginx]
        Ngx.test.cn [webserver:children] #关键字children
        Apache
        Nginx [webserver:vars]
        port=

        说明:

        以上配置hosts文件,定义了[Apache]、[Nginx]两个主机组,其中[Apache]主机组包含http.test.com主机;[Nginx]主机组包含Ngx.test.cn主机;同时又定义了一个主机嵌套组[webserver],其中[webserver:children]包含了两个子主机组Apache、Nginx,即[webserver:children]包含了Apache、Nginx主机组的所有服务器。同时又为[webserver]主机组定义了变量,port=22

        例如:

        192.168.100.2 ansible_ssh_port= ansible_ssh_pass=#ewq
      • 3.5 其他参数(内置)
             除了上述的设置变量之外,ansible 在ssh连接主机的时候还设置了一些内置的变量和参数。
        #ansible_ssh_host                #指定连接主机
        #ansible_ssh_port #指定连接端口
        #ansible_ssh_user #指定连接用户
        #ansible_ssh_pass #指定ssh连接密码
        #ansible_sudo_pass #是定ssh连接时sudo密码
        #ansible_ssh_private_key_file #指定特有私钥文件

        还有其他的一些参数,请参考官网 ansible.com .

  • 4.Ansible配置SSH互信免密码登录
    • 4.1 在控制机上生成公钥

      在安装ansible的控制机上生成密钥,命令如下:

      [root@ ~]# cd ~
      [root@ ~]# ssh-keygen -t ras -p
      Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase):
      Enter same passphrase again:
      Your identification has been saved in /root/.ssh/id_rsa.
      Your public key has been saved in /root/.ssh/id_rsa.pub.
      The key fingerprint is:
      :de::b3:cb:::0a::5c:4b:f3:::c0:2b root@local
      The key's randomart image is:
      +--[ RSA ]----+
      | .++o*. |
      | .+=o= |
      | .+o . |
      | E .. . |
      | .o S . |
      | . + = |
      | . + |
      | . o |
      | o |
      +-----------------+
      [root@ ~]# cd .ssh/
      [root@ .ssh]# ll
      total
      -rw------- root root Jan : id_rsa
      -rw-r--r-- root root Jan : id_rsa.pub
      -rw-r--r-- root root Jan : known_hosts

      其中id_rsa.pub文件就是公钥文件。

    • 4.2 配置ansible hosts文件

      因为使用ansible 是基于SSH来做通信和管理的,所以需要连接服务器,则必须要配置好密码或者互信。因为我们是第一次连接主机,所以需要在hosts文件里配置好连接方式,建议初次使用明文的访问,为了安全,完成之后建议删除相关的密码。

      ansible——hosts配位文件如下:

      #cat /etc/ansible/hosts
      172.16.12.240 ansible_ssh_pass=ansible2017
      172.16.12.241 ansible_ssh_pass=ansible2017
      172.16.12.242 ansible_ssh_pass=ansible2017

      完成之后可以使用ansible命令来推送密钥到各个管理服务器了。

    • 4.3 免密码登录认证配置
      • 4.3.1 ansible批量推送

        前面已经配置了ansible的hosts文件,下面进行推送公钥id_rsa.pub

        #ansible all -m copy -a "src=/root/.ssh/id_rsa.pub dest=/root/.ssh/authorized_key mode=0600 state=force"
        #ansible all -m command -a "chmod 700 /root/.ssh"

        测试是否可以免密钥登录。

      • 4.3.2 ssh-copy-id 发送公钥

        利用ssh-copy-id远程发送id_rsa.pub,命令如下:

        根据提示输入密码即可远程推送公钥。

        [root@ ~]# ssh-copy-id -i .ssh/id_rsa.pub root@172.16.12.241
        /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
        /usr/bin/ssh-copy-id: INFO: key(s) remain to be installed -- if you are prompted now it is to install the new keys
        root@172.16.12.241's password: Number of key(s) added: Now try logging into the machine, with: "ssh 'root@172.16.12.241'"
        and check to make sure that only the key(s) you wanted were added.

        测试是否可以远程无密码登录。

        [root@ ~]# ssh 172.16.12.241
        Last login: Thu Jan :: from 172.16.12.240
        [root@ ~]#
  • 5.Ansible 简单使用
    • ansible ping 模块

      ansible的ping模块用来检测配置的hosts文件的主机是否网络连通,命令如下:

      [root@controller ~]# ansible all -m ping
      172.16.12.241 | SUCCESS => {
      "changed": false,
      "ping": "pong"
      }
      [root@controller ~]#

      如上所示,返回结果为:SUCCESS ,ping结果pong,说明主机连通性正常。

总结:

  本篇Ansible_自动化运维之《Ansible之初识-1》文章主要介绍了ansible的安装和主机组的配置,下一篇 Ansible_自动化运维之《Ansible之命令-2》将重点介绍 Ansible的ad-hoc以及模块的使用,敬请关注。

如果有不足和错误之处,请联系作者及时修改,谢谢!