实现了批量系统部署,批量程序部署,批量运行命令等功能,Ansible是基于模块工作的,本身没有批量部署的能力,真正具有能力的是Ansible运行的模块,Ansible只是提供一个框架。
核心组件:
- Ansible:核心程序
- connection-Plugins:负责和被监控端实现通信
- plugins:完成模块功能的补充,包括连接插件,邮件插件
- modules:包括ansible自带的核心模块和自定义模块
- playbook:剧本,定义ansible多任务配置文件,由ansible自动执行
-
特点:
不需要在被监控端上安装任何服务程序
- 无服务器端,使用时直接运行命令即可
- 基于ssh工作
- 基于模块工作,可以使用任意语言开发
- 使用yaml语言编写playbook
- 可实现多级指挥
- 具有幂等性,一次操作重复多次的结果相同
执行过程:加载自己的配置文件,默认为/etc/ansible/ansible.cfg。加载自己的模板文件。通过ansible将模块或命令生成对应的py文件,并将该文件传输到远程服务器。对应执行用户家目录的ansible/tmp/xx.py文件。给文件+X执行。执行并返回结果,删除临时的py文件,sleep0退出。
安装部署ansible:
yum install epel-release.noarch -y
yum install ansible -y
ssh-keygen -P "" -t rsa ssh-copy-id -i /root/.ssh/id_rsa.pub root@server2
常用命令:
ansible:临时命令的执行工具,常用于执行临时命令
- ansible-doc:用于模块功能的查询
- ansible-playbook:用于执行剧本
ansible参数说明:
-m:指定模块
-a:指定模块的参数
-C:坚持执行结果
-e:指明变量名
-f:指定并发进程数
-i:指定主机清单文件
—syntax-check:检查执行命令是否存在语法错误
常用模块:
ansible执行的状态:
- 绿色:执行成功并且不需要做改变的操作
- 黄色:执行成功需要做改变的操作
- 红色:执行失败
- 粉色:警告信息
- 蓝色:显示ansible命令的执行过程
ping模块:主机连通性测试
user模块:
Group模块:
command模块:不支持管道,变量及重定向。
shell模块:
script模块:
copy模块:
file模块:
yum模块:
service模块:
selinux模块:
mount模块:
parted模块:
lvg模块:
lvol模块:
filesystem模块:
block模块:
rescure模块:
always模块:
find模块:
wait_for模块:
unarchive模块:
archive模块:
debug模块:帮助我们进行调试,debug模块可以帮助我们把信息输出到ansible控制台上,以便我们能够定位问题。可以通过msg:返回变量的值
Playbook:
简介:
playbook是由yaml语言编写的具有多个play组成的列表,可以让这些列表按照编排的顺序执行,所谓的task就是调用ansible具体的模块,在模块参数中可以使用变量。模块执行是幂等性的,意味着多次执行结果相同。
核心字段:
- hosts:执行的远程主机列表
- tasks:任务,由模块的定义操作列表
- variables:内置变量或者是自定义变量
- templates:模板,定义模板文件,模板文件一般由jinja2语言编写
- handlers:和nogity结合使用,为条件触发操作,满足条件则执行
-
变量:
变量的来源:
远程主机的所有变量都可以使用ansible -m setup nodes
- 自定义变量
优先级:
- 通过命令行指定变量的优先级最高
- /etc/ansible/hosts定义变量(针对单个主机定义,针对主机组进行定义)
-
模板:
文本文件,内部嵌套有模板语言的脚本
- jinjia2是由python编写的,写模板时一般用jinjia2语言
- 功能:将模板中的变量替换为本地主机的确定值
- 语法:字符串,数字,列表[],字典{},元组(),算数运算,比较运算,逻辑运算。
控制结构:
条件判断:
- name restart nginx
service:
name:nginx
state:restarted
when:ansible_distribution_major_version =='6'
循环迭代:
- with_items:在列表嵌套列表的情况下,将子列表展开
- with_flattened:在列表嵌套列表的情况下,将子列表展开
- with_list:在列表嵌套列表的情况下,不将子列表展开,也就是不会拉平拉直
- with_together:将多个列表中的对应元素,组合起来类似于python中的zip
- with_cartesian:用于列表嵌套的情况,将第一个列表中的第一个元素与第二个列表中的元素组合(笛卡尔的方式)。
- with_nested:与cartesian一样
- with_indexed_items:给每个元素添加编号,在嵌套三层列表后,不能像flattened一样拉平
- with_sequence:与数字相关
- with_random_choice:从列表中随机返回一个值
- with_dic:与字典相关
- with_file:能够显示文件内容
- with_fileglob:能够匹配文件名称
- loops:是最近出现的一个循环迭代方法,可以通过加上过滤器替代with_xxx的循环方式
```shell
基于字符串列表
tasks:
```
角色:
角色是用来提高ansible的便利性,降低冗余性。我们能将某一个服务定义为一个角色,当我们需要用到这个服务时,直接调用角色就行,就不会再在剧本中重写该服务的语句。提高了可维护性和便利性。
如何使用角色呢:首先我们需要在角色的目录下使用ansible-galaxy init apache初始化一个角色。该角色初始化完成后会有,files,tasks,template,defaults,handlers,vars,meta等目录。就是相当于角色的性质。我们需要什么样的角色,就去将相应的性质加到里面。当我们需要调用角色时,应该在roles的目录下定义一个site.yaml文件。里面包含了name字段,remote_user字段,以及hosts
还有roles:将我们需要的角色加进去就可以,本质上它是一个剧本。
roles目录下各目录的的功能:
- tasks:此目录中至少有一个main.yaml文件,用来定义各种task任务,其他文件由main.yaml调用
- handlers:有main.yaml文件,用来定义各种handler
- vars:有main.yaml文件,用来定义各种变量
- tmplates:用来存放template模块调用的模板文件
- meta:有main.yaml,定义当前角色的设定及其依赖关系
- default:有main.yaml文件,设定默认的值
- files:此目录存放copy或者script等模块调用的文件。