Ansible是当下比较流行的自动化运维工具,可通过SSH协议对远程服务器进行集中化的配置管理、应用部署等,常结合Jenkins来实现自动化部署。
除了Ansible,还有像SaltStack、Fabric(曾经管理100多台服务器上的应用时也曾受益于它)、Puppet等自动化工具。相比之下,Ansible最大的优势就是无需在被管理主机端部署任何客户端代理程序,通过SSH通道就可以进行远程命令的执行或配置的下发,足够轻量级,但同时功能非常强大,且各项功能通过模块来实现,具备良好的扩展性。不足之处是Ansible只支持在Linux系统上安装,不支持Windows。
如果你需要在多于一台服务器上做相同的操作,那么建议你使用Ansible之类的自动化工具,这将极大提高你的操作效率。
环境搭建
1.找一台主机用于做管理服务器,在其上安装Ansible
yum -y install ansible
Ansible基于Python实现,一般Linux系统都自带Python,所以可以直接使用yum安装或pip安装。
安装完后,在/etc/ansible/目录下生成三个主要的文件或目录,
[root@tool-server ~]# ll /etc/ansible/
total 24
-rw-r--r--. 1 root root 19179 Jan 30 2018 ansible.cfg
-rw-r--r--. 1 root root 1136 Apr 17 15:17 hosts
drwxr-xr-x. 2 root root 6 Jan 30 2018 roles
- ansible.cfg: Ansible的配置文件
- hosts:登记被管理的主机
- roles:角色项目定义目录,主要用于代码复用
2.在/etc/ansible/hosts文件中添加需要被管理的服务器节点
[root@tool-server ~]# vim /etc/ansible/hosts
[k8s]
192.168.40.201
192.168.40.202
192.168.40.205
192.168.40.206
[k8s]
表示将下面的服务器节点分到k8s的组中,后面执行命令时可指定针对某个组执行。
3.生成SSH KEY,并copy到被管理节点上,实现免密SSH访问
在管理节点执行 ssh-keygen
生成SSH KEY,然后copy到各被管理节点上
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.40.201
上面命令将~/.ssh/id_rsa.pub
文件内容添加到被管理节点的/root/.ssh/authorized_keys文件中,实现管理节点到被管理节点的免密SSH访问。
4.调试Ansible
针对k8s服务器组执行ping,验证Ansible到各被管理节点的连通性
[root@tool-server ~]# ansible k8s -m ping
192.168.40.201 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.40.205 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.40.202 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.40.206 | SUCCESS => {
"changed": false,
"ping": "pong"
}
Ansible只需要在管理主机上安装,然后打通管理主机到各被管理主机的SSH免密访问即可进行集中化的管理控制,不需在被管理主机安装任何代理程序。
Ansible命令
Ansible的命令格式为, ansible 主机群组名 -m 命令模块名 -a "批量执行的操作"
其中-m不是必须的,默认为command模块,-a也不是必须的,表示命令模块的参数,比如前面的ping模块就没有参数。
可以使用 ansible-doc -l
列出所有可用的命令模块, ansible-doc -s 模块名
查看指定模块的参数信息
常用命令模块
1.command
command是Ansible的默认模块,不指定-m参数时默认使用command。command可以运行远程主机权限范围内的所有shell命令,但不支持管道操作
# 查看k8s分组主机内存使用情况
ansible k8s -m command -a "free -g"
2.shell
shell基本与command相同,但shell支持管道操作
#shell支持管道操作 |grep Mem
ansible k8s -m shell -a "free -g|grep Mem"
3.script
script就是在远程主机上执行管理端存储的shell脚本文件,相当于scp+shell
# /root/echo.sh为管理端本地shell脚本
ansible k8s -m script -a "/root/echo.sh"
4.copy
copy实现管理端到远程主机的文件拷贝,相当于scp
#拷贝本地echo.sh文件到k8s组中远程主机的/tmp目录下,所属用户、组为 root ,权限为 0755
ansible k8s -m copy -a "src=/root/echo.sh dest=/tmp/ owner=root group=root mode=0755"
5.yum
软件包安装或删除
ansible k8s -m yum -a "name=wget state=latest"
其中state有如下取值:
- 针对安装,可取值“present,installed,latest”,present,installed即普通安装,两者无区别,latest是使用yum mirror上最新的版本进行安装
- 针对删除,可取值“absent,removed”,两者无差别