ansible简介

ansible介绍

一、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 工作机制

image-20191205201704208

Ansible : 核心

Modules : 包括 Ansible 自带的核心模块及自定义模块

Plugins : 完成模块功能的补充,包括连接插件、邮件插件等

Inventory : 定义 Ansible 管理主机的清单

Playbooks : 剧本;定义 Ansible 多任务配置文件,由Ansible 自动执行

1.5 工作流程

image-20191205201727183

二、Ansible安装

1 先安装Centos7版本的EPEL源后再安装Ansible

1
2
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum -y install ansible

2 测试 ansible –version

image-20191206085722237

3 Ansible配置文件

1
2
3
4
/usr/bin/ansible-doc        帮助文件
/usr/bin/ansible-playbook 指定运行任务文件
/etc/ansible/ansible.cfg 主配置文件
/etc/ansible/hosts 主机清单
三、实验:环境准备
3.1 准备工作
1
2
一台主控主机:10.0.0.8 (Centos7.6)
一台被控主机:10.0.0.9 (Centos7.6)

主控与被控可以相互通信!!

安装要求:

1
2
3
4
控制主机:需要安装 Python2.6/2.7 安装方法见上
管理主机:需要安装 Python2.4 以上版本,关闭selinux

centos7.6默认python版本为2.7.5

3.2 主控主机配置主机清单

1
2
vim /etc/ansible/hosts
10.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

image-20191206090644715

(ssh-copy-id命令会自动将id_rsa.pub文件的内容追加到远程主机root用户下.ssh/authorized_keys文件中)

3.5 ansible配置

vim /etc/ansible/ansible.cfg

找到以下两行, 将其取消注释

1
2
host_key_checking = False   # 禁用每次执行ansbile命令检查ssh key host
log_path = /var/log/ansible.log #开启日志记录

测试:主控机

image-20191206090935397

四、常用模块使用

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'  # 查看主机内存信息

image-20191206103558546

1
ansible 10.0.0.9 -m setup -a 'filter=ansible_ens33'  # 查看接口为ens33的网卡信息

image-20191206103734120

4.3 file(设置文件属性)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
相关选项:
group:定义文件/目录的属组
mode:定义文件/目录的权限
owner:定义文件/目录的属主
path:必选项,定义文件/目录的路径
recurse:递归设置文件的属性,只对目录有效
src:被链接的源文件路径,只应用于state=link的情况
dest:被链接到的路径,只应用于state=link的情况
force:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no

state相关参数:
directory:如果目录不存在,就创建目录
file:即使文件不存在,也不会被创建
link:创建软链接
hard:创建硬链接
touch:如果文件不存在,则会创建一个新文件,如果文件或目录已存在,则更新其最后修改时间
absent:删除目录、文件或者取消链接文件

使用示例:
1 远程文件链接创建

1
ansible [hostip] -m file -a "src=/etc/hostname dest=/opt/hostname_link state=link"

image-20191206091711511

被控机上查看:

image-20191206091802453

2 远程文件链接删除

1
ansible [hostip] -m file -a "path=/opt/hostname_link state=absent"

image-20191206091921985

4.4 copy(复制文件到远程主机)

1
2
3
4
5
6
7
8
相关选项:
backup:在覆盖之前,将源文件备份,备份文件包含时间信息。有两个选项:yes|no
content:用于替代“src”,可以直接设定指定文件的值
dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录
directory_mode:递归设定目录的权限,默认为系统默认权限
force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes
others:所有的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"

image-20191206092823419

在被控机上查看:

image-20191206092917619

4.5 command(在远程主机上执行命令)

1
2
3
4
5
6
相关选项如下:
creates:一个文件名,当该文件存在,则该命令不执行
free_form:要执行的linux指令
chdir:在执行指令之前,先切换到该目录
removes:一个文件名,当该文件不存在,则该选项不执行
executable:切换shell来执行指令,该执行路径必须是一个绝对路径

实例:

1
ansible all -m command -a "ifconfig"    # 执行命令不写入history

image-20191206093150160

远程文件信息查看

1
ansible all -m command -a "ls -l /etc/hostname"

image-20191206093333393

4.6 shell(切换到shell执行指定的指令)

​ shell的参数与command相同, 与command不同的是,此模块可以支持命令管道,同时还有另一个模块也具备此功能:raw

实例:

1 先在主控机本地创建一个SHELL脚本
vim /tmp/test.sh

1
2
#!/bin/sh
date +%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"

image-20191206093832254

4.7 cron(创建和删除计划任务)

1 创建和删除计划任务语法:

1
ansible [HostGroup or IP] -m cron -a "name='....' job='.....' $time"

参数解释:

1
2
3
4
5
6
7
-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"

image-20191206095225425

1
2
# 每月的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"

image-20191206095536786

3 被控机查看

image-20191206095608032

4 删除计划任务

1
2
ansible all -m cron -a "name='test cron' state=absent"
ansible all -m cron -a "name='clean all tmp file' state=absent"

image-20191206101107548

4.8 yum模块

使用yum包管理器来管理软件包,其选项有:

1
2
3
-m 使用 yum 模块
name:要进行操作的软件包的名字,也可以传递一个url或者一个本地的rpm包的路径
state= installed removed,不加state选项默认是installed
1
ansible all -m yum -a "name=tree"  # 使用yum安装tree命令

image-20191206101417097

1
ansible all -m yum -a "name=wget state=removed"    # 使用yum卸载wget命令

4.9 service管理服务

1
2
3
4
-m service 模块
name= 必选项,系统服务名称,可以用chkconfig --list查看
enabled= 是否开机启动,yes| no
state:对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded)

1 在被控机上使用yum安装一个nginx

1
yum install -y nginx

2 安装好之后查看nginx服务的状态

image-20191206101910553

3 在主控机管理被控机的nginx服务

1
ansible all -m service -a "name=nginx state=started enabled=no"

image-20191206101950592

4 在被控机上查看当前的nginx服务状态

image-20191206102156155

5 在主控机上远程关闭被控机上的nginx服务

1
ansible all -m service -a "name=nginx state=stopped enabled=yes"

image-20191206102349903

4.10 其他模块使用帮助

​ 官方提供的可能用到模块有git、svn版本控制模块,sysctl 、authorized_key_module系统模块,apt、zypper、pip、gem包管理模块,find、template文件模块,mysql_db、redis数据库模块,url 网络模块等。具体可以参看官方手册模块部分, 或者查看帮助信息。

1
2
ansible-doc -l                列出ansible所有的模块
ansible-doc -s MODULE_NAME 查看指定模块具体适用
posted @ 2019-12-10 21:19  王牌男人  阅读(377)  评论(0编辑  收藏  举报