批量运维管理工具之Ansible
Posted EzLearnPython
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了批量运维管理工具之Ansible相关的知识,希望对你有一定的参考价值。
Ansible
ansible
基于Python开发,集合了众多运维工具(puppet
、cfengine
、chef
、func
、fabric
)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能在使用时,
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 |
yum install epel-release # 安装扩展源 |
Ansible配置
安装之后,默认
ansible
工具的配置文件在/etc/ansible
下如果通过pip命令安装,是没有这个目录的,需要我们手动创建,其中所需主要配置文件如下
ansible.cfg
:ansible
主配置文件hosts
:被管理主机IP
或者主机名列表文件,也是比较重要的一个文件roles
:角色或插件目录(默认为空)
此外除了默认的
ansible
的配置文件路径,关于ansible
的配置文件路径选择还有如下几种,按照顺序表示优先级
export ANSIBLE_CONFI
:指定的全局变量./ansible.cfg
:当前目录下的配置文件~/.ansible.cfg
:当前用户目录下的配置文件/etc/ansible/ansible.cfg
:etc
目录下的配置文件
如果以上四个路径下均没有
cfg
配置文件,则使用默认配置如果通过源进行安装,那么在
/etc/ansible/
目录下会自动包含ansible.cfg
文件
https://raw.githubusercontent.com/ansible/ansible/devel/examples/ansible.cfg
ansible
配置文件中可以进行ansible
的各项参数的设置,包括并发线程数量、用户、模块路径、调优等等defaluts
:默认的配置项,一般不需要修改privilege_escalation
:执行命令的用户权限设置paramiko_connection
:paramiko
插件设置ssh_connection
:ssh
连接设置默认
ansible
使用hosts
文件列举监控主机,格式为ini
,可以进行IP
的分组以及IP
规则设置,比如如下的例子
1 |
[webserver] |
ansible
支持很多模块来进行对被控主机的管理,包括:command
、shell
、script
、yum
、copy
、File
、async
、docker
、cron
、mysql_user
、ping
、sysctl
、user
、acl
、add_host
、easy_install
、haproxy
等。默认在执行命令时,使用模块为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 |
ssh-keygen -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 |
[webserver] |
可以在规则的
IP
后指定端口
规则命名
1 |
myhost ansible_ssh_host=192.168.1.101 |
在使用时,直接利用
myhost
即可除去示例中的指定方式,还有如下一些参数可以利用
ansible_ssh_port
:目标主机ssh
服务端口ansible_ssh_user
:目标主机ssh
登录用户ansible_ssh_pass
:目标主机ssh
登录密码ansible_connection
:连接类型:local
、ssh
、paramiko
ansible_ssh_priveate_key_file
:连接所需ssh
私钥文件;ansible_shell_type
:目标主机的shell类型:ash
、bash(默认使用的shell
,可以结合help
查看帮助文档)、ksh
(支持42个内部命令)、csh
、zsh
(最庞大的shell,支持84个内部命令)正则规则
1 |
[webservers] |
Ping模块
ping模块可以判断被控主机是否在线, 返回值为changed和ping
首先在
/etc/ansible/hosts
文件下添加被控主机,并建立分组为webservers
1 |
[webservers] |
ping
命令的用法,要进入到python
安装目录下,找到对应的ansible
可执行文件
1 |
./ansible all -m ping |
返回值
ping
如果为pong
则代表可以ping
通
ansible
命令行第二个参数可以是一个主机的正则规则,all
代表所有hosts
文件下IP
,也可以指定使用某个分组
1 |
./ansible webservers -m ping |
Command模块
通过
ansible
执行命令时,默认使用command
模块,该模块主要用于执行linux
基础命令
注意:对比之后的
Shell
及Script
功能模块,Command
模块不支持管道command
支持的额外参数
1 |
./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 |
./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 |
./ansible-doc -s copy |
支持的参数
参数 | 解释 |
---|---|
src |
将本地路径复制到远程服务器; 可以是绝对路径或相对的。如果是一个目录,它将被递归地复制。如果路径以/结尾,则只有该目录下内容被复制到目的地,如果没有使用/来结尾,则包含目录在内的整个内容全部复制 |
content |
当用content 代替src 参数的时候,可以把文档的内容设置到特定的值 |
dest |
目标绝对路径。如果src 是一个目录,dest 也必须是一个目录。如果dest 是不存在的路径,并且如果dest 以/结尾或者src 是目录,则dest 被创建。如果src 和dest 是文件,如果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 |
./ansible-doc -s copy |
支持参数
参数 | 解释 |
---|---|
name | 必须参数,用于指定需要管理的软件包,比如nginx |
state | 用于指定软件包的状态,默认值为present ,表示确保软件包已经安装除了 present ,其他可用值有installed 、latest 、absent 、removed 其中 installed 与present 等效,latest 表示安装yum 中最新的版本,absent 和removed 等效,表示删除对应的软件包 |
在远程主机下安装
nginx
1 |
./ansible all -m yum -a "name=nginx state=installed" |
查看
nginx
服务状态
1 |
systemctl status nginx |
Service模块
该模块主要用于远程服务器上对应的服务管理,比如开启或关闭
apache
服务等
1 |
./ansible-doc -s yum |
支持参数
参数 | 解释 |
---|---|
name |
需要管理的服务名称,如nginx |
state |
此参数用于指定服务的状态 比如,我们想要启动远程主机中的 nginx ,则可以将state 的值设置为started 如果想要停止远程主机中的服务,则可以将 state 的值设置为stopped 此参数的可用值有 started 、stopped 、restarted 、reloaded |
enabled |
此参数用于指定是否将服务设置为开机启动项,设置为yes 表示将对应服务设置为开机启动,设置为no 表示不会开机启动 |
将远程主机下的
httpd
服务开启
1 |
./ansible all -m service -a "name=httpd state=started" |
File模块
file
模块可以帮助我们完成一些对文件的基本操作比如,创建文件或目录、删除文件或目录、修改文件权限等
1 |
./ansible-doc -s yum |
支持参数
参数 | 解释 |
---|---|
path |
指明需要操作的文件或目录路径 |
state |
此参数非常灵活,其对应的值需要根据情况设定。比如,我们想要在远程主机上创建/testdir/a/b 目录,那么则需要设置path=/testdir/a/b ,但是,我们无法从/testdir/a/b 这个路径看出b 是一个文件还是一个目录,ansible 也同样无法单单从一个字符串就知道你要创建文件还是目录,所以,我们需要通过state 参数进行说明当我们想要创建的 /testdir/a/b 是一个目录时,需要将state 的值设置为directory ,directory 为目录之意,当它与path 结合,ansible 就能知道我们要操作的目标是一个目录当我们想要操作的 /testdir/a/b 是一个文件时,则需要将state 的值设置为touch 当我们想要创建软链接文件时,需将 state 设置为link ;想要创建硬链接文件时,需要将state 设置为hard 当我们想要删除一个文件时(删除时不用区分目标是文件、目录、还是链接),则需要将 state 的值设置为absent ,absent 为缺席之意,当我们想让操作的目标”缺席”时,就表示我们想要删除目标 |
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自动化运维工具详解 [⭐建议收藏⭐]