Bootstrap

【Ansible】自动化运维工具

一,安装

# 在控制端安装
yum install -y epel-release     #先安装epel源
yum install -y ansible

# 查看版本
ansible --version

目录结构:

/etc/ansible/
|——ansible.cfg              # ansible的配置文件,一般无需修改
|——hosts                   	# ansible的主机清单,用于存储需要管理的远程主机的相关信息
|——roles/                   # 公共角色目录

二,配置

1,主机清单 /etc/ansible/hosts

# cat /etc/ansible/hosts

# Ex 1: 无分组主机写法.
green.example.com
blue.example.com
192.168.100.1
192.168.100.10

# Ex 2: 有分组主机写法.例如分组名为:'webservers' 
[webservers]
alpha.example.org
beta.example.org
192.168.1.100
192.168.1.110
www[001:006].example.com  # 代表www001.example.com ~ www006.example.com 共6个主机名

2,认证方式

2-1 公钥认证

将当前主机公钥发给指定机器:例如:192.168.40.101

ssh-keygen -t rsa			   #一路回车,使用免密登录
sshpass -p '123456' ssh-copy-id root@192.168.111.80
sshpass -p '123456' ssh-copy-id root@192.168.111.90
2-2 密码认证
字段含义
ansible_user用户名
ansible_password密码
ansible_port端口

配置主机清单 /etc/ansible/hosts。以主机192.168.40.100为例:

1.给特定一台机器,添加密码,端口的信息
[web1]
172.16.1.41 ansible_port=22 ansible_password='123123'


2.给特定机器组,批量添加密码,端口的信息。并且,配置公共变量,需要分行写
[web2:vars]
ansible_port=22 
ansible_password='123123'
[web2]
172.16.1.[10:90] 

3,忽略指纹确认

# vim /etc/ansible/ansible.cfg
host_key_checking = False
# 后续就进入了认证方式阶段,选择密码,还是公钥

三,命令格式

命令格式: ansible <组名> -m <模块> -a <参数列表>

#列出所有已安装的模块,按q退出
ansible-doc -l      

# 获取所有清单里的主机名 用all
ansible all -m shell -a "hostname"

# 或者使用指定组名
ansible 组名 -m shell -a "hostname"

四,模块

以下命令均已web组为例
命令:ansible-doc --help
查看所有模块:ansible-doc -l
查看模块的说明:ansible-doc -s 模块名

  • ansible的状态,就是如下的颜色区分,看到不同的状态
    绿色:命令以用户期望的执行成功,但是状态没有发生改变
    黄色:命令以用户期望的执行成功,并且状态发生了改变
    紫色:警告信息,说明ansible提示你有更合适的用法
    红色:命令错误,执行失败
    蓝色:详细的执行过程

ping 检测目标机器存活

# ping命令 返回值为pong
ansible 组名 -m ping

command 简单命令

  • 是ansible的默认模块,可以省略
  • 命令不得用变量($HOME)
  • 命令不得出现特殊符号,如管道符 | 等
# 获取主机名
ansible web -m command -a 'hostname'
ansible web -a 'hostname'  

# 获取主机内存
ansible web -m command -a 'free -m'

# 创建文件,查看文件
ansible web -m command -a 'touch /opt/1.log'
ansible web -m command -a 'ls /opt/'

# 查看远程机器负载
ansible web -m command -a 'uptime'

# 执行命令关闭警告信息
ansible web -m command -a 'rm -rf /opt/1.log  warn=false'

# 先进入到/目录:chdir ,在备份.  
ansible web -m command -a 'tar -zcf /opt/log.tgz /var/log chdir=/'

# 目标目录不存在,则跳过执行:removes=/backup_config
ansible web -a "tar /backup_config/etc.tgz etc chdir=/ removes=/backup_config
所以事先执行如下命令才行:
ansible web -a "mkdir -p /backup_config

shell(万能模块)

  • 特殊字符需要用\转译
# 远程过滤ssh的进程信息
ansible web -m shell -a 'ps -ef | grep ssh'

# 支持重定向符合:将时间信息写入文件
ansible web -m shell -a 'date > /timg.log'

# 获取服务端的ip地址:$前需要加\
ansible web -m shell -a "ifconfig -a | grep -w inet | awk '{print \$2}'"

copy 批量分发文件

copy模块是远程推送数据模块,只能把数据推送给远程主机节点,无法拉取数据到本地。
既然是文件拷贝,可用参数也就是围绕文件属性。
在这里插入图片描述

# 将本地文件dnf.sh 发送到所有主机上,所属组为www,权限为600,并且备份(默认时间戳)
ansible web -m copy -a "src=/tmp/dnf.sh  dest=/tmp/web-dnf.sh group=www owner=www
mode=600 backup=yes"

# 直接写入内容,会覆盖内容,所以一般加入backup=yes,进行备份
ansible web -m copy -a "content='学习linux重要' dest=/tmp/web-dnf.sh backup=yes"

# 拷贝目录/opt/下的所有内容
ansible web -m copy -a "/opt/ /tmp/"

# 拷贝目录/opt,包含opt
ansible web -m copy -a "/opt /tmp/"

cron模块

  • 在远程主机定义任务计划时,有两种状态(state) :
    • present 表示添加(可以省略)
    • absent 表示移除。
  • 常用参数
参数说明
minute/hour/day/minute/weekday分/时/日/月/周
job任务计划要执行的命令
name任务计划的名称

在这里插入图片描述

ansible web -m cron -a 'minute="*/1" job="/bin/echo helloworld" name="test"'
ansible web -a 'crontab -l'
ansible web -m cron -a 'name="test" state=absent'
#移除计划任务,假如该计划任务没有取名字,name=None即可

user模块

  • 常用的参数
参数说明
name用户名,必选参数
state=presentpresent:添加 absent:移除
system=yes or no是否为系统账号
uid用户uid
group用户基本组
shell默认使用的shell
move_home=yse or no如果设置的家目录已经存在,是否将已经存在的家目录进行移动
password用户的密码,建议使用加密后的字符串
comment用户的注释信息
remove=yes or no当state=absent时, 是否删除用户的家目录
ansible web -m user -a 'name="user01"'					#创建用户user01
ansible web  -m command -a 'tail /etc/passwd'
ansible web  -m user -a 'name="user01" state=absent'	#删除用户user01

group模块

用户组管理模块

ansible web -m group -a 'name=mysql gid=306 system=yes' 	   # 创建mysq1组
ansible web -a 'tail /etc/group'
ansible web -m user -a 'name=user01 uid=306 system=yes group=mysql'	# 将user01用户添加到mysq1l组中
ansible web -a 'tail /etc/passwd'
ansible web -a 'id user01'

file 模块

ansible web -m file -a "path=/opt/abc.txt state=touch"			#创建一个文件
ansible web -m file -a "path=/opt/abc.txt state=absent"			#删除一个文件
ansible web -m file -a "path=/opt/name/ state=directory"        #创建一个文件夹

#修改文件的属主属组权限等
ansible web -m file -a 'owner=www group=www mode=644 path=/opt/fstab.bak'	
# 创建软连接文件	
ansible web -m file -a 'path=/opt/fstab.link src=/opt/fstab.bak state=link'	

hostname模块

用于管理远程主机上的主机名

ansible web -m hostname -a "name=node01"

yum模块

在远程主机上安装与卸载软件包

ansible web -m yum -a 'name=httpd'			#安装服务
ansible web -m yum -a 'name=httpd state=absent'	 #卸载服务

service / systemd 模块

用于管理远程主机上的管理服务的运行状态

  • 常用参数
参数说明
name被管理的服务名称
state=started、stopped、restarted动作包含启动关闭或者重启
enabled=yes、no表示是否设置该服务开机自启
runlevel如果设定了enabled开机自启去,则要定义在哪些运行目标下自启动
#查看web服务器httpd运行状态
ansible web -a 'systemctl status httpd'	
	
#启动httpd服务,设置开机启动						
ansible web -m systemd -a 'name=httpd state=started enabled=true'	

script模块

实现远程批量运行本地的shell脚本

# 创建一个脚本
vim test.sh
#!/bin/bash
echo "hello ansible from script" > /opt/script.txt
chmod +x test.sh
ansible web -m script -a 'test.sh'
ansible web -a 'cat /opt/script.txt'

【注意】查看命令执行详细过程:
-vvvvvv 参数显示详细过程,v越多,越详细

setup 模块

facts组件是用来收集被管理节点信息的,使用setup 模块可以获取这些信息

ansible webservers -m setup					 #获取mysql组主机的facts信息
ansible dbservers -m setup -a 'filter=*ipv4' #使用filter可以筛选指定的facts信息
;