通过ansible批量管理Linux服务器:配置Inventory和批量执⾏
命令
ansible是⼀款⽐较新的⾃动化运维⼯具,基于Python开发,集合了众多运维⼯具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运⾏命令等功能。
ansible是基于模块⼯作的,本⾝没有批量部署的能⼒。真正具有批量部署的是ansible所运⾏的模块,ansible只是提供⼀种框架。主要包括:
(1)、连接插件connection plugins:负责和被监控端实现通信;
(2)、host inventory:指定操作的主机,是⼀个配置⽂件⾥⾯定义监控的主机;
(3)、各种模块:核⼼模块、command模块、⾃定义模块;
(4)、借助于插件完成记录⽇志邮件等功能;
(5)、playbook:剧本执⾏多个任务时,⾮必需可以让节点⼀次性运⾏多个任务。
ansible的安装部署我这⾥就不讲了,可以参考官⽅⽂档。这⾥我将分成三个部分进⾏讲解:1、配置Inv
entory,2、批量执⾏命令,3、playbook作业。
系统环境:
服务器IP地址操作系统所需软件
ansible主机192.168.2.203Centos 7 64位ansible
远程机器1192.168.2.205Centos 7 64位httpd
远程机器2192.168.2.208Centos 7 64位httpd
⼀、ansible常⽤的五个命令
⼆、创建ssh key授权
ansible是通过ssh⽅式管理远程服务器的,所以⾸先需要先打通ssh通道。我们在管理⼤批量服务器时,为了避免远程操作时重复输⼊密码,最好使⽤sshd服务的安全密钥验证⽅式。
通过ssh-keygen来管理密钥,即使在创建密钥时设置了密码,执⾏过ssh-add之后,会创建⼀个新的会话,以后的每次连接都⽆须输⼊密钥密码了。建议使⽤ssh key授权⽅式,并且不要设置密钥密码,这
样可以更好地实现⾃动化。
ssh-keygen  # 创建公钥和私钥⽂件
ssh-copy-id 192.168.2.205  # 将公钥⽂件copy到远程主机上
ssh-copy-id 192.168.2.208
ssh-agent bash  # 通过ssh-agent来管理密钥
ssh-add ~/.ssh/id_rsa  # 将私钥交给ssh-agent管理,避免每次连接都需要输⼊密钥密码
三、配置Inventory⽂件
默认的Inventory⽂件是/etc/ansible/hosts,格式与windows的ini配置⽂件类似
1、按IP地址来配置
例如:我现在有2台主机,IP地址分别为192.168.2.205和192.168.2.208,并且两台主机都是web服务器,那么可以定义⼀个
web_server组,如下:
[web_server]
192.168.2.205
192.168.2.208
如果修改了ssh端⼝号的话,可以按如下⽅式来定义:
192.168.2.205:5210
192.168.2.208:5210
如果我有⼀台主机IP为192.168.2.203不属于任何组,可以按如下⽅式来定义:
192.168.2.203
[web_server]
192.168.2.205
192.168.2.208
给主机设置⼀个别名,在这个例⼦中,通过“webserver1”别名,会连接192.168.2.205。
Webserver1 ansible_ssh_port=5210 ansible_ssh_host=192.168.2.205
Webserver2 ansible_ssh_port=5210 ansible_ssh_host=192.168.2.208
可以单独设置连接⽤户名和连接类型:
[web_server]
192.168.2.203      ansible_connection=local
192.168.2.205:5210  ansible_connection=ssh  ansible_ssh_user=xuad
192.168.2.208:5210  ansible_connection=ssh  ansible_ssh_user=andyxu
2、按主机名配置
按主机名配置和按IP地址配置⼀样,只需把IP改成主机名即可,例如:
[web_server]
web1
web2
[db_server]
db1:5210
db2:5210
[targets]
ansible      ansible_connection=local
other1:5210  ansible_connection=ssh  ansible_ssh_user=xuad
Other2:5210  ansible_connection=ssh  ansible_ssh_user=andyxu
例如有⼀组db服务器,分别为db1.xuad到db50.xuad,共50台db服务器
[db_server]
db[1:50].xuad:5210
如果是dba.xuad到dbf.xuad,共6台db服务器
[db_server]
db[a:f].xuad:5210
3、给主机设置变量
分配变量给主机很简单,这些变量定义后可在playbooks中使⽤。
web1  http_port=80  pathname=/etc/httpd/
web2  http_port=8081  pathname=/etc/nginx/
4、给组分配变量
下⾯例⼦是给web_server组定义两个变量,http_port和pathname。
[web_server]
web1
web2
[web_server:vars]
http_port=80
pathname=/etc/httpd/
5、把⼀个组作为另⼀个组的⼦成员
下⾯例⼦是把web_server和db_server两个组分配给some_server组,作为some_server组的⼦组,并分配变量给some_server组使⽤,再把some_server组分配给user_server组,作为user_server组的⼦组。
[web_server]
192.168.2.205
192.168.2.208
[db_server]
db1:5210
db2:5210
[some_server:children]
web_server
db_server
[some_server:vars]
http_port=80
nginx_port=8080
pathname=/etc/ansible/
xuad=foo.xuad
[user_server:children]
some_server
other_server
Northserver
6、分⽂件定义主机和组变量
假设有⼀台主机为192.168.2.205,属于web_server组,现在分别给web_server组和192.168.2.205主机定义变量,那么hosts⽂件增加如下内容:
/etc/ansible/group_vars/web_server
/etc/ansible/host_vars/192.168.2.205
创建group_vars和host_vars⽬录
mkdir /etc/ansible/group_vars
mkdir /etc/ansible/host_vars
然后编辑web_server⽂件,可按如下内容定义变量,注意:号后⾯有个空格。
vim /etc/ansible/group_vars/web_server
http_path: /data/httpd/
ntp_server: ntp.xuad
db_server: db1
再编辑192.168.2.205⽂件,可按如下内容定义变量
vim /etc/ansible/host_vars/192.168.2.205
nginx_port: 8081
nginx_path: /data/nginx/
db_server: db2
还有更进⼀步的运⽤,可以为⼀个主机或者⼀个组创建⼀个⽬录,⽬录名就是主机名或组名,⽬录中可以创建多个⽂件,⽂件中的变量都会被读取为主机或组的变量,host⽂件内容如下:
/etc/ansible/group_vars/web_server/192.168.2.205
/etc/ansible/group_vars/db_server/db1
Inventory⽂件的参数可以查看ansible官⽅⽂档,下⾯我们来看官⽅⽂档的⼀个主机⽂件的例⼦,并说明每⾏都是什么意思。
#给some_host主机定义了ssh连接的端⼝号和⽤户名
some_host        ansible_ssh_port=2222    ansible_ssh_user=manager
#连接aws_host主机时将通过以下定义的私钥⽂件进⾏验证
aws_host          ansible_ssh_private_key_file=/home/example/.ssh/aws.pem
#给freebasd_host主机指定了python的路径
freebsd_host      ansible_python_interpreter=/usr/local/bin/python
#给ruby_module_host主机指定了ruby运⾏的路径
ruby_module_host  ansible_ruby_interpreter=/usr/bin/ruby.1.9.3
ansible还可以从外部获取Inventory配置信息,获取途径有以下⼏种:
1、从云端拉取inventory
2、从LDAP获取配置
3、从cobbler获取配置
4、从CMDB获取配置
从外部获取inventory配置的⽅法我这⾥就不讲了,有兴趣的可以查看官⽅⽂档。
四、ansible批量执⾏命令
⾸先在inventory的配置⽂件/etc/ansible/hosts⾥定义⼀个主机组,内容如下:
vim /etc/ansible/hosts
(1)我们先来ping⼀下,看下两台主机的连通情况
ansible web_server -m ping
(2)查看web_server组下有哪些主机
ansible web_server --list
(3)查看⼀台主机的内存使⽤情况
命令格式:ansible <;主机或主机组> -a “shell命令”
注:执⾏⼀条命令使⽤-a参数,后⾯跟shell命令
ansible 192.168.2.205 -a "free -h"
(4)在web_server组批量创建⼀个普通⽤户
ansible web_server -a "useradd andy"
(5)重启所有主机的httpd服务
命令格式:ansible <;主机组> -m <;模块名称> -a <;指定执⾏参数>
注:使⽤all参数就是对hosts⽂件⾥配置的所有主机执⾏命令
ansible all -m service -a "name=httpd state=restarted"
也可以使⽤ansible all -a "systemctl restart httpd"语句,结果是⼀样的,但输出信息不同,可⾃⾏测试看看。linux查看当前文件夹内容
(6)查看多个组下各主机指定⽤户的UID和GID
命令格式:ansible <;主机组1>:<;主机组2>:<;主机组3> -a "shell命令"
ansible http1:http2 -a "id andy"
(7)排除⼀个特定组,在web_server组下的不属于http1组的主机的/tmp⽬录下新建⼀个⽂件
命令格式:ansible '<;主机组1>:!<;主机组2>' -a "shell命令"
注:执⾏命令的主机属于webserver组,但不属于http1组
ansible 'web_server:!http1' -a "touch /"
此时ansible会给出⼀个警告信息,意思是说ansible已经内置有file模块,建议使⽤file模块创建⽂件,如果想取消警告信息,可以修改配置⽂件ansible.cfg,把command_warnings参数改成False,就不会再给出警告信息了。其实创建⽂件可以使⽤下⾯这条命令,结果是⼀样的,关于模块的使⽤后⾯会讲到。
ansible 'web_server:!http1' -m file -a "dest=/ state=touch"
(8)指定两个组的交集,查看属于web_server组⼜属于http1组的主机的负载情况
注:!表⽰属于前⾯的组但不属于后⾯的组;&表⽰即属于前⾯的组也属于后⾯的组。
ansible 'web_server:&http1' -a "uptime"
(9)在即属于web_server组⼜属于http2组但不属于http1组的主机删除/⽂件内容
ansible 'web_server:!http1:&http2' -a "rm -f /"
(10)通配符使⽤,查看以http开头的所有组的主机的字符编码
ansible http* -a "cat /f"
(11)查看以http开头的所有组和web_server组的所有主机的磁盘使⽤情况
ansible http*:web_server -a "df -h"
(12)查看web_server组的第⼀台主机的hostname
ansible web_server[0] -a "hostname"
(13)查看web_server组的前5台主机的当前⽇期和时间
ansible web_server[0:4] -a "date '+%Y-%m-%d %H:%M:%S'"
(14)正则表达式使⽤,查看以web或者http开头的组的主机的httpd服务的进程PID
ansible '~(web|http)*' -a "pidof httpd"
(15)其它正则表达式例⼦

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。