Ansible
简单介绍:ansible就是用python写的,自动化运维工具,可以批量管理,批量分发,批量执行,维护等;
常见的批量管理工具:
Ansible:无客户端,基于ssh进行管理与维护;
Saltstack:需要安装客户端,基于ssh进行管理;
terraform:tf批量管理基础设施(批量创建100台公有云等);
其他等...
============================================================================
Ansible管理架构
Inventory 主机清单:被管理主机的ip列表,分类.
ad-hoc模式: 命令行批量管理(使用ans模块),临时任务.
playbook 剧本模式: 类似于把操作写出脚本,可以重复运行这个脚本
============================================================================
实验:
先安装:
[root@m01 ~]# yum -y install ansible
第二步,修改配置文件,主要在71行和111行,将注释打开
[root@m01 ~]# vim /etc/ansible/ansible.cfg
[root@m01 ~]# egrep -vn '^$|#' /etc/ansible/ansible.cfg
10:[defaults]
71:host_key_checking = False
111:log_path = /var/log/ansible.log
327:[inventory]
340:[privilege_escalation]
346:[paramiko_connection]
370:[ssh_connection]
431:[persistent_connection]
445:[accelerate]
460:[selinux]
469:[colors]
485:[diff]
============================================================================
Ans-inventory主机清单,就是控制主机列表;
ansible默认读取在/etc/ansible/hosts文件,并非/etc/hosts.
未来实际使用中一般我们会把主机清单文件存放在指定的目录中,运行ansible的时候通过-i选项指定主机清单文件即可。
主机清单格式:
[分类或分组的名字] #注意分类要体现出服务器的作用
ip地址或主机名或域名 #注意主机名要能解析才行
[root@m01 ~]# cat /etc/ansible/hosts
[web]
172.16.1.7
[backup]
172.16.1.41
[nfs]
172.16.1.31
下面执行一条简单的命令
[root@m01 ~]# ansible all -m ping
命令分析:
all:所有分组主机,此处可以换成web/backup/nfs,换成谁,就对哪个分组有效;
-m:指定模块,此处用了ping;
结果:结果就不粘出来了,默认机器通的话,是绿色的,会有SUCCESS关键字,失败的就是ping不通,会有红色结果提示,可以看关键字,有什么提示,看怎么解决;
还有个参数,-a,指定模块中的选项,以后会用到;
------------------------------------------------------------------
关于子组,比如,希望对backup,nfs2个分组,再创建个分区叫data分组。
子组使用children关键词创建
格式:
[data:children] #组名字:children即可.
分组的名字
... //看示例
[root@m01 ~]# cat /etc/ansible/hosts
[web]
172.16.1.7
[backup]
172.16.1.41
[nfs]
172.16.1.31
[data:children]
backup
nfs
============================================================================
注:以上的实验,都是基于ssh免密登录实现的,如果没有免密登录,也可以指定用户名、密码,但不推荐,方式如下,在/etc/ansible/hosts中指定:
[root@m01 ~]# cat /etc/ansible/hosts
[web]
172.16.1.7 ansible_user=root ansible_password=1 ansible_port=22
============================================================================
Ansible必会模块
Ansible模块概述:
ansible中的模块就类似于Linux中的命令,我们Linux命令管理系统,我们通过ansible模块实现批量管理;
ansible中模块一般相当于Linux中的一些命令,如:yum模块,file模块,user模块;
ansible中的模块拥有不同的选项,这些选项一般都是一些单词,拥有自己的格式与要求。
----------------------------------------------------------------------
查看模块的帮助,可以通过ansible-doc -s 模块名查看,操作类似于vi
[root@m01 ~]# ansible-doc -s systemd/file/...
----------------------------------------------------------------------
命令和脚本模块:
command模块,ans默认的模块,执行简单命令,不支持特殊符号;
shell模块,执行命令,支持特殊符号;
script模块,分发脚本并执行;
文件:
file,创建目录,文件,软链接;
copy,远程分发文件,修改权限,所有者,备份;
服务:
systemd,服务管理;
service,服务管理(老系统用);
软件包:
yum源,yum_repository,
yum命令,
get_url下载软件;
系统管理:
mount模块,挂载;
cron模块,定时任务;
用户管理:
group模块,管理用户组;
user模块,管理用户;
其他可以研究:压缩解压(unarchive),rsync模块(synchronize),数据库模块(mysql_db,mysql_user)...
其他:ansible管理docker | k8s | zabbix | grafana...
用于调试模块:ping 模块检查 ,ansible与其他节点连通性。
debug模块,用于检查/显示 变量
============================================================================
command模块,是ans默认的模块,适用于执行简单的命令,不支持特殊符号。
例1:批量获取所有主机的主机名,批量执行hostname命令
[root@m01 ~]# ansible all -m command -a 'hostname'
[root@m01 ~]# ansible all -a 'hostname' #这两种方法一样,因为是默认模块
---------------------------------------------------------
shell模块,与command模块类似,但是shell支持特殊符号;
案例02:批量删除/tmp/下面所有内容
[root@m01 ~]# ansible all -m shell -a 'rm -rf /tmp/*'
#输入这个命令,会有紫色(粉红吧)的提示,告诉你这个rm是危险滴命令, 但提示归提示,还是会执行rm命令滴;
案例03,批量获取ip地址
[root@m01 ~]# ansible all -m shell -a "ip a s eth0 | awk -F'[ /]+' 'NR==3{print \$3}'"
案例:更新yum源
[root@m01 ~]# ansible all -i /etc/ansible/allhosts -m shell -a 'curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo'
[root@m01 ~]# ansible all -i /etc/ansible/allhosts -m shell -a 'curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo'
注:shell模块不推荐执行较为复杂的指令,如果需要执行放在脚本中执行,避免因为特殊符号和引号导致的问题。
---------------------------------------------------------
script模块,执行流程:分发脚本(传输脚本),在被管理端运行脚本;
先随便写一个脚本,比如,输出主机名,等等;
[root@m01 ~]# cat /server/script/ansible-test-scripts.sh
#!/bin/bash
#author: mclind
#desc: this is a ansible test scripts
hostname
hostname -I
ip a s eth0 | awk -F'[ /]' 'NR==3{priint $3}'
uptime
whoami
date +%F
sleep 10
[root@m01 ~]# ansible all -m script -a '/server/script/ansible-test-scripts.sh'
============================================================================