- Ansible的特性:
- ansible基于Python实现,有Paramiko、PyYAML、JinJia2主要模块
- 使用SSH链接主机,部署简单
- 可以使用自定义模块,也可以使用其他语言编写的模块,基于模块可以完成各种任务。
0x00 Ansible 主机库文件: hosts inventory
host inventory是主机库文件,里面存放的是要管理的主机列表,和一些主机参数,另外也可以加入变量等自定义的参数。
一般来说,常见的主机库文件如下
https://micorochio.github.io/2017/05/31/ansible-learning-01/#0x02-host文件
上一次介绍了默认的主机库,其实在运行ansible 命令时,是可以指定inventory文件的
这里先不做介绍。带着下面问题,继续往下看
- hosts inventory的常用参数有哪些?
- 如何针对不同的环境,使用不同的hosts inventory文件?
- hosts inventory如何定义变量?
0x01 入门级命令
上一次介绍了一个简单的ansible命令:ansible 打印 Hello World
- 命令的组成
这句话会找到指定的主机(127.0.0.1)在主机上,使用command,执行echo hello world
如果默认的hosts文件中,定义了主机组,也可以将ip换成主机组的名字
执行
local会去hosts文件中找到对应的组,组下的每一台机器都会运行指令。
如果想让所以主机全部执行
command模块意思是执行Linux主机的command,模块使用命令名称后跟一个列表空格分隔的参数。 给定的命令将全部执行选定的节点。 因为不会通过shell进行处理,所以“$ HOME”这样的变量,像“”<“”,“”>“”,“”|“`“;”“和”“&”“将不起作用。
-那么 -m 指定模块,除了command,一定还有其他模块,那么在没有文档的情况下,
- 怎么知道其他模块,和模块指令的用法呢?
|
|
使用ansible-doc,可以帮助快速了解模块的作用和用法,ansible 还有其他参数,如下:
接下来介绍几个常用的模块
0x02 ansible常用模块介绍
- command:这是个默认模块,不写-m xx模块的时候,默认会当成command模块,表示执行主机指令1ansible local -a 'whoami'
- cron:定时任务模块,可以指定一个时间去执行某个任务
有以下参数可供选择
举个栗子:
每10分钟输出一次 hello
|
|
|
|
cron 我是直接翻译了文档,之后可以使用ansible-doc -s
命令自己查看.后面也不再详细翻译
- user 操作用户
|
|
group 操作用户组
123创建组ansible local -m group -a 'name="mysql" gid=306 system=yes '删除同usercopy 复制文件
12将本机 源.txt 文件拷贝到远程主机上成为 目标.txtansible webserverhost -m copy -a 'src="/home/zing/Documents/源.txt" dest="/home/xxserver/目标.txt" owner="root" mode=640'
src=本地目标(可以是文件夹)
dest=远程目标(可以是文件夹)
src可以用content替换
content:可以取代src,表示信息直接生成文件,与src不能同时使用。
file 操作文件
1ansible local -m file -a 'ower="mysql" mode=644 src="/home/zing/Documents/from_mysql.link" path="/home/mysql/xxx.link" state="link" 'service 指定服务的运行状态
123ansible local -m service -a 'name="httpd" enabled=true state=started 'enable表示是否开机启动state 参数有started stopped restartedshell,指定执行shell命令,与command类似,在用到pipline,等复杂命令时,使用shell更加合适,这里不举例了
script 在远程主机上运行本机脚本,只支持用相对路径
1ansible serverhost -m script -a 'test.sh'setup 查看主机状态信息
1ansible all -m setup
0x03 yaml和playbook
是一个可读性高,用来表达数据序列的格式。YAML参考了其他多种语言,包括:C语言、Python、Perl,并从XML、电子邮件的数据格式(RFC 2822)中获得灵感。目前已经有数种编程语言或脚本语言支持(或者说解析)这种语言。
YAML的语法和其他高级语言类似,并且可以简单表达清单、散列表,标量等数据形态。[4]它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件、倾印除错内容、文件大纲(例如:许多电子邮件标题格式和YAML非常接近)。尽管它比较适合用来表达层次结构式(hierarchical model)的数据结构,不过也有精致的语法可以表示关系性(relational model)的数据。[5]由于YAML使用空白字符和分行来分隔数据,使得它特别适合用grep/Python/Perl/Ruby操作。其让人最容易上手的特色是巧妙避开各种封闭符号,如:引号、各种括号等,这些符号在嵌套结构时会变得复杂而难以辨认。
想细致学习YAML的可以去阮一峰大神的博客看看:
http://www.ruanyifeng.com/blog/2016/07/yaml.html
那么Ansible中的Yaml文件是干啥的,其实就是指定,什么主机,执行什么任务的一个列表
上面的一串yml配置就是让local主机以root身份去git上获取代码放到本地
很简单明了。
那么playbook怎么理解呢?
playbook本身是剧本的意思,ansible playbook中,包含了:
- Inventory 主机库文件
- modules 调用模块
- Ad Hoc Commands 指定主机运行的命令
- Playbooks 剧本文件
- tasks 任务,调用模块执行某些命令
- varable 变量
- Template 模板
- Handlers 处理器 由某些事件触发某些行为
- Roles 角色
playbook的主要文件是用来指定tasks,下面举些例子
执行playbook也很简单
指定hosts inventory文件
0x04 从git开始到项目发布并启动
1.定义hosts inventory
test_evn_hosts文件
2.编写playbook YAML 文件
side.yml文件
3.编写配置文件
application.properties.j2 模板文件
4.编写脚本
git_clone.sh文件
5.编写task yaml
6.playbook 执行
整体结构
参考
http://ansible-tran.readthedocs.io/en/latest/docs/intro_inventory.html#inventoryformat
转载请注明来自MaxZing : https://micorochio.github.io/2017/06/05/ansible-learning-02/