首页 > 运维 > ansible > ansible简单使用
2018
02-10

ansible简单使用

ansible特性

特性:
1.模块化: 调用特定模块,完成特定任务,每个模块就相当于单条linux命令 (单一命令)
2.有Paramiko,PyYAML,Jinja2(模板语言) 三个关键模块
3.支持自定义模块
4.基于python语言实现
5.部署简单,基于python和SSH
6.安全,基于OpenSSh
7.支持Playbook编排任务(复杂任务编排)
8.幂等性:一个任务,或者一个账号已经创建,就不会再执行了,不会因重复执行带来意外情况
9.无需代理
10.可使用任何编程语言写模块
11.YAML格式,编排任务,支持丰富的数据结构
12.较强大的多层解决方案(编角色)

应用场景

管理主机 ,管理设备(较少)

Ansible重要组成部分

AD-Hoc即ansible命令(单条临时命令)

Ansible Playbooks: 任务剧本(任务集),编排定义

Ansible安装(yum)

Ansible编译安装

ansible主要配置文件

ansible主程序

ansible命令

例如:ansible执行ping模块测试与其他服务器状态

附: 配置ansible免密码私钥登录

配置文件讲解

jq 参数用法

注意:ansible修改配置,不需要重启服务,执行命令即可生效

ansible-doc命令使用

ansible命令使用

查看对方主机文件信息 -a ‘参数命令’

如果你想以其他用户来连接,他就会以其他用连接,如果你想换个身份连接,那么指定-u

通配符

ansible命令执行过程

查看ansible命令执行详细过程

执行带$变量的命令,最好用shell模块,command不支持

脚本模块script模块,可以批量在所有主机执行,当前ansible主机脚本命令

copy模块

把远程主机文件抓取回来

synchronize模块

例1: 将主控方/tmp/test/ 目录文件推送到指定节点的/tmp/test/目录下。

file模块

cron 计划任务

yum:管理包

service:管理服务

user:管理用户

group:管理组

在介绍ansible-galaxy playbook之前我们先来详细解下角色roles(深入浅出)

ansible角色Roles

创建了一个示例角色,示例角色的目录结构如下:

我创建的示例角色的角色名为demorole,demorole目录就代表了这个角色,此目录中包含了defaults 、files 、handlers 、meta  、tasks 、templates 、vars等子目录,而且在defaults 、handlers 、meta  、tasks 、vars等目录中,还都有一个名为”main.yml”的文件,那么这样的目录结构代表了什么含义呢?我们一起来了解一下,在角色中,上述目录结构的作用如下:

当然,上述目录并不全是必须的,也就是说,如果你的角色并没有相关的模板文件,那么角色目录中并不用包含templates目录,同理,其他目录也一样,一般情况下,都至少会有一个tasks目录。 具体请看这里大神讲解roles 传送门

Ansible-galaxy playbook

例: 下载角色

删除角色:

下来写个简单的剧本:

这样这个简单的剧本就写完了,下来运行这个剧本

加密解密剧本

一旦加密,这个文件的内容就无法看清了

AES加密

现在你想要运行这个剧本,就必须先解密,否则无法运行。

交互式命令 ansible-console

Playbook

playbook使用yaml语言编写

– 之后是有空格

Playbook核心元素

下面编写简单的yaml

然后检查一下剧本是否有语法错误

当剧本执行到某一模块执行错误,那么后续操作是不会再执行的。如果你想后续剧本继续执行,请在模块命令后加上 “|| /bin/true”

执行ansible-playbook

一个模块对应一个name 一个模块对应一个name ,不要一个name对应多个模块 这样是不可以的。

如果没有指定路径src=files/xxx.txt,默认files获取的是当前用户家目录下

下来我们介绍Handlers 和 (通知(Notify)

notify用法:

tags标签

tags相当于给其中一个action打了个标签,方便调用

例如:

在这样一段配置文件中,有个标签sohello,我可以单独只执行这个标签

下面我只执行sohello这个标签的action

vars变量

比如我们将创建文件的文件名定义为一个变量

执行的时候需要使用-e传入变量名

文件已经创建

在playbook里面也可以直接定义变量,具体如下

在主机组文件中定义变量

1.单个主机设置变量

2.为主机组设置变量

单一主机变量的优先级要高于,主机模块组变量

模板template

在实际生产环境中,不同主机的配置是不同的,那么我们利用copy模块复制到每个主机的配置文件不能完全一样,最好是能够根据当前主机情况生成适合自身的配置文件,那么怎么做呢,模板就起作用了。

模板语言是用jinjia2语言编写的

when条件判断

现在又出现一个新的需求,2台centos7,1台ubuntu,我的模板只支持centos7 ,并不支持ubuntu,所以我就要判断哪些机器是centos7,就使用yum模块安装,哪些机器是deban就使用apt命令安装。

with_items迭代

需求,比如我要安装多个包,创建多个文件,难不成一直-name action -name action? 那要是1000个要写到什么时候

这个时候迭代,就可以替我们操作重复性任务

例:当前有这样一个需求,要求创建三个用户组,并且给每个组添加对应用户,那么with_items就起到了作用

for循环:

例如现在有个,往nginx中添加多个网站配置

template: for1.conf.j2

角色Roles

角色就是将playbook 剧本拆分开来,变量是变量,文件是文件,任务是任务。

我们来创建一个角色

下来我们来写一个简单的demo

tasks目录

vars目录

template目录

角色根目录 nignx.yaml

运行:

如果你想执行多个角色,那就在执行文件里继续调用角色即可

如果再当前角色nginx中想引用其他角色怎么办?

例如:我现在想在nginx里边去借调 httpd的copy剧本

通过标签来执行角色

为角色定义标签:

标签调用执行

如果我想在特定的条件下才去执行某个标签,那么需要when语句

基础使用就到这。

这里有大神的有道云笔记:传送门

最后编辑:
作者:shooter
这个作者貌似有点懒,什么都没有留下。