一、Ansible概念介绍
1、Ansible概念
ansible就是一款运用==Python语言开发==的自动化运维工具,==基于SSH协议==实现批量系统配置、批量程序部署、批量运行命令等功能 。ansible不用配置配置文件,无需启动任何服务,不需要单独安装客户端。
Ansible组成结构:
-
Ansible
Ansible的命令工具,核心执行工具;一次性或临时执行的操作都是通过该命令执行。
Ansible Playbook
是任务剧本(又称任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,==yaml格式==。
-
Inventory
Ansible管理主机的清单,默认是==/etc/ansible/hosts==文件。
-
Modules
Ansible执行命令的功能模块,截止现在2.9版本共有3387个模块,==还可以自定义模块==。
-
Plugins
插件,模块功能的补充,常有连接类型插件、循环插件、变量插件、过滤插件、插件功能用的较少。
-
API
提供给第三方程序调用的应用程序编程接口。
2、学习使用Ansible方法
==官方文档==(推荐)、系统帮助文档(ansible-doc 模块名称)、网上博客文档等三种方式
二、Ansible安装流程
1、安装软件
yum -y install ansible
2、编写Inventory文件(管理主机清单)
(1)基于密码口令连接
vim /etc/ansible/hosts
#方法一:主机+端口+用户密码
[web]
172.16.1.7 ansible_port=22 ansible_user=root ansible_password='123456'
172.16.1.8 ansible_port=22 ansible_user=root ansible_password='123456'
172.16.1.9 ansible_port=22 ansible_user=root ansible_password=123456'
#方法二:主机+用户密码
[web]
172.16.1.[7:9] ansible_user=root ansible_password='123456'
#方法三:主机+用户密码
[web]
172.16.1.[7:9]
[web:vars] #主机组变量
ansible_password='123456'
(2)基于密钥连接
ssh-keygen #ansible主机创建密钥
for i in {7..9}; do ssh-copy-id -i 172.16.1.$1; done #批量分发公钥
vim /etc/ansible/hosts
[web]
172.16.1.[7:9]
3、测试SSH连接是否正常
ssh 172.16.1.7
三、Ansible命令介绍
1、Ansible命令格式说明
2、示例
ansible web -m ping #指定主机组执行命令
ansible 172.16.1.7,172.16.1.9 -m ping #指定多台主机执行命令
ansible all -m ping #指定所有主机执行命令
四、Ansible常用模块介绍
1、查看模块帮助命令Ansible-doc
# ansible-doc -h
Usage: ansible-doc [-l|-F|-s] [options] [-t ] [plugin]
-j 以json格式显示所有模块信息
-l 列出所有的模块
-s 查看模块常用参数
#命令后直接跟模块名,显示模块所有信息
2、command模块
ansible默认的模块,注意:shell中的=="<", ">", "|", ";", "&","$"==等特殊字符不能在command模块中使用,如果需要使用,则用shell模块 。==command模块中命令别名失效。==
[root@m01 ~ 11:35:43]# ansible web -m command -a "ls -ld /etc"
172.16.1.7 | CHANGED | rc=0 >>
drwxr-xr-x. 89 root root 8192 Jul 23 20:27 /etc
[root@m01 ~ 11:35:51]# ansible web -a "ls -ld /etc"
172.16.1.7 | CHANGED | rc=0 >>
drwxr-xr-x. 89 root root 8192 Jul 23 20:27 /etc
[root@m01 ~ 11:40:09]# ansible web -a "ifconfig eth0|grep '10.0.0.7'"
172.16.1.7 | FAILED | rc=255 >>
SIOCSIFADDR: No such device
eth0|grep: ERROR while getting interface flags: No such devicenon-zero return code
3、shell模块
Ansible万能模块,专门用来执行shell命令的模块,和command模块参数基本一样,都有chdir、creates、removes等参数。==shell模块不具备状态监测功能,会重复执行==
[root@m01 ~ 11:40:30]# ansible web -m shell -a "ifconfig eth0|grep '10.0.0.7'"
172.16.1.7 | CHANGED | rc=0 >>
inet 10.0.0.7 netmask 255.255.255.0 broadcast 10.0.0.255
4、copy模块
用于管理端复制文件到远程主机,并可以设置权限、属组、属主等
(1)示例
1)推送文件到远程主机,并修改权限、属组、属主
[root@m01 ~ 12:09:21]# ansible web -m copy -a "src=/tmp/1.txt dest=/tmp mode=0600 owner=www group=www"
172.16.1.7 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"dest": "/tmp/1.txt",
"gid": 1001,
"group": "www",
"md5sum": "d41d8cd98f00b204e9800998ecf8427e",
"mode": "0600",
"owner": "www",
"size": 0,
"src": "/root/.ansible/tmp/ansible-tmp-1595650245.49-7981-38715120566747/source",
"state": "file",
"uid": 1001
}
2)添加内容到远程主机文件,并提前生成备份文件
[root@m01 ~ 12:10:46]# ansible web -m copy -a "content='zhenhao' dest=/tmp/1.txt backup=yes"
(2)模块参数
src #指定管理端被推送的文件
dest #指定推送到客户端哪儿
mode #指定推送到客户端文件的权限设置
owner #指定推送到客户端文件的属主设置
group #指定推送到客户端文件的属组设置
backup #对推送到客户端的文件进行备份
content #添加内容到客户端文件里
5、file模块
用于对远程主机文件的处理,创建,删除,权限控制等
(1)示例
1)远程主机创建目录并修改权限
[root@m01 ~ 16:49:19]# ansible web -m file -a "path=/tmp/oldboy state=directory mode=0744 owner=www group=www"
2)远程主机创建文件
[root@m01 ~ 16:54:24]# ansible web -m file -a "path=/tmp/2.txt state=touch"
3)远程主机创建软链接文件
[root@m01 ~ 16:55:10]# ansible web -m file -a "src=/tmp/2.txt path=/tmp/hh state=link"
4)远程主机删除文件
[root@m01 ~ 16:56:45]# ansible web -m file -a "path=/tmp/1.txt state=absent"
5)递归修改目录及子目录权限
[root@m01 ~ 17:00:38]# ansible web -m file -a "path=/tmp/oldboy state=directory recurse=yes mode=0600"
(2)模块参数
src #指定链接的文件路径
path #要管理设置的文件路径
mode #指定远程主机文件的权限
owner #指定远程主机文件的属主
group #指定远程主机文件的属组
recurse #递归修改目录及子目录权限
state:
absent #删除文件及目录
directory #递归创建或修改目录
file #默认为文件,但如果文件不存在,不会创建文件
hard #创建或修改硬链接
link #创建或修改软链接
touch #创建文件
6、script模块
用于在远程主机上执行脚本的模块,且远程主机上无需脚本
(1)示例
[root@m01 ~ 17:15:31]# cat >/tmp/hostname.sh <<'EOF'
> #!/bin/bash
> echo $(hostname)
> EOF
[root@m01 ~ 17:29:49]# ansible web -m script -a "/tmp/hostname.sh"
7、cron模块
用于在远程主机上设置定时任务
(1)示例
1)创建定时任务
[root@m01 ~ 17:30:14]# ansible web -m cron -a "job='echo $(hostname)' minute=*/5 name=hostname"
2)注释定时任务(==只能注释ansible创建的定时任务==)
[root@m01 ~ 17:41:28]# ansible web -m cron -a "name=hostname disabled=yes job='echo $(hostname)'"
3)删除定时任务(==只能删除ansible创建的定时任务==)
[root@m01 ~ 17:41:54]# ansible web -m cron -a "name=hostname state=absent"
(2)模块参数
minute #多少分钟
hour #多少小时
day #多少日
month #多少月
weekday #多少周
job #执行的定时任务命令
name #设置的定时任务名称
disabled #对设置的定时任务进行注释
state:
absent #删除设置的定时任务
8、user模块
用于对远程主机用户的管理,用户的创建、删除、家目录、属组等设置
(1)示例
1)创建系统用户
[root@m01 ~ 17:43:48]# ansible web -m user -a "uid=2020 group=www shell=/sbin/nologin name=www create_home=no"
2)删除用户
[root@m01 ~ 17:43:48]# ansible web -m user -a "name=www state=absent"
3)删除用户及家目录
[root@m01 ~ 18:09:19]# ansible web -m user -a "name=hostname state=absent remove=yes"
(2)模块参数
create_home:
no #不创建家目录
group #指定用户的用户组名称
home #指定用户家目录的路径
name #用户的名称
remove:
yes #移除用户家目录
shell #指定用户shell解释器路径
state:
absent #删除用户
uid #设置用户uid
9、group模块
用于对远程主机用户组的管理
(1)示例
1)创建用户组
[root@m01 ~ 18:10:52]# ansible web -m group -a "gid=2020 name=www"
2)删除用户组
[root@m01 ~ 18:10:52]# ansible web -m group -a "name=www state=absent"
(2)模块参数
gid #指定用户组GID
name #指定用户组名称
state:
absent #删除用户组
10、yum模块
用于对远程主机软件包的管理,下载、安装、卸载、升级等操作
(1)示例
1)安装软件
[root@m01 ~ 18:31:01]# ansible web -m yum -a "name=htop state=installed"
2)卸载软件
[root@m01 ~ 18:31:01]# ansible web -m yum -a "name=htop state=removed"
(2)模块参数
name #指定软件包的名称
state:
installed, present #安装软件包(两者任选其一都可以)
removed, absent #卸载软件包
latest #安装最新软件包
list:
installed #列出所有已安装的软件包
updates #列出所有可以更新的软件包
repos #列出所有的yum仓库
11、systemd模块
服务模块,用于对远程主机服务进行管理,服务的启动、关闭、开机自启等 ,==和service模块效果一样==
(1)示例
1)开启服务
[root@m01 ~ 18:31:01]# ansible web -m systemd -a "name=nginx state=started"
2)停止服务
[root@m01 ~ 18:31:01]# ansible web -m systemd -a "name=nginx state=stopped"
3)关闭开机自启服务
[root@m01 ~ 18:44:42]# ansible web -m systemd -a "name=nginx enabled=no"
4)开启开机自启服务
[root@m01 ~ 18:46:34]# ansible web -m systemd -a "name=nginx state=started enabled=yes"
(2)模块参数
enabled:
no #默认,关闭开机自启
yes #开启开机自启
name #服务名称
state:
reloaded #重新加载服务
restarted #重启服务
started #开启服务
stopped #停止服务
12、mount模块
用于管理远程主机挂载相关操作
(1)示例
1)挂载NFS目录,并写入fstab文件
[root@m01 ~ 19:15:31]# ansible web -m mount -a "src=172.16.1.31:/data path=/mnt fstype=nfs opts=defaults state=mounted"
2)卸载挂载目录,并删除写入fstab的配置
[root@m01 ~ 19:16:13]# ansible web -m mount -a "path=/mnt state=unmounted"
(2)模块参数
fstype #指定挂载系统文件类型
opts #指定挂载其他参数设置
path #挂载点路径
src #需要挂载的设备路径
state:
absent #卸载挂载点并删除写入fstab配置
mounted #进行挂载并写入fstab配置
present #只写入fstab配置,不挂载
unmounted #只卸载挂载点,不删除写入fstab配置
remounted #强制重新挂载
13、unarchive模块
用于解压压缩包到远程主机,或在远程主机上解压压缩包
(1)示例
[root@m01 ~ 19:19:05]# ansible 172.16.1.31 -m unarchive -a "src=/opt/sys.tar.gz dest=/opt/"
(2)模块参数
src #指定需要解压的压缩包路径
dest #指定解压到哪儿
remote_src:
yes #指定压缩包在远程主机上
14、archive模块
用于打包文件到远程主机,或在远程主机上进行打包文件
(1)示例
[root@m01 ~ 19:16:13]# ansible 172.16.1.31 -m archive -a "path=/var/log/message dest=/tmp/log.tar.gz format=gz force_archive=true"
(2)模块参数
force_archive:
yes #强制进行压缩存档
format: #指定压缩格式,默认gz
bz2
gz
tar
xz
zip
path #需要压缩的文件
dest #压缩包名
remove: #压缩存档后,删除压缩源文件
no
yes
15、fetch模块
用于从远程主机上面拉取文件,拉取下来的内容会保留目录结构,一般情况用在收集远程主机的日志文件等
(1)示例
[root@m01 ~ 20:00:59]# ansible web -m fetch -a "src=/tmp/2.txt dest=/tmp"
(2)模块参数
src #指定拉取的文件路径
dest #拉取到本地哪儿
#默认会已管理节点地址创建一个目录,并存放在内
16、setup模块
获取远程主机信息
(1)示例
[root@m01 ~ 20:04:16]# ansible web -m setup