批量运维管理工具之Ansible

Posted EzLearnPython

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了批量运维管理工具之Ansible相关的知识,希望对你有一定的参考价值。

Ansible

ansible基于Python开发,集合了众多运维工具(puppetcfenginecheffuncfabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能

在使用时,ansible不需要在被控端安装客户端,ansible工作基于ssh,只要被控端服务器有ssh服务,加上一个Python环境,就可以使用ansible

另外,ansible在15年的时候,以1.5亿美元被RedHat公司收购,新版的RedHat操作系统内置ansible软件,很厉害的


Ansible部署

ansible安装可以通过源码,yum源以及python所提供的pip管理工具进行安装

  • 使用pip管理工具进行安装

1
pip3 install ansible
  • 使用yum进行安装

1
2
yum install epel-release # 安装扩展源
yum install ansible

Ansible配置

安装之后,默认ansible工具的配置文件在/etc/ansible

如果通过pip命令安装,是没有这个目录的,需要我们手动创建,其中所需主要配置文件如下

  • ansible.cfgansible主配置文件

  • hosts:被管理主机IP或者主机名列表文件,也是比较重要的一个文件

  • roles:角色或插件目录(默认为空)

此外除了默认的ansible的配置文件路径,关于ansible的配置文件路径选择还有如下几种,按照顺序表示优先级

  • export ANSIBLE_CONFI:指定的全局变量

  • ./ansible.cfg:当前目录下的配置文件

  • ~/.ansible.cfg:当前用户目录下的配置文件

  • /etc/ansible/ansible.cfgetc目录下的配置文件

如果以上四个路径下均没有cfg配置文件,则使用默认配置

如果通过源进行安装,那么在/etc/ansible/目录下会自动包含ansible.cfg文件

https://raw.githubusercontent.com/ansible/ansible/devel/examples/ansible.cfg

  • ansible配置文件中可以进行ansible的各项参数的设置,包括并发线程数量、用户、模块路径、调优等等

    • defaluts:默认的配置项,一般不需要修改

    • privilege_escalation:执行命令的用户权限设置

    • paramiko_connectionparamiko插件设置

    • ssh_connectionssh连接设置

  • 默认ansible使用hosts文件列举监控主机,格式为ini,可以进行IP的分组以及IP规则设置,比如如下的例子

1
2
[webserver]
192.168.1.101:22

ansible支持很多模块来进行对被控主机的管理,包括:commandshellscriptyumcopyFileasyncdockercronmysql_userpingsysctluseracladd_hosteasy_installhaproxy等。默认在执行命令时,使用模块为command,接下里会进行介绍

Ansible使用参数

ansible在工作时,需要使用我们安装好的ansible来执行命令

经常在使用ansible模块进行工作时,可能还需要额外提供一些参数来辅助工作,下面是常用参数

命令参数 解释
-v 打印详细信息
-m 指定使用的模块,默认为command模块
-k 要求输入远程主机密码
-a 将参数或命令传入模块
-C 测试执行过程,但不真正执行
-sudo 基于sudo用户执行
--list-hosts 列举命令生效的主机
-l 限制匹配规则的主机数
-i 指定hosts文件路径
-u SSH连接所使用用户

现在看到这些命令参数你可能有一些蒙蔽,不过不要着急,结合模块使用,你将很快了解这些参数的实际意义

配置免密登陆

由于ansible是通过ssh服务进行命令下达执行,那避免不了用户认证

但是在批量执行时,多次的重复认证会导致我们的效率及其低下,这里可以通过配置主控端与被控端主机之间SSH免密登陆来实现用户认证的跳过,可谓是一次配置,轻松很久呐

  • 在主控服务器192.168.1.104下生成秘钥

1
2
ssh-keygen -t rsa 
#-t指定加密的方式,默认为rsa
  • 进行秘钥的分发

1
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.101
  • 输入对应远程主机的ssh账号密码之后,接下来在主控服务器就可以不进行SSH的用户认证也可以访问到被控端,这里测试主机为192.168.1.104(主控),192.168.1.101(被控)

定义主机及组规则

ansible通过定义好的主机与组规则(Inventory)在执行命令时通过匹配进行远程操作

这个文件默认就是我们上面所说的/etc/ansible/hosts文件,其中定义的几种方式如下

  • 直接将IP写入

1
192.168.1.101
  • 规则分组

1
2
3
[webserver]
192.168.1.101:2333
www.example.com

可以在规则的IP后指定端口

  • 规则命名

1
2
3
myhost ansible_ssh_host=192.168.1.101
[webservers]
myhost

在使用时,直接利用myhost即可

除去示例中的指定方式,还有如下一些参数可以利用

  • ansible_ssh_port:目标主机ssh服务端口

  • ansible_ssh_user:目标主机ssh登录用户

  • ansible_ssh_pass:目标主机ssh登录密码

  • ansible_connection:连接类型:localsshparamiko

  • ansible_ssh_priveate_key_file:连接所需ssh私钥文件;

  • ansible_shell_type:目标主机的shell类型:ashbash(默认使用的shell,可以结合help查看帮助文档)、ksh(支持42个内部命令)、cshzsh(最庞大的shell,支持84个内部命令)

  • 正则规则

1
2
3
[webservers]
[a:z]bc.example.com
192.168.1.10[1:5]

Ping模块

ping模块可以判断被控主机是否在线, 返回值为changed和ping

首先在/etc/ansible/hosts文件下添加被控主机,并建立分组为webservers

1
2
[webservers]
192.168.1.101:22
  • ping命令的用法,要进入到python安装目录下,找到对应的ansible可执行文件

1
./ansible all -m ping

返回值ping如果为pong则代表可以ping

ansible命令行第二个参数可以是一个主机的正则规则,all代表所有hosts文件下IP,也可以指定使用某个分组

1
./ansible webservers -m ping

Command模块

通过ansible执行命令时,默认使用command模块,该模块主要用于执行linux基础命令

  • 注意:对比之后的ShellScript功能模块,Command模块不支持管道

  • command支持的额外参数

1
2
./ansible-doc -s command
# 文档
参数 解释
chdir 执行命令时,先进入到该目录下
creates 给定文件存在时,不执行该命令
free_form 需要执行的脚本
removes 给定文件存在,则执行该命令
  • 对远程主机执行命令

1
./ansible webservers -m command -a "ifconfig"
  • 执行命令时更改工作目录

1
./ansible webservers -m command -a "ls chdir=/home/"

Shell模块

shell使用远程主机下的/bin/sh进行命令执行,支持比command模块更多的命令,常用参数如下

1
2
./ansible-doc -s shell
# 文档
  • 额外参数

参数 解释
chdir 执行命令时,先进入到该目录下
creates 给定文件存在时,不执行该命令
free_form 需要执行的脚本
removes 给定文件存在,则执行该命令
executable 更换执行命令所使用的shell环境
  • 远程主机编写sh脚本,向屏幕输出hello

1
echo "hello"
  • 执行远程主机的shell脚本

1
./ansible webservers -m shell -a "sh ~/test.sh"

Script模块

该模块可以方便运行当前管理机上的脚本直接到远程被控端,而不需要先将脚本拷贝到远程主机后在执行

  • 在主控制home目录下创建sh脚本

1
echo "this is Control"
  • 将这个sh脚本通过script模块执行到远程被控端

1
./ansible webservers -m script -a "/root/test.sh"

Copy模块

copy模块可以方便的将当前主机下文件拷贝到远程主机,类似scp命令等

1
2
./ansible-doc -s copy
# 文档地址
  • 支持的参数

参数 解释
src 将本地路径复制到远程服务器; 可以是绝对路径或相对的。如果是一个目录,它将被递归地复制。如果路径以/结尾,则只有该目录下内容被复制到目的地,如果没有使用/来结尾,则包含目录在内的整个内容全部复制
content 当用content代替src参数的时候,可以把文档的内容设置到特定的值
dest 目标绝对路径。如果src是一个目录,dest也必须是一个目录。如果dest是不存在的路径,并且如果dest以/结尾或者src是目录,则dest被创建。如果srcdest是文件,如果dest的父目录不存在,任务将失败
backup 如果文件修改,则在覆盖之前将原文件备份,备份文件包含时间信息
directory_mode 设定目录的权限,在新建时使用,不会影响已存在的目录
force 当目标内容不同于源时,将替换远程文件。设置为no时,只有在目标文件不存在的情况下才会传输文件
group 设置文件/目录的所属组
mode 设置文件权限
owner 设置文件/目录的所属用户

Copy前备份

1
./ansible all -m copy -a "src=/root/ansible_copy_file backup=yes dest=/home/"

在第一次拷贝时,由于目标主机还并没有这个文件, 备份动作不生效

在对文件内容进行修改后重新执行该命令拷贝文件

此时目标主机下,不光会有我们上传的拷贝文件,还有之前文件的一个备份

覆盖内容

直接通过content参数指定内容,并对目标主机上已存在的test_copy文件进行覆盖

1
./ansible all -m copy -a "content='这是命令修改\n'  dest=/home/test_copy"

这条命令将会把远程主机home目录下的test_copy文件覆盖为我们的content内容

Stat模块

该模块可以获取远程主机下的文件信息,需要使用path参数指明文件路径

1
./ansible all -m stat -a "path=/home/test_copy"

Yum模块

该模块可以对远程主机上的软件安装、卸载进行管理

1
2
./ansible-doc -s copy
# 文档
  • 支持参数

参数 解释
name 必须参数,用于指定需要管理的软件包,比如nginx
state 用于指定软件包的状态,默认值为present,表示确保软件包已经安装
除了present,其他可用值有installedlatestabsentremoved
其中installedpresent等效,latest表示安装yum中最新的版本,absentremoved等效,表示删除对应的软件包
  • 在远程主机下安装nginx

1
./ansible all -m yum -a "name=nginx state=installed"
  • 查看nginx服务状态

1
systemctl status nginx

Service模块

该模块主要用于远程服务器上对应的服务管理,比如开启或关闭apache服务等

1
2
./ansible-doc -s yum
# 文档
  • 支持参数

参数 解释
name 需要管理的服务名称,如nginx
state 此参数用于指定服务的状态
比如,我们想要启动远程主机中的nginx,则可以将state的值设置为started
如果想要停止远程主机中的服务,则可以将state的值设置为stopped
此参数的可用值有startedstoppedrestartedreloaded
enabled 此参数用于指定是否将服务设置为开机启动项,设置为yes表示将对应服务设置为开机启动,设置为no表示不会开机启动
  • 将远程主机下的httpd服务开启

1
./ansible all -m service -a "name=httpd state=started"

File模块

file模块可以帮助我们完成一些对文件的基本操作

比如,创建文件或目录、删除文件或目录、修改文件权限等

1
2
./ansible-doc -s yum
# 文档
  • 支持参数

参数 解释
path 指明需要操作的文件或目录路径
state 此参数非常灵活,其对应的值需要根据情况设定。比如,我们想要在远程主机上创建/testdir/a/b目录,那么则需要设置path=/testdir/a/b,但是,我们无法从/testdir/a/b这个路径看出b是一个文件还是一个目录,ansible也同样无法单单从一个字符串就知道你要创建文件还是目录,所以,我们需要通过state参数进行说明
当我们想要创建的/testdir/a/b是一个目录时,需要将state的值设置为directorydirectory为目录之意,当它与path结合,ansible就能知道我们要操作的目标是一个目录
当我们想要操作的/testdir/a/b是一个文件时,则需要将state的值设置为touch
当我们想要创建软链接文件时,需将state设置为link;想要创建硬链接文件时,需要将state设置为hard
当我们想要删除一个文件时(删除时不用区分目标是文件、目录、还是链接),则需要将state的值设置为absentabsent为缺席之意,当我们想让操作的目标”缺席”时,就表示我们想要删除目标
src src参数:当state设置为link或者hard时,表示我们想要创建一个软链或者硬链
所以,我们必须指明软链或硬链链接的哪个文件,通过src参数即可指定链接源
force state=link的时候,可配合此参数强制创建链接文件,当force=yes时,表示强制创建链接文件。不过强制创建链接文件分为三种情况
情况一:当要创建的链接文件指向的源文件并不存在时,使用此参数,可以先强制创建出链接文件
情况二:当要创建链接文件的目录中已经存在与链接文件同名的文件时,将force设置为yes,会将同名文件覆盖为链接文件,相当于删除同名文件,创建链接文件
情况三:当要创建链接文件的目录中已经存在与链接文件同名的文件,并且链接文件指向的源文件也不存在,这时会强制替换同名文件为链接文件
owner 指定文件所属用户
group 指定文件所属组
mode 指定文件权限
  • 将远程主机下的Python3创建软连接到home目录

1
./ansible all -m file -a "path=/home/python3 state=link src=/usr/local/python3/bin/python3"


以上是关于批量运维管理工具之Ansible的主要内容,如果未能解决你的问题,请参考以下文章

自动化运维工具之ansible

自动化运维工具之ansible

自动化运维工具之Ansible

大型企业中如何批量管理千万台服务器之ansible自动化运维工具详解 [⭐建议收藏⭐]

大型企业中如何批量管理千万台服务器之ansible自动化运维工具详解 [⭐建议收藏⭐]

自动化运维工具之ansible的简单应用