一、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
1
|
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
|
2 测试 ansible –version
3 Ansible配置文件
1
|
/usr/bin/ansible-doc 帮助文件
|
1
|
一台主控主机:10.0.0.8 (Centos7.6)
|
主控与被控可以相互通信!!
安装要求:
1
|
控制主机:需要安装 Python2.6/2.7 安装方法见上
|
3.2 主控主机配置主机清单
1
|
vim /etc/ansible/hosts
|
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
找到以下两行, 将其取消注释
1
|
host_key_checking = False # 禁用每次执行ansbile命令检查ssh key host
|
测试:主控机
四、常用模块使用
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(设置文件属性)
1
|
相关选项:
|
使用示例:
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(复制文件到远程主机)
1
|
相关选项:
|
实例:
将本地文件/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(在远程主机上执行命令)
1
|
相关选项如下:
|
实例:
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
1
|
#!/bin/sh
|
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"
|
参数解释:
1
|
-m 跟模块,使用的是 cron 模块
|
2 在主控机上增加计划任务
1
|
ansible all -m cron -a "name=‘test cron‘ job=‘/bin/bash /tmp/test.sh‘ weekday=6"
|
1
|
# 每月的1,10,15日的6:35清空/tmp目录的所有文件
|
3 被控机查看
4 删除计划任务
1
|
ansible all -m cron -a "name=‘test cron‘ state=absent"
|
4.8 yum模块
使用yum包管理器来管理软件包,其选项有:
1
|
-m 使用 yum 模块
|
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管理服务
1
|
-m service 模块
|
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 网络模块等。具体可以参看官方手册模块部分, 或者查看帮助信息。
1
|
ansible-doc -l 列出ansible所有的模块
|