Ansible-企业最常选择的自动化运维工具

网友投稿 1017 2022-10-04

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

Ansible-企业最常选择的自动化运维工具

Ansible 概述

Ansible是一款为类Unix系统开发的自由开源的配置和自动化管理工具,可以管理远程主机,远程主机可以是远程虚拟机或者物理机,也可以使本地主机或者云主机。基于Python开发写成,类似于saltstack、puppet,实现了批量系统配置、批量程序部署、批量运行命令等功能。,Ansible基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,

Ansible只是提供一种框架,分布式、无客户端、轻量级架构,不需要在远程主机上安装client/agents,因为它们是基于ssh协议来和远程主机通讯的,只要能够SSH手动登录管理的工作,都可以通过Ansible管理。

Ansible目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。是每位运维工程师进阶必须掌握的技能之一。

ansible 特点

部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;默认使用SSH协议对设备进行管理;主从集中化管理;有大量常规运维操作模块,可实现日常绝大部分操作;配置简单、功能强大、扩展性强;支持API及自定义模块,可通过Python轻松扩展;通过Playbooks来定制强大的配置、状态管理;轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台;对云计算平台、大数据都有很好的支持

ansible 架构图

Ansible 在管理节点将 Ansible 模块通过 SSH 协议推送到被管理端执行,执行完之后自动删除,可以使用 SVN 等来管理自定义模块及编排。

Ansible:Ansible核心程序。HostInventory:记录由Ansible管理的主机清单,包括端口、密码、ip等。Playbooks:“剧本”YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能。CoreModules:核心模块,主要操作是通过调用核心模块来完成管理任务。CustomModules:自定义模块,完成核心模块无法完成的功能,支持多种语言。ConnectionPlugins:连接插件,Ansible和Host通信使用。

ansible 任务执行模式

Ansible 系统由控制主机对被管节点的操作方式可分为两类,即adhoc和playbook:

ad-hoc模式(点对点模式)使用单个模块,支持批量执行单条命令。ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell。playbook模式(剧本模式)是Ansible最主要的管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的文件。

ansible 执行流程

ansible 命令执行过程

加载配置文件,默认/etc/ansible/ansible.cfg;查找对应的主机配置文件,找到要执行的主机或者组;加载自己对应的模块文件,如 command;通过ansible将模块或命令生成对应的临时py文件(python脚本), 并将该文件传输至远程服务器;对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件;给文件 +x 执行权限;执行并返回结果;删除临时py文件,sleep 0退出;

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             #测试此命令执行会改变什么内容,不会真正的去执行

ansible-doc详细参数:

ansible-doc -l           #列出所有的模块列表

ansible-doc -s 模块名    #查看指定模块的参数  -s, --snippet   # [ˈsnɪpɪt]   片断

ansible配置文件使用顺序

1.首先找执行ansible命令的当前目录中,是否有 ansible.cfg文件

./ansible.cfg

2.如果找不到,再 找当前用户的Home目录下是否有 .ansible.cfg

~/.ansible.cfg

3.如果还找不到,就找 /etc/ansible/ansible.cfg

/etc/ansible/ansible.cfg

要检查当前使用的是哪个配置文件。

ansible --version 命令中,会显示

Ansible 使用实战1-安装配置管理两个服务器节点

实验环境

ansible 服务端  TEST63         10.67.12.63

ansible节点1:TEST63     10.67.12.63

ansible节点2:TEST62  10.67.12.64

在TEST63上安装ansible

1、设置EPEL仓库

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

[root@TEST63 ~]# yuminstall epel-release -y

2、 使用yum安装Ansible

[root@TEST63 ~]#yum installansible -y

安装完成后,检查ansible版本:

[root@TEST63 ~]#ansible --version

例:[root@TEST63 ~]#ansible-doc -s service

定义主机清单

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

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

格式:ansible_ssh_port:指定ssh端口  ansible_ssh_user:指定 ssh 用户 ansible_ssh_pass:指定 ssh 用户登录是认证密码(明文密码不安全)  ansible_sudo_pass:指明 sudo 时候的密码

例:[root@TEST63 ~]#vim  /etc/ansible/hosts   #文件 /etc/ansible/hosts 维护着Ansible中服务器的清单。在文件最后追加以下内容

[web-servers]                 #主机组名

10.67.12.64  ansible_ssh_port=22  ansible_ssh_user=root  ansible_ssh_pass=123456

简单测试下主机的连通性

[root@TEST63 ~]#  ansible -i etc/ansible/hosts web-servers -mping

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

-m    #   指定使用的ping模块

报错:

10.67.12.63 | FAILED!=> {

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

}

解决:[root@TEST63 ~]# sshroot@10.67.12.63   #手动连接一下/etc/ansible/hosts主机清单中的主机,这样就可以在ansible服务器上保存目标主机的fingerprint指纹。后期可以正常连接了

[root@TEST63 ~]#ansible -i hosts web-servers -m ping

10.67.12.64 | SUCCESS => {  #表示成测试。通信成功。

"changed": false,   #因为ping命令不会改变被管理的服务器的状态。所以是false正常

"ping": "pong"

}

2、基于ssh密钥来访问定义主机清单

一般来说,使用明文密码不安全,所以增加主机无密码访问。

在Ansible服务端生成密钥,并且复制公钥到节点中。

root@TEST63 ~]#ssh-keygen   #一路回车

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

[root@TEST63 ~]#ssh-copy-id  root@10.67.12.63

[root@TEST63 ~]#ssh-copy-id root@10.67.12.64

[root@TEST63 ~]# ssh 10.67.12.64

[root@TEST63 ~]# vim etc/ansible/hosts  #在文件的最后添加以下内容

删除之前在最后添加的两行主机清单:

[web-servers]

10.67.12.64  ansible_ssh_port=22  ansible_ssh_user=root  ansible_ssh_pass=123456

增加:

[web-servers]

10.67.12.63

10.67.12.64

在Ansible服务端运行命令

ping模块检查网络连通性

command模块执行shell命令,command:作为ansible的默认模块,可以运行远程权限范围内的所有shell命令

例1:使用ping检查‘web-servers’或者ansible节点的连通性。

[root@TEST63 ~]#ansible -i etc/ansible/hosts 'web-servers'  -m ping

或:

[root@TEST63 ~]#ansible 'web-servers'  -m ping  #不指定,默认使用/etc/ansible/hosts文件

10.67.12.63 | SUCCESS=> {

"changed": false,

"ping": "pong"

}

10.67.12.64 | SUCCESS=> {

"changed": false,

"ping": "pong"

}

例2:检查Ansible节点的运行时间(uptime)

[root@TEST63 ~]#ansible -m command -a "uptime" 'web-servers'   #也可以把主机清单组名写到最后,这样方便阅读命令

10.67.12.63 | SUCCESS| rc=0 >>

12:45:23 up 32min,  5 users,  load average: 0.17, 0.11, 0.27

10.67.12.64 | SUCCESS| rc=0 >>

12:45:23 up 26 min,  2 users, load average: 0.03, 0.03, 0.10

例3:检查节点的内核版本

[root@TEST63 ~]#ansible -m command -a "uname -r" 'web-servers'

例4:给节点增加用户

[root@TEST63 ~]#ansible -m command -a "useradd mk123" 'web-servers'

10.67.12.64 | SUCCESS| rc=0 >>

10.67.12.63 | SUCCESS| rc=0 >>

[root@TEST63 ~]#ansible -m command -a "grep mk123 etc/passwd" 'web-servers'

例5:将df命令在所有节点执行后,重定向输出到本机的/tmp/command-output.txt文件中

[root@TEST63 ~]#ansible -m command -a "df -Th" 'web-servers' >/tmp/command-output.txt

[root@TEST63 ~]# cat/tmp/command-output.txt

ansible常见模块高级使用方法

1、3个远程命令模块的区别

(1)、command模块为ansible默认模块,不指定-m参数时,使用的就是command模块;comand模块比较简单,常见的命令都可以使用,但其命令的执行不是通过shell执行的,所以,像这些 "<", ">", "|", and"&"操作都不可以,当然,也就不支持管道; 缺点:不支持管道,没法批量执行命令;

(2)、shell模块:使用shell模块,在远程命令通过/bin/sh来执行;所以,我们在终端输入的各种命令方式,都可以使用。

例1:运行free -m 命令

[root@TEST63 ~]#ansible -i /etc/ansible/hosts web-servers -m shell -a "free -m"

注:但是我们自己定义在~/.bashrc或~/.bash_profile中的环境变量shell模块由于没有加载,所以无法识别;如果需要使用自定义的环境变量,就需要在最开始,执行加载自定义脚本的语句;

对shell模块的使用可以分成两块: 1) 如果待执行的语句少,可以直接写在一句话中:

[root@TEST63 ~]# ansible -i /etc/ansible/hosts  web-servers -m shell -a "source ~/.bash_profile && df -h | grep sda3"

2) 如果在远程待执行的语句比较多,可写成一个脚本,通过copy模块传到远端,然后再执行;但这样就又涉及到两次ansible调用;对于这种需求,ansible已经为我们考虑到了,script模块就是干这事的;

(3)、scripts模块

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

[root@TEST63 ~]# vim  /etc/ansible/net.sh

#!/bin/bash

date

hostname

[root@TEST63~]# ansible -i /etc/ansible/hosts web-servers -m script -a "/etc/ansible/net.sh"

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

例1:把ansible主机上的/etc/hosts文件复制到主机组中机器的/tmp目录下

[root@TEST63 ~]#ansible -i /etc/ansible/hosts web-servers -m copy -a "src=/etc/hostsdest=/tmp/ owner=root group=root mode=0755"

在TEST64上查看

[root@TEST64 ~]# ll/tmp/hosts

-rwxr-xr-x 1 rootroot 240 8月  24 16:09 /tmp/hosts

3、file模块设置文件属性。

例如:

[root@TEST63 ~]#ansible -i /etc/ansible/hosts web-servers -m file -a "path=/tmp/hostsmode=0777"

验证:

[root@TEST63 ~]# ll/tmp/hosts

-rwxrwxrwx 1 rootroot 112 Aug 31 04:38 /tmp/hosts

4、stat模块获取远程文件信息

[root@TEST63 ~]#ansible -i /etc/ansible/hosts web-servers -m stat -a"path=/tmp/hosts"

5、get_url模块实现远程主机下载指定url到本地,支持sha256sum文件校验。

例如:下载epel-release-latest-7.noarch.rpm到主机清单中的/tmp/目录下

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

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

扩展:查看force=yes的作用

[root@TEST63 ~]#ansible-doc -s get_url  #在弹出的信息中找到force

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

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

查看下载的文件:

[root@TEST63 ~]# ll/tmp/epel-release-latest-7.noarch.rpm

-r--r----- 1 rootroot 15080 8月  24 16:20/tmp/epel-release-latest-7.noarch.rpm

测试:下载文件时,当文件不一样时,会替换原来的文件

[root@TEST64 ~]# cp/etc/passwd /tmp/epel-release-latest-7.noarch.rpm

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

10.67.12.63 | SUCCESS=> {

"changed":false,   #TEST63上原来的文件和当前的文件一样,就没有改变。执行成功,但没有发生改变,那么显示绿色

。。。

}

10.67.12.64 | SUCCESS=> {

"changed": true,   #TEST64上的文件名字一样,但是内容变,就会重新下载。执行成功,且发生改变,那么显示黄色

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

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

例子:安装php软件

[root@TEST63 ~]#ansible -i /etc/ansible/hosts web-servers -m yum -a "name=httpd  state=latest"

7、cron模块远程主机crontab配置。

例如:增加每30分钟执行ls /tmp

[root@TEST63 ~]#ansible -i /etc/ansible/hosts web-servers -m cron -a "name='list dir'minute='*/30' job='ls /tmp'"

在TEST63上查看

[root@TEST63 ~]#crontab  -l

#Ansible: list dir

*/30 * * * * ls /tmp

8、service模块远程主机系统服务管理。

service模块常用参数:

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

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

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

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

例如:远程启动apache服务

[root@TEST63 ~]#ansible -i /etc/ansible/hosts web-servers -m service -a "name=httpdstate=restarted"

9、sysctl模块远程主机sysctl配置。

例:开启路由转发功能

[root@TEST63 ~]#ansible -i /etc/ansible/hosts web-servers -m sysctl -a"name=net.ipv4.ip_forward value=1 reload=yes"

验证:

[root@TEST63 ~]# cat/proc/sys/net/ipv4/ip_forward

1

10、user模块远程主机用户管理

例如:

[root@TEST63 ~]#ansible -i /etc/ansible/hosts web-servers -m user -a "name=TEST6 state=present"

# present  [ˈpreznt]  目前

验证:

[root@TEST63 ~]# idTEST6

uid=1001(TEST6)gid=1001(TEST6) 组=1001(TEST6)

上一篇:华为openGauss BGWRITER_STAT
下一篇:Zeppelin: 让大数据插上机器学习的翅膀
相关文章

 发表评论

暂时没有评论,来抢沙发吧~