自动化运维工具——ansible入门详解
文章目录
ansible是做什么的
1)当服务器增多,如果全靠人工一台一台的去配置,耗时耗力,所以现在可以用ansible解决上百台服务器配置问题
2)当前主流的自动化工具
ansible的配置
1)所有配置的服务器都通过m01服务器统一管理,ansible配置在m01上
2)ansible安装,编写主机清单,创建目录
ansible安装
[root@m01 ~]# yum install -y ansible
搭建本地yum服务器
##m01构建本地yum库,使用apache搭建web服务,通过http协议实现
##安装httpd
[root@m01 ~]# yum install -y httpd
##启动httpd
[root@m01 ~]# systemctl start httpd
[root@m01 ~]# systemctl enable httpd
##将所有需要提供安装的rpm包都放到/var/www/html目录下
##安装createrepo软件包
[root@m01 ~]# yum install -y createrepo
##将/var/www/html目录建立成yum仓库
[root@m01 ~]# createrepo /var/www/html
##其他服务器需要使用m01来安装软件包,只需在/etc/yum.repos.d/目录创建一个仓库文件
vim local.repo
[local]
baseurl=http://10.0.0.61
gpgcheck=0
编写主机清单
##编写主机清单 - - 连接被控端有两种方法:
##方法一:配置主机ssh密码
[root@m01 ~]# vim /etc/ansible/hosts
[web]
10.0.0.7 ansible_ssh_pass='111'
10.0.0.8 ansible_ssh_pass='111'
[nfs]
10.0.0.31 ansible_ssh_pass='111'
##为什么要写ansible_ssh_pass='111'
答:因为远程ssh主机密码需要加密,不然解析不了
默认情况下,使用密码,需要进行ssh指纹检测,需要通过修改配置文件将该功能关掉
[root@m01 ~]# sed -i '/host_key_checking/s@^#@@' /etc/ansible/ansible.cfg
##方法二:ssh密码配对
[root@m01 ~]# vim /etc/ansible/hosts
[web]
10.0.0.7
10.0.0.8
[nfs]
10.0.0.31
##免交互生成密钥对
[root@m01 ~]# ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
##将公钥发送给被控设备
[root@m01 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@10.0.0.7
[root@m01 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@10.0.0.8
[root@m01 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@10.0.0.31
测试是否能连接上
连接成功!!!
清单文件编写方式
##方式一:直接写ip地址或主机名(要求能解析)
[root@m01 ~]# vim /etc/ansible/hosts
10.0.0.7/web01
10.0.0.8/web02
10.0.0.31/nfs
##方式二:用群组来分类
[root@m01 ~]# vim /etc/ansible/hosts
[web]
web01
web02
[db]
db01
db02
[lb]
lb01
lb02
##方式三:群组的plus版,推荐
[root@m01 ~]# vim /etc/ansible/hosts
[php]
web01
web02
[java]
web03
web04
[web:children]
php
java
##方式四:应用变量
[root@m01 ~]# vim /etc/ansible/hosts
[web]
web01 ansible_ssh_password='111'
web02 ansible_ssh_password='111'
或
[web]
web01
web02
[web:vars]
ansible_ssh_password='111'
案例1:
##lnmp项目成员web:10.0.0.7和10.0.0.8,nfs:10.0.0.31,ssh的root密码都是111,如何用清单文件标示清楚
[root@m01 ~]# vim /etc/ansible/hosts
[lnmp:children]
web
nfs
[lnmp:vars]
ansible_ssh_password='111'
[web]
10.0.0.7
10.0.0.8
[nfs]
10.0.0.31
ansible目录结构
[root@m01 ~]# tree /etc/ansible/
/etc/ansible/ #安装路径
├── ansible.cfg #ansbile的配置文件
├── hosts #ansible的主机清单文件inventory
└── roles #ansible的角色(ansible高级课程)ansible的命令选项
- –version:显示版本
- -v:详细过程 -vv -vvv -vvvv
- –list-hosts:显示主机列表,可简写–list
- -k:–ask-key 提示输入ssh连接密码,默认是key验证
- -K:–ask-become-key 提示输入sudo的口令
- -C:–check 检查,并不执行
- -u:–user=REMOTE_USER 远程执行的用户
- -b:–become 代替旧版的sudo切换
- -m:调用的功能模块
- -a:配合-m,调用该模块的参数
ansible模块应用
ansible ad-hoc 常用模块
1)ping模块
2)command | shell 模块
3)script脚本模块
4)yum模块
5)copy模块
6)file模块
7)group/user模块
8)sevice 模块/systemd模块
ping模块
##用于测试连通性
[root@m01 ~]# ansible all -m ping
command | shell 模块
ansible的默认模块为command
ansible 主机名 [-m command] -a ‘简单的shell命令’
ansible 主机名 -m shell -a ‘复杂的shell命令’
复杂表示带有管道符或其他命令连接符(; && ||)
案例:
##案例1:查看所有host主机名
[root@m01 ~]# ansible all -m -a command 'hostname'
[WARNING]: sftp transfer mechanism failed on [10.0.0.31]. Use ANSIBLE_DEBUG=1 to see
detailed information
[WARNING]: sftp transfer mechanism failed on [10.0.0.7]. Use ANSIBLE_DEBUG=1 to see
detailed information
[WARNING]: sftp transfer mechanism failed on [10.0.0.8]. Use ANSIBLE_DEBUG=1 to see
detailed information
10.0.0.31 | CHANGED | rc=0 >>
nfs
10.0.0.7 | CHANGED | rc=0 >>
web01
10.0.0.8 | CHANGED | rc=0 >>
web02
##案例2:查看nfs的用户登录数量
[root@m01 ~]# ansible nfs -m shell -a 'who |wc -l'
[WARNING]: sftp transfer mechanism failed on [10.0.0.31]. Use ANSIBLE_DEBUG=1 to see
detailed information
10.0.0.31 | CHANGED | rc=0 >>
2
##案例3:在nfs主机上创建zz用户
[root@m01 ~]# ansible nfs -m shell -a 'useradd zz'
[WARNING]: sftp transfer mechanism failed on [10.0.0.31]. Use ANSIBLE_DEBUG=1 to see
detailed information
10.0.0.31 | CHANGED | rc=0 >>
#查看nfs上是否存在zz用户
[root@nfs ~]# id zz
uid=1000(zz) gid=1000(zz) groups=1000(zz)
##案例4:在web01上安装nginx
[root@m01 ~]# ansible 10.0.0.7 -m yum -a 'name=nginx state=present'
#在web01上查看是否安装了nginx
[root@web01 ~]# yum list nginx
Loaded plugins: fastestmirror
Repository 'local' is missing name in configuration, using id
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
Installed Packages
nginx.x86_64 1:1.20.1-9.el7 @epel
script脚本模块
##在本地运行模块,等同于在远程执行,不需要将脚本文件进行推送目标主机执行
##案例1:在m01上创建一个简单的创建用户并修改密码的脚本
[root@m01 ~]# vim useradd.sh
#!/bin/bash
useradd qjj
echo 123 | passwd --stdin test &>/dev/null
ansible all -m script -a '/root/useradd.sh'
yum模块
##常用参数
name —指定要安装的软件包名称
state —指定使用yum的方法
installed,present —安装软件包(默认)
removed,absent —移除软件包
latest —安装最新软件包
案例
##案例1:
##在web01上安装nginx
[root@m01 ~]# ansible 10.0.0.7 -m yum -a 'name=nginx state=present'
##在web01上卸载nginx
[root@m01 ~]# ansible 10.0.0.7 -m yum -a 'name=nginx state=absent'
##案例2:
##批量安装软件
【ansible的各种模块中,除了shell模块可以用*,其他都不能用,所以批量安装软件,需要将软件包都写在name参数中】
[root@m01 ~]# ansible 10.0.0.7 -m yum -a 'name=nginx,mysql-community-server,php72w-cli,php72w-gd,php72w-fpm,php72w-mysqlnd state=absent'
#注意:如果仓库有损坏,会影响安装,需要提前
[root@m01 ~]# yum clean all && yum makecache
[root@m01 ~]# ansible web -m shell -a 'yum clean all && yum makecache'
copy模块
#常用参数
src — 推送数据的源文件信息
dest — 推送数据的目标路径
backup — 对推送传输过去的文件,进行备份
content — 直接批量在被管理端文件中添加内容
group — 将本地文件推送到远端,指定文件属组信息
owner — 将本地文件推送到远端,指定文件属主信息
mode — 将本地文件推送到远端,指定文件权限信息
案例
##推送文件模块
[root@m01 ~]# ansible test -m copy -a "src=/etc/hosts dest=/tmp/test.txt"
##在推送覆盖远程端文件前,对远端已有文件进行备份,按照时间信息备份
[root@m01 ~]# ansible test -m copy -a "src=/etc/hosts dest=/tmp/test.txt backup=yes"
##直接向远端文件内写入数据信息,并且会覆盖远端文件内原有数据信息
[root@m01 ~]# ansible test -m copy -a "content='example' dest=/tmp/test"
file文件配置模块
path — 指定远程主机目录或文件信息
recurse — 递归授权
state —
directory — 在远端创建目录
touch — 在远端创建文件
link — link或hard表示创建链接文件
absent — 表示删除文件或目录
mode — 设置文件或目录权限
owner — 设置文件或目录属主信息
group — 设置文件或目录属组信息
py -a “content=‘example’ dest=/tmp/test”
#### file文件配置模块
> path --- 指定远程主机目录或文件信息
>
> recurse --- 递归授权
>
> state ---
>
> directory --- 在远端创建目录
>
> touch --- 在远端创建文件
>
> link --- link或hard表示创建链接文件
>
> absent --- 表示删除文件或目录
>
> mode --- 设置文件或目录权限
>
> owner --- 设置文件或目录属主信息
>
> group --- 设置文件或目录属组信息