Ansible安装与配置

    技术2022-07-11  101

    Ansible简介

    ansible基于Python开发,,集合了众多运维工具的优点,实现了批量运行命令,部署程序,配置系统等功能。默认通过SSH协议进行远程命令执行或下发配置,无需部署任何客户端代理软件,从而使得自动化环境部署变得更加简单。可同时支持多台主机并行管理,使得管理主机更加便捷。

    Ansible核心组件

    ansible可以看做是一种基于模块进行工作的框架结构,批量部署能力就是有ansible所运行的模块实现的。简而言之ansible是基于“模块”完成各种“任务”的。

    结构图如下所示

     

    ansible组件由如下六部分组成

    Ansible core 核心引擎

     

    Host inventory 主机清单:用来定义Ansible所管理的主机,默认是在Ansible的hosts配置文件中定义被管理的主机,同时也支持自定义动态主机清单和指定其他配置文件的位置

     

    Connection plugins 连接插件:负责和被管理主机实现通信。除支持使用SSH连接被管理主机外,ansible还支持其它的连接方式,所以需要有连接插件将各个主机用连接插件连接到ansible

     

    Playbooks(yam1,jinja2)剧本:用来集中定义ansible的任务配置文件,即将多个任务定义在一个剧本中由ansible自动执行,可以由控制主机针对多台被管理主机同时运行多个任务

     

    Core modules 核心模块:是ansible自带的模块,使用这些模块将资源分发到被管理主机,使其执行特定任务或匹配特定状态

     

    Custom modules 自定义模块:用于完成模块功能的补充,可借助相关插件完成记录日志,发送邮件等功能

     

    安装部署ansible服务

    ansible自动化运维环境由控制主机与被管理主机组成,由于ansible是基于SSH协议进行通信的,所以控制主机安装ansible软件后不需要重启或运行任何程序,被管理主机也不需要安装或运行任何代理程序。

     

    Ansible安装及基本配置

     

    ansiblle具有如下特点:

    1、部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;

    2、默认使用SSH协议对设备进行管理;

    3、主从集中化管理;

    4、配置简单、功能强大、扩展性强;

    5、支持API及自定义模块,可通过Python轻松扩展;

    6、通过Playbooks来定制强大的配置、状态管理

    7、对云计算平台、大数据都有很好的支持;redis配置文件:这样写可以获取到客户机的ipv4地址,bind {{ ansible_default_ipv4.address }}

    1 安装ansible

    Ansible仓库默认不在yum仓库中,因此需要使用下面的命令启用epel仓库。

    yum install epel-release -y

    yum install ansible -y

     

    2.安装成功ansible –version

    3.ansible命令参数

          anisble命令语法: ansible [-i 主机文件] [-f 批次] [组名] [-m 模块名称] [-a 模块参数]

            ansible详细参数:

             -v,–verbose   #  详细模式,如果命令执行成功,输出详细的结果 (-vv –vvv -vvvv)

             -i PATH, -inventory=PATH      #  指定 host 文件的路径,默认是在 /etc/ansible/hosts

    inventory  [ˈɪnvəntri]  库存

             -f NUM,-forks=NUM     # NUM 是指定一个整数,默认是 5 ,指定 fork 开启同步进程的个数。

             -m NAME,-module-name=NAME    #   指定使用的 module 名称,默认使用 command模块

            -a,MODULE_ARGS   #指定 module 模块的参数

             -k,-ask-pass           #提示输入 ssh 的密码,而不是使用基于 ssh 的密钥认证

             -sudo          # 指定使用 sudo 获得 root 权限

             -K,-ask-sudo-pass             #提示输入 sudo 密码,与 -sudo 一起使用

             -u USERNAME,-user=USERNAME          # 指定移动端的执行用户

             -C,–check             #测试此命令执行会改变什么内容,不会真正的去执行

     

    4. 生成密钥

        ssh-keygen默认就行

        使用ssh-copy-id命令来复制Ansible公钥到节点 

        ssh-copy-id  root@节点ip

    5.定义主机清单 /etc/ansible/hosts  默认是在 /etc/ansible/hosts

      (1)基于端口,用户,密码定义主机清单

      ansible基于ssh连接-i (inventory)参数后指定的远程主机时,也可以写端口,用户,密码。

      格式:ansible_ssh_port:指定ssh端口 ansible_ssh_user:指定 ssh 用户 ansible_ssh_pass:指定 ssh 用户登录是认证密码(明文密码不安<br>全)             

      ansible_sudo_pass:指明 sudo 时候的密码

     vim  /etc/ansible/hosts   #文件 /etc/ansible/hosts 维护着Ansible中服务器的清单。在文件最后追加以下内容

    [web-servers]

    ansible服务器ip  ansible_ssh_port=22  ansible_ssh_user=root  ansible_ssh_pass=123456

    [web-server]

    节点ip

    实例:

    ansible主要相关配置文件在/etc/ansible目录下

     

    cd /etc/ansible/

    总用量 24

    -rw-r--r--. 1 root root 20269 10月  9 09:34 ansible.cfg  #配置文件

    -rw-r--r--. 1 root root  1016 10月  9 09:34 hosts    #管控主机文件

    drwxr-xr-x. 2 root root    6 10月  9 09:34 roles

     

     

    5.1 ansible.cfg配置文件详解

    Ansible.cfg是ansible自动化任务所用的一个核心配置文件,大部分的配置文件都集中在defualts配置项目中。

     

    我的自动化实战课程讲解到ansble配置的时候,提供如下的问题,给大家作为参考阅读,defaults下的配置项,下面列出常用的配置参数

    1)inventory

     

    该参数表示资源清单inventory文件的位置,资源清单就是一些Ansible需要连接管理的主机列表 inventory = /root/ansible/hosts 

     

    2)library 

     

    Ansible的操作动作,无论是本地或远程,都使用一小段代码来执行,这小段代码称为模块,这个library参数就是指向存放Ansible模块的目录 library = /usr/share/ansible

     

     3)forks 

     

    设置默认情况下Ansible最多能有多少个进程同时工作,默认设置最多5个进程并行处理。具体需要设置多少个,可以根据控制主机的性能和被管理节点的数量来确定。 forks = 5

     

     4)sudo_user

     

     这是设置默认执行命令的用户,也可以在playbook中重新设置这个参数 sudo_user = root //注意:新版本已经作了修改,如ansible2.4.1下已经为: default_sudo_user = root 

     

    5)remote_port 

     

    这是指定连接被关节点的管理端口,默认是22,除非设置了特殊的SSH端口,不然这个参数一般是不需要修改的 remote_port = 22

     

     6)host_key_checking 

     

    这是设置是否检查SSH主机的密钥。可以设置为True或False host_key_checking = False 

     

    7)timeout

     

     这是设置SSH连接的超时间隔,单位是秒。 timeout = 20 

     

    8)log_path

     

     Ansible系统默认是不记录日志的,如果想把Ansible系统的输出记录到人i治稳健中,需要设置log_path来指定一个存储Ansible日志的文件 log_path = /var/log/ansible.log 另外需要注意,执行Ansible的用户需要有写入日志的权限,模块将会调用被管节点的syslog来记录,口令是不会出现的日志中的

     

     9)private_key_file

     

     在使用ssh公钥私钥登录系统时候,使用的密钥路径。 private_key_file=/path/to/file.pem

    ————————————————

     

    5.2 配置主机清单

    ansible通过读取默认主机清单/etc/ansible/hosts文件,修改主机与组配置后,可同时连接到多个被管理主机上执行任务。具体配置如下:

     

    vim hosts

    [web]                                  #被管理主机分类

    192.168.199.130

    [mysql]                                #被管理主机分类

    192.168.199.131

     

    5.3设置SSH无密码登录

    为了避免ansible下发指令时输入被管理主机的密码,可以通过证书签名达到SSH无密码登录的效果,使用ssh-keygen产生一对密匙,使用ssh-copy-id来下发生成的公匙

    关闭三台服务器的防火墙

     

    systemctl stop firewalld.service

    setenforce 0

     

    配置秘钥验证

     

    ssh-keygen -t rsa

    ssh-copy-id root@192.168.199.130

    ssh-copy-id root@192.168.199.131

    至此配置部署完成

     

    5.4 常用命令

    (1)主机连通性测试:ansible all -m ping

    (2)command:在远程主机执行命令;不支持|管道命令

    执行指令   ansible all -m command -a 'ls'

    (3)shell操作:shell模块在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道等 :

    ansible all -m shell -a 'cat /etc/profile |grep "java"'

     

    6.测试主机连通性

     ansible -i /etc/ansible/hosts web-servers -m ping 

      -i #指定 host 文件的路径,默认是在 /etc/ansible/hosts

      -m #指定使用的ping模块

    报错:192.168.1.63 | FAILED! => {

        "msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this.  Please add this host's fingerprint to your known_hosts file to manage this host."

    }

     

    ssh root@192.168.1.63 #手动连接一下/etc/ansible/hosts主机清单中的主机,这样就可以在ansible服务器上保存目标主机的fingerprint指纹。再连接试试,如果不行,修改配置文件ansible.cfg,将host_key_checking = False打开就OK了。

     

    6.1 获取节点服务器运行时间

     ansible -m command -a "uptime" web-servers

     ansible -i hosts web-servers -m command -a "uptime"

    6.2  给节点增加用户

     ansible -i hosts web-servers -m command -a "useradd xiaoming"

    6.3  scripts模块

      使用scripts模块可以在本地写一个脚本,在远程服务器上执行

      copy模块:实现主控端向目标主机拷贝文件,类似scp功能

    ansible -i /etc/ansible/hosts web-servers -m copy -a "src=/ai.sh dest=/tmp owner=liutao group=liutao mode=755"相当于scp文件,可以定义拥有者,组以及权限。

     

    6.4获取远程文件信息

     stat模块

     ansible -i hosts web-servers -m stat -a "path=/tmp/ai.sh"

     

    6.5 get_url模块实现远程主机下载指定url到本地

     ansible -i /etc/ansible/hosts web-servers -m get_url -a "url=https://dl.fedoraproject.org/pub/epel/epel-release-latest-noarch.rpm  dest=/tmp/ mode=0440 force=yes"

    注:url=https://xxx  的等号=前后不能有空格 

     如果force=yes,当下载文件时,如果所下的内容和原目录下的文件内容不一样,则替换原文件,如果一样,就不下载了。

     如果为“否”,则仅在目标不存在时才下载文件。 一般来说,只有小型本地文件才应该为“是”。 在0.6之前,该模块表现为默认为“是”

     

    6.6yum模块linux平台软件包管理。

      yum模块可以提供的status状态: latest ,present,installed  #这3个代表安装;removed, absent #后面2个是卸载

     安装http,mysql软件

    ansible -i /etc/ansible/hosts web-servers -m yum -a "name=httpd  state=latest"

     

    6.7 cron模块:执行定时任务

    ansible -i /etc/ansible/hosts web-servers -m cron -a "name='mkdir' minute=5 hour=02 day=15 month=8 weekday=3 job='mkdir /tmp/a.txt'"

    minute hour day month weekday   分  时  日   月  周

     

    6.8 service模块 远程主机系统服务管理

     name参数:此参数用于指定需要操作的服务名称,比如 nginx,httpd。

     state参数:此参数用于指定服务的状态,比如,我们想要启动远程主机中的httpd,则可以将 state 的值设置为 started;如果想要停止远程主机中的服务,则可以将 state 的值设置为 stopped。此参数的可用值有 started、stopped、restarted(重启)、reloaded。

    enabled参数:此参数用于指定是否将服务设置为开机 启动项,设置为 yes 表示将对应服务设置为开机启动,设置为 no 表示不会开机启动。

     注:想使用service模块启动服务,被启动的服务,必须可以使用service 命令启动或关闭    

     reloaded, restarted, started, stopped 平滑重启,重启,启动,关闭

     enabled=yes开机自启动,no开机不启动

     ansible -i /etc/ansible/hosts web-servers -m service -a "name=httpd state=started"

    ansible -i /etc/ansible/hosts web-servers -m service -a "name=httpd enabled=yes"  

     

    6.9 sysctl模块远程主机sysctl配置。

     开启路由转发功能

    ansible -i /etc/ansible/hosts web-servers -m sysctl -a "name=net.ipv4.ip_forward value=1 reload=yes"

    user模块远程主机用户管理

    ansible -i hosts web-servers -m user -a "name=xxx state=present"

    state参数state=absent(删除用户,不删除家目录)  默认是present(创建用户)

    state=absent remove=yes(删除用户同事删除家目录,用户不存在不操作)

    Processed: 0.015, SQL: 9