只需一文上手批量运维工具之Ansible

前言

这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题

于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。

微信小程序搜索:Python面试宝典

或可关注原创个人博客:https://lienze.tech

也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习

Ansible

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

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

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

Ansible部署

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

  • 使用pip管理工具进行安装
pip3 install ansible
  • 使用yum进行安装
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规则设置,比如如下的例子

[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文件路径
-uSSH连接所使用用户

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

配置免密登陆

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

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

  • 在主控服务器192.168.1.104下生成秘钥
ssh-keygen -t rsa 
#-t指定加密的方式,默认为rsa
  • 进行秘钥的分发
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写入
192.168.1.101
  • 规则分组
[webserver]
192.168.1.101:2333
www.example.com

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

  • 规则命名
myhost ansible_ssh_host=192.168.1.101
[webservers]
myhost

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

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

  • ansible_ssh_host:目标主机地址

  • 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个内部命令)

  • 正则规则

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

在主机处填写对应的正则规则,可以更加方便的映射某个网段下的ip地址

Ping模块

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

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

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

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

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

./ansible webservers -m ping

Command模块

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

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

  • command支持的额外参数
./ansible-doc -s command
# 文档
参数解释
chdir执行命令时,先进入到该目录下
creates给定文件存在时,不执行该命令
free_form需要执行的脚本
removes给定文件存在,则执行该命令
  • 对远程主机执行命令
./ansible webservers -m command -a "ifconfig"
  • 执行命令时更改工作目录
./ansible webservers -m command -a "ls chdir=/home/"

Shell模块

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

./ansible-doc -s shell
# 文档
  • 额外参数
参数解释
chdir执行命令时,先进入到该目录下
creates给定文件存在时,不执行该命令
free_form需要执行的脚本
removes给定文件存在,则执行该命令
executable更换执行命令所使用的shell环境
  • 远程主机编写sh脚本,向屏幕输出hello
echo "hello"
  • 执行远程主机的shell脚本
./ansible webservers -m shell -a "sh ~/test.sh"

Script模块

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

  • 在主控制home目录下创建sh脚本
echo "this is Control"
  • 将这个sh脚本通过script模块执行到远程被控端
./ansible webservers -m script -a "/root/test.sh"

Copy模块

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

./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前备份
./ansible all -m copy -a "src=/root/ansible_copy_file backup=yes dest=/home/"

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

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

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

覆盖内容

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

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

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

Stat模块

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

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

Yum模块

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

./ansible-doc -s copy
# 文档
  • 支持参数
参数解释
name必须参数,用于指定需要管理的软件包,比如nginx
state用于指定软件包的状态,默认值为present,表示确保软件包已经安装
除了present,其他可用值有installedlatestabsentremoved
其中installedpresent等效,latest表示安装yum中最新的版本,absentremoved等效,表示删除对应的软件包
  • 在远程主机下安装nginx
./ansible all -m yum -a "name=nginx state=installed"
  • 查看nginx服务状态
systemctl status nginx

Service模块

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

./ansible-doc -s yum
# 文档
  • 支持参数
参数解释
name需要管理的服务名称,如nginx
state此参数用于指定服务的状态
比如,我们想要启动远程主机中的nginx,则可以将state的值设置为started
如果想要停止远程主机中的服务,则可以将state的值设置为stopped
此参数的可用值有startedstoppedrestartedreloaded
enabled此参数用于指定是否将服务设置为开机启动项,设置为yes表示将对应服务设置为开机启动,设置为no表示不会开机启动
  • 将远程主机下的httpd服务开启
./ansible all -m service -a "name=httpd state=started"

File模块

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

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

./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为缺席之意,当我们想让操作的目标”缺席”时,就表示我们想要删除目标
srcsrc参数:当state设置为link或者hard时,表示我们想要创建一个软链或者硬链
所以,我们必须指明软链或硬链链接的哪个文件,通过src参数即可指定链接源
forcestate=link的时候,可配合此参数强制创建链接文件,当force=yes时,表示强制创建链接文件。不过强制创建链接文件分为三种情况
情况一:当要创建的链接文件指向的源文件并不存在时,使用此参数,可以先强制创建出链接文件
情况二:当要创建链接文件的目录中已经存在与链接文件同名的文件时,将force设置为yes,会将同名文件覆盖为链接文件,相当于删除同名文件,创建链接文件
情况三:当要创建链接文件的目录中已经存在与链接文件同名的文件,并且链接文件指向的源文件也不存在,这时会强制替换同名文件为链接文件
owner指定文件所属用户
group指定文件所属组
mode指定文件权限
  • 将远程主机下的Python3创建软连接到home目录
./ansible all -m file -a "path=/home/python3 state=link src=/usr/local/python3/bin/python3"
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
自动化运维工具——ansible是一款开源的IT自动化工具,广泛应用于软件部署、配置管理和任务协同等领域。它的最大特点是简单易用、功能强大且跨平台。 首先,ansible具有简单易用的特点。它使用简单的YAML语言作为配置件,无编写复杂的脚本。用户只要简单地定义主机和操作即可完成任务的执行。这使得即便是非开发人员,也能轻松上手使用ansible进行自动化管理。 其次,ansible功能强大。它支持广泛的操作系统、云平台和网络设备,并提供了丰富的模块化功能。通过在任务中使用ansible的模块,我们可以实现系统配置、软件安装、件传输等各种常见操作。此外,ansible不仅支持并发执行任务,还能够将任务分组执行,并提供了强大的变量和条件控制功能。 再次,ansible跨平台。无论是在Linux、Unix还是Windows系统上,ansible都能够良好地运行。此外,它还支持云平台,如AWS、Azure等,以及网络设备,如Cisco、Juniper等。这使得ansible成为一个非常灵活的自动化运维工具,能够满足各种不同环境和求的自动化管理。 最后,ansible还具有良好的社区支持。ansible拥有庞大的用户社区和活跃的开发者社区,有大量的档、示例和插件可供参考和使用。这使得我们在使用ansible时能够获得快速解答和支持,同时也能够从社区中学习到更多的技巧和经验。 总而言之,ansible是一款简单易用、功能强大且跨平台的自动化运维工具。它在软件部署、配置管理和任务协同等方面具有广泛的应用,并且得到了良好的社区支持。无论是企业还是个人,都可以通过ansible来提高工作效率和自动化管理水平。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李恩泽的技术博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值