一、ansible介绍
1.1 概念
Ansible自动化运维工具,基于Python开发,集合了众多运维工具的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。
1.2 特点
(1) no agents:不需要在被管控主机上安装任何客户端;
(2) no server:无服务器端,使用时直接运行命令即可;
(3) modules in any languages:基于模块工作,可使用任意语言开发模块;
(4) yaml,not code:使用yaml语言定制剧本playbook;
(5) ssh by default:基于SSH工作;
(6) strong multi-tier solution:可实现多级管理。
1.3 优势
(1) 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
(2) 批量任务执行可以写成脚本,而且不用分发到远程就可以执行;
(3) 使用python编写,维护更简单;
(4) 支持sudo。
1.4 工作机制
Ansible : 核心
Modules : 包括 Ansible 自带的核心模块及自定义模块
Plugins : 完成模块功能的补充,包括连接插件、邮件插件等
Inventory : 定义 Ansible 管理主机的清单
Playbooks : 剧本;定义 Ansible 多任务配置文件,由Ansible 自动执行
1.5 工作流程
二、Ansible安装
1 先安装Centos7版本的EPEL源后再安装Ansible
12 |
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repoyum -y install ansible |
2 测试 ansible –version
3 Ansible配置文件
1234 |
/usr/bin/ansible-doc 帮助文件/usr/bin/ansible-playbook 指定运行任务文件/etc/ansible/ansible.cfg 主配置文件/etc/ansible/hosts 主机清单三、实验:环境准备 |
12 |
一台主控主机:10.0.0.8 (Centos7.6)一台被控主机:10.0.0.9 (Centos7.6) |
主控与被控可以相互通信!!
安装要求:
1234 |
控制主机:需要安装 Python2.6/2.7 安装方法见上管理主机:需要安装 Python2.4 以上版本,关闭selinuxcentos7.6默认python版本为2.7.5 |
3.2 主控主机配置主机清单
12 |
vim /etc/ansible/hosts10.0.0.9 |
3.3 配置控制主机SSH密钥
在控制主机中生成ssh密钥对
1 |
ssh-keygen -t rsa # 一路回车默认 |
3.4 拷贝公钥至被控机
将公钥拷贝到管理主机中.ssh/authorized_keys文件中,实现免密码登录远程管理主机
1 |
ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.0.0.9 |
(ssh-copy-id命令会自动将id_rsa.pub文件的内容追加到远程主机root用户下.ssh/authorized_keys文件中)
3.5 ansible配置
vim /etc/ansible/ansible.cfg
找到以下两行, 将其取消注释
12 |
host_key_checking = False # 禁用每次执行ansbile命令检查ssh key hostlog_path = /var/log/ansible.log #开启日志记录 |
测试:主控机
四、常用模块使用
4.1 ping(测试远程主机运行状态)
测试主机是否连通,用法很简单,不涉及参数
1 |
ansible all -m ping |
4.2 setup(查看远程主机基本信息)
setup模块,主要用于获取主机信息,在playbooks里经常会用到的一个参数gather_facts就与该模块相关。
1 |
ansible all -m setup |
setup模块下经常使用的一个参数是filter参数,具体使用示例如下:
1 |
ansible 10.0.0.9 -m setup -a 'filter=ansible_*_mb' # 查看主机内存信息 |
1 |
ansible 10.0.0.9 -m setup -a 'filter=ansible_ens33' # 查看接口为ens33的网卡信息 |
4.3 file(设置文件属性)
1234567891011121314151617 |
相关选项:group:定义文件/目录的属组mode:定义文件/目录的权限owner:定义文件/目录的属主path:必选项,定义文件/目录的路径recurse:递归设置文件的属性,只对目录有效src:被链接的源文件路径,只应用于state=link的情况dest:被链接到的路径,只应用于state=link的情况force:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|nostate相关参数: directory:如果目录不存在,就创建目录 file:即使文件不存在,也不会被创建 link:创建软链接 hard:创建硬链接 touch:如果文件不存在,则会创建一个新文件,如果文件或目录已存在,则更新其最后修改时间 absent:删除目录、文件或者取消链接文件 |
使用示例:
1 远程文件链接创建
1 |
ansible [hostip] -m file -a "src=/etc/hostname dest=/opt/hostname_link state=link" |
被控机上查看:
2 远程文件链接删除
1 |
ansible [hostip] -m file -a "path=/opt/hostname_link state=absent" |
4.4 copy(复制文件到远程主机)
12345678 |
相关选项:backup:在覆盖之前,将源文件备份,备份文件包含时间信息。有两个选项:yes|nocontent:用于替代“src”,可以直接设定指定文件的值dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录directory_mode:递归设定目录的权限,默认为系统默认权限force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yesothers:所有的file模块里的选项都可以在这里使用src:被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用“/”来结尾,则只复制目录里的内容,如果没有使用“/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync。 |
实例:
将本地文件/opt/tools/Python-3.6.6.tgz复制到远程服务器
1 |
ansible [hostip] -m copy -a "src=/opt/tools/Python-3.6.6.tgz dest=/opt/tools/Python-3.6.6.tgz owner=root group=root mode=0644" |
在被控机上查看:
4.5 command(在远程主机上执行命令)
123456 |
相关选项如下:creates:一个文件名,当该文件存在,则该命令不执行free_form:要执行的linux指令chdir:在执行指令之前,先切换到该目录removes:一个文件名,当该文件不存在,则该选项不执行executable:切换shell来执行指令,该执行路径必须是一个绝对路径 |
实例:
1 |
ansible all -m command -a "ifconfig" # 执行命令不写入history |
远程文件信息查看
1 |
ansible all -m command -a "ls -l /etc/hostname" |
4.6 shell(切换到shell执行指定的指令)
shell的参数与command相同, 与command不同的是,此模块可以支持命令管道,同时还有另一个模块也具备此功能:raw
实例:
1 先在主控机本地创建一个SHELL脚本
vim /tmp/test.sh
12 |
#!/bin/shdate +%F_%H:%M:%S |
1 |
chmod +x /tmp/test.sh # 添加脚本可执行权限 |
2 将创建的脚本文件分发到远程
1 |
ansible all -m copy -a "src=/tmp/test.sh dest=/tmp/test.sh owner=root group=root mode=0755" |
3 远程执行
1 |
ansible all -m shell -a "/tmp/test.sh" |
4.7 cron(创建和删除计划任务)
1 创建和删除计划任务语法:
1 |
ansible [HostGroup or IP] -m cron -a "name='....' job='.....' $time" |
参数解释:
1234567 |
-m 跟模块,使用的是 cron 模块name= 指定计划任务的名字,方便日后管理job= 要执行的任务,依赖于state=present$time 指定具体的执行时间,minute分钟,hour小时,day 天,month 月份。weekday 0或者7代表周末。special_time:指定什么时候执行,参数:reboot,yearly,annually,monthly,weekly,daily,hourly state= 选项用来指定该任务计划是创建还是删除user:以哪个用户的身份执行 |
2 在主控机上增加计划任务
1 |
ansible all -m cron -a "name='test cron' job='/bin/bash /tmp/test.sh' weekday=6" |
12 |
# 每月的1,10,15日的6:35清空/tmp目录的所有文件ansible all -m cron -a "name='clean all tmp file' job='rm -rf /tmp/*' minute=35 hour=6 day=1,10,15" |
3 被控机查看
4 删除计划任务
12 |
ansible all -m cron -a "name='test cron' state=absent"ansible all -m cron -a "name='clean all tmp file' state=absent" |
4.8 yum模块
使用yum包管理器来管理软件包,其选项有:
123 |
-m 使用 yum 模块name:要进行操作的软件包的名字,也可以传递一个url或者一个本地的rpm包的路径 state= installed removed,不加state选项默认是installed |
1 |
ansible all -m yum -a "name=tree" # 使用yum安装tree命令 |
1 |
ansible all -m yum -a "name=wget state=removed" # 使用yum卸载wget命令 |
4.9 service管理服务
1234 |
-m service 模块name= 必选项,系统服务名称,可以用chkconfig --list查看enabled= 是否开机启动,yes| nostate:对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded) |
1 在被控机上使用yum安装一个nginx
1 |
yum install -y nginx |
2 安装好之后查看nginx服务的状态
3 在主控机管理被控机的nginx服务
1 |
ansible all -m service -a "name=nginx state=started enabled=no" |
4 在被控机上查看当前的nginx服务状态
5 在主控机上远程关闭被控机上的nginx服务
1 |
ansible all -m service -a "name=nginx state=stopped enabled=yes" |
4.10 其他模块使用帮助
官方提供的可能用到模块有git、svn版本控制模块,sysctl 、authorized_key_module系统模块,apt、zypper、pip、gem包管理模块,find、template文件模块,mysql_db、redis数据库模块,url 网络模块等。具体可以参看官方手册模块部分, 或者查看帮助信息。
12 |
ansible-doc -l 列出ansible所有的模块ansible-doc -s MODULE_NAME 查看指定模块具体适用 |