ansbile
前言
设想一下,一个运维人员需要管理数千甚至上万台服务器,如果依靠人工一台台去维护是非常困难的,但如果基于自动化运维工具就可以轻松的实现上万甚至更多台服务器的管理。
目前市场上涌现了大量的自动化配置维护工具,例如 PSSH、Puppet、Chef、SaltStack、Ansible 等。自动化运维工具存在的初衷就是为了更方便、快捷的进行配置管理,它易于安装和使用、语法也非常简单易学。
一、主流自动化运维工具简介
1.1 Puppet
Puppet 是早期的 Linux 自动化运维工具,是一种 Linux、Unix、Windows 平台的集中配置管理系统,发展至今目前已经非常成熟,可以批量管理远程服务器,模块丰富,配置复杂,基于 Ruby 语言编写。最典型的 C/S 模式,需要安装服务端与客户端。puppet 采用 C/S 星状的结构,所有的客户端和一个或几个服务器交互,每个客户端周期的(默认半个小时)向服务器发送请求,获得其最新的配置信息,保证和该配置信息同步。
每个 puppet 客户端每半小时(可以设置)连接一次服务器端,下载最新的配置文件,并且严格按照配置文件来配置客户端,配置完成以后,puppet 客户端可以反馈给服务器端一个消息,如果出错也会给服务器端反馈一个消息。
Puppet 适用于服务器管理的整个过程,比如初始安装、配置、更新以及系统下线。
1.2 Saltstack
Saltstack 与 Puppet 均是 C/S 模式,需安装服务端与客户端,基于 Python 编写,加入 MQ 消息同步,可以使执行命令和执行结果高效返回,但其执行过程需等待客户端全部返回,如果客户端未及时返回或未响应的话,可能会导致部分机器没有执行结果。
1.3 Ansible
Ansible 与 Saltstack 均是基于 Python 语言开发,Ansible只需要在一台普通的服务器上运行即可,不需要在客户端服务器上安装客户端。因为 Ansible 是基于 SSH 远程管理,而Linux服务器大都离不开SSH,所以Ansible不需要为配置工作添加额外的支持。==
Ansible 安装使用非常简单,而且基于上千个插件和模块实现各种软件、平台、版本的管理,支持虚拟容器多层级的部署。很多读者在使用 Ansible 工具时,认为 Ansible比 Saltstatck 执行效率慢,其实不是软件本身慢,是由于 SSH 服务慢,可以优化 SSH 连接速度及使用 Ansible 加速模块,满足企业上万台服务器的维护和管理。
二、Ansible 运维工具原理
Ansible分为控制端和被控制端,主要是基于SSH协议去管理客户端,被控制端是无需安装Agent插件的,Ansible会读取控制端hosts文件,根据文件中定义IP列表信息,调取本地的各个模块对被控端机器实现批量、并发的配置管理和维护,如果任务比较复杂可以写成PlayBook剧本进行分发管理。
Ansible 自动运维管理工具优点:
- 轻量级,更新时,只需要在操作机上进行一次更新即可;
- 采用 SSH 协议;
- 不需要去客户端安装 agent;
- 批量任务执行可以写成脚本,而且不用分发到远程就可以执行;
- 使用 python 编写的,维护更简单;
- 支持 sudo 普通用户命令;
- 去中心化管理。
三、Ansible安装
主机名 | IP |
---|---|
控制端 | 192.168.153.40 |
被控制端 | 192.168.153.50 |
被控制端 | 192.168.153.60 |
3.1 下载软件包
yum install -y epel-release #安装epel扩展源
yum install -y ansible
- 1
- 2
ansible配置文件都在/etc/ansible目录下
ansible.cfg #ansible的配置文件
hosts #ansible的主仓库,用于存储需要管理的远程主机的相关信息
roles #角色
- 1
- 2
- 3
3.2 配置主机清单
vim /etc/ansible/hosts
[webserver] #组名
192.168.153.50 #组成员IP
... ...
[mysql]
192.168.153.60
... ...
- 1
- 2
- 3
- 4
- 5
- 6
- 7
为了便于区别,可以修改下主机名
hostnamectl set-hostname ansible
su -
hostnamectl set-hostname webserver
su -
hostnamectl set-hostname mysql
su -
- 1
- 2
- 3
- 4
- 5
- 6
3.3 配置密钥对验证
ssh-keygen -t rsa
ssh-copy-id root@192.168.153.50
ssh-copy-id root@192.168.153.60
- 1
- 2
- 3
3.4 免交互代理
ssh-agent bash
ssh-add
- 1
- 2
四、Ansible命令行模块
命令格式:`命令格式: ansible [主机] [-m 模块] [-a 操作]`
ansible-doc -l #列出所有已安装的模块,q退出
ansible-doc -s 模块 #查看相应模块信息,q退出
ansible-doc -s yum #-s列出yum模块描述信息和操作动作,q退出
- 1
- 2
- 3
- 4
4.1 command模块
ansible 192.168.153.50 -m command- a 'ls' #指定ip执行ls
ansible mysql -m command -a 'ls' #指定组执行ls
ansible all -m command -a 'ls' #所有主机执行ls命令
ansible all -a 'ls' `#如果不加-m模块,则默认运行command模块`
- 1
- 2
- 3
- 4
4.2 cron模块
两种状态(state):present表示添加(可以省略),absent表示移除。
ansible webserver -m cron -a 'day="*/1" job="/usr/bin/echo hello >> /opt/1test.txt" name="this is test"'
#指定webserver组中所有主机使用cron模块,时间是每天,工作是输出hello,计划性任务命名为this is test
ansible webserver -a 'crontab -l'
#没有-m指定模块默认使用command模块,操作是查看计划性任务
- 1
- 2
- 3
- 4
可以在192.168.153.50(webserver)再次确认一下
ansible webserver -m cron -a 'name="this is test" state=absent'
#移除计划任务
- 1
- 2
4.3 user模块
user模块是请求的是useradd, userdel, usermod三个指令
ansible mysql -m user -a 'name=lisi'
#创建用户lisi
ansible mysql -m command -a 'tail -1 /etc/passwd'
#查看/etc/passwd文件最后一行,看用户是否创建成功
ansible mysql -m user -a 'name=lisi state=absent'
#删除用户lisi
- 1
- 2
- 3
- 4
- 5
- 6
4.4 group模块
group模块请求的是groupadd, groupdel, groupmod三个指令。
```bash
ansible webserver -m group -a 'name=webserver1 gid=567 system=yes'
#创建组
ansible webserver -a 'tail -1 /etc/group'
#查看组信息
ansible webserver -m user -a 'name=wangwu uid=567 system=yes group=webserver1'
#创建用户并加入webserver组
ansible webserver -a 'tail -1 /etc/passwd'
#查看用户wangwu的用户id和组id信息
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
4.5 copy模块
ansible mysql -m copy -a 'src=/etc/fstab dest=/opt/fstab.back owner=root mode=640'
#指定mysql组中的主机使用copy模块将控制端文件/etc/fstab复制到被控制端并更名
ansible mysql -a 'ls /opt'
ansible mysql -m copy -a 'content="hello world!" dest=/opt/fstab.back'
#将hello world!写入/opt/fstab.back
ansible mysql -a 'cat /opt/fstab.back'
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/0b673ded8403f928ba925487bdd989f6.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/97c996026db30c36de1a3cc8c5ca56b8.png)
4.6 file模块
ansible mysql -m user -a 'name=mysql system=yes'
#创建mysql系统用户
ansible mysql -m group -a 'name=mysql system=yes'
#创建mysql组
ansible mysql -m file -a 'owner=mysql group=mysql mode=644 path=/opt/fstab.back'
#修改文件的属主属组
ansible mysql -m file -a 'path=/opt/fstab.link src=/opt/fstab.back state=link'
#mysql组中主机使用file模块,为源文件/opt/fstab.link创建一个软连接/opt/fstab.back.link
ansible mysql -a 'ls -l /opt'
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
ansible mysql -m file -a "path=/opt/fstab.link state=absent"
#删除-个文件
ansible mysql -m file -a "path=/opt/test state=touch"
#创建一个文件
ansible mysql -a 'ls /opt'
#查看
- 1
- 2
- 3
- 4
- 5
- 6
4.7 ping模块
ansible all -m ping
- 1
4.8 yum模块
yum模块主要用于安装和卸载软件包
ansible webserver -m yum -a 'name=httpd'
#yum安装httpd
ansible webserver -a 'rpm -q httpd'
ansible webserver -m yum -a 'name=httpd state=absent'
#卸载httpd
ansible webserver -a 'rpm -q httpd'
4.9 service模块
ansible webserver -a 'systemctl status httpd'
#查看web服务器httpd运行状态
ansible webserver -m service -a 'enabled=true name=httpd state=started'
#启动httpd服务
- 1
- 2
- 3
- 4
4.10 shell模块
ansible mysql -m user -a 'name=zhangsan'
ansible mysql -m shell -a 'echo 123123 | passwd --stdin zhangsan'
- 1
- 2
4.11 script模块
vim test.sh
#!/bin/bash
echo 'hello ansible from script' > /opt/script.txt
chmod +x test.sh
ansible all -m script -a 'test.sh'
4.12 setup模块
Ansible facts 是远程系统的信息,主要包含IP地址,操作系统,以太网设备,mac 地址,时间/日期相关数据,硬件信息等信息。
ansible mysql -m setup
#获取mysql组主机的facts信息
- 1
- 2