开发者学堂课程【自动化运维工具 Ansible 实战:实现 Ansible 企业级用法 playbook 】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/577/detail/7977
实现 Ansible 企业级用法 playbook
内容简介
一、ansible 系列命令
二、playbook
三、YAML 介绍
四、YAML 语法简介
五、playbook 核心元素
六、playbook 基础组件
七、运行 playbook
八、playbook VS ShellScripts
九、示例
一、ansible 系列命令
1、ansible-galaxy(银河)
连接 https://galaxy.ansible.com网站来 下载相应的 roles(角色)
角色是相当于把很多 playbook 组合起来的综合的完整的复杂的组合文件夹。
在互联网上有很多人的把在生产中用的一些比较实用的常见的解决实际问题的一些好的角色都放在网站上,可以从这直接下载。
列出所有已安装的 galaxy。
ansible-galaxy list
安装 galaxy
ansible-galaxy install geerlingguy . redis
删除 galaxy
ansible-galaxy remove geerlingguy . redis
2、ansible-pull
推送命令至远程,效率无限提升,对运维要求较高
push 与 pull 两个单词你以后还会经常见到,这个相反的两个操作,pull 是把一些对应的命令从本机拉取到远程去。
将来用这个命令执行一些 ansible 指令的时候,效率据比传统的 ansible 命令效率要高很多,不过应用较少,要求相对来讲比较高一些。
3、Ansible-playbook
建议以 ylm 或 yaml 为后缀
ansible-playbook hello. yml
cat hello. yml
#hello world yml file
-hosts:websrvs
remote _ user:root
tasks:
-name:hello world
command:/usr/bin/wall hello world
示例:
[root@ansible ansible]#
vim
hello
.yml
- hosts : websrvs
remote_user ; root
tasks:
-name: hello
command:hostname
"hello, yml"7L,93C written
[root@ ansible ansible ]#ansible= playbookhello .yml
4、Ansible-vault
功能:管理加密解密 yml 文件
ansible-valt[create | decrypt | edit | encrypt | rekey | view]
ansible-vault encrypt hello. yml 加密
ansible-vault decrypt hello. yml 解密
ansible-vault view hello. yml 查看
ansible-vault edit hello. yml 编辑加密文件
ansible-vault rekey hello. yml 修改口令
ansible-vault create new. yml 创建新文件
5、Arisible-console:2.0+新增,可交互执行命令,支持 tab。root@test(2)[f:10]$
执行用户@当前操作的主机组(当前组的主机数量)[f:并发数]S
设置并发数:forks n 例如:forks 10
切换组:cd 主机组例如:cd web
列出当前组主机列表:list
列出所有的内置命令:?或 help
示例:
root@all(2)[f:5]Slist
root@all(2)[f:5] Scdappsrvs
root@appsrvs(2)[f:5] $ list
root@appsrvs(2)[f:5] $ yum name= httpdstate =present
root@appsrvs(2)[f:5]$ servicename = httpdstate =started
二、playbook
1、playbook 是由一个或多个“play”组成的列表。
2、play 的主要功能在于将事先归并为一组的主机装扮成事先通过 ansible 中的task 定义好的角色。从根本上来讲,所谓 task 无非是调用 ansible 的一个 module。将多个 play 组织在一个 playbook 中,即可以让它们联同起来按事先编排的机制同唱一台大戏。
3、Playbook 采用 YAML 语言编写。
流程示意图: 一一一一一一一一一一一一一
playbook 工作流程,可以在 playbook 里面写好多的 play(1234),用户去调用playbook,但最终使用 ansible 对应的命令来执行的,然后调用里面一个个 play,然后每个 play 里面有自己的任务可,可能第一个play里面有三个任务,第二个 play 里有四个任务,第三个 play 里面有若干个任务。
而任务和任务之间有先后顺序,然后去调用模块,执行时要看主机清单针对哪一个主机清单里面的主机来执行 playbook 任务,执行的时候也得通过 ssh 连接到被管控的主机上,所以这个流程与之前类似,无非是把复杂任务写成 playbook 格式而已,最终还是通过 ansible 的一个个模块执行的,效果是一样的。
三、YAML 介绍
1、YAML 是一个可读性高的用来表达资料序列的格式。YAML 参考了其他多种语言,包括:XML C语言、Python、Perll 以及电子邮件格式 RFC2822等。
ClarkEvans 在2001年在首次发表了这种语言,另外 Ingy dÖt Net 与 Oren Ben-Kiki 也是这语言的共同设计者。
2、YAMLAin'tMarkup Language,即 YAML 不是 XML。不过,在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)。
3、特性:
YAML 的可读性好
YAML 和脚本语言的交互性好
YAML 使用实现语言的数据类型
YAML 有一个一致的信息模型
YAML 易于实现
YAML 可以基于流来处理
YAML 表达能力强,扩展性好
4、更多的内容及规范参见 http://www.yaml.org
四、YAML 语法简介
1、在单一档案中,可用连续三个连字号(——)区分多个档案。另外,还有选择性的连续三个点号(…)用来表示档案结尾。
2、次行开始正常写 Playbook 的内容,一般建议写明该 Playbook 的功能使用#号注释代码。
3、缩进必须是统一的,不能空格和 tab 混用。
4、缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的。
5、YAML 文件内容和 Linux 系统大小写判断方式保持一致,是区别大小写的,k/v的值均需大小写数感。
6、k/v 的值可同行写也可换行写。同行使用:分隔。
7、v 可是个字符串,也可是另一个列表。
8、一个完整的代码块功能需最少元素需包括 name:task。
9、一个 name 只能包括一个 task。
10、YAML 文件扩展名通常为 yml 或 yaml。
11、list:列表,其所有元素均使用“-”打头。
示例:
#A list of tasty fruits
- Apple
- Orange
- Strawberry
- Mango
一一一一一
12、Dictionary :字典,通常由多个 key与 value 构成。
示例:
---
#An employee record
name:Example Developer
job:Developer
skill:Elite
也可以将 key:value 放置于{}中进行表示,用,分隔多个 key:value。
示例:
An employee record
{
name:Example Developer, job
:
Developer, skill:Elite
}
13、VAML 的语法和其他高阶语言类似,并且可以简单表达清单、散列表、标量等数据结构。
其结构 (Structure) 通过空格来展示,序列 (Sequence) 里的项用”-“来代表,Map 里的键值对用”:“分隔。
示例:
name:John Smith
age:41
gender:Malei
spouse
name:Jane Smith
age:37
gender;Female
children:
- name
:
Jimmy Smith
age:17
gender:Male
-name: Jenny Smith
gender,Female
五、Playbook 核心元素
1、Hosts 执行的远程主机列表
2、Tasks 任务集
3、Varniables 内置变量或自定义变量在 playbook 中调用
4、Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
5、Handlers 和 notity 结合使用,由特定条件触发的操作,满足条件方才执行,则不执行
6、tags 标签指定某条任务执行,用于选择运行 playbook 中的部分代码。
ansib 具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过 tags 跳过此些代码片断
ansible-playbook-t tagsname useradd. Yml
六、playbook 基础组件
1、Hosts:
playbook 中的每一个 play 的目的都是为了让某个或某些主机以某个指定的用户身份执行任务。hosts 用于指定要执行指定任务的主机,须事先定义在主机清单中‘
可以是如下形式:
one.example.com
one.example.com : two.example.com
192. 168.1. 50
192. 168.1.*
Websrvs:dbsrvs 两个组的并集
Websrvs:&dbsrvs 两个组的交集
webservers :Iphoenix 在 websrvs 组,但不在 dbsrvs 组
示例:-hosts:websrvs:dbsrvs
2、remote _ user:可用于 Host 和 task 中。也可以通过指定其通过 sudo 的方式在远程主机上执行任务,其可用于 play 全局或某任务;此外,甚至可以在 sudo 时使用 sudo _ user 指定 sudo 时切换的角户
-hosts:websrvs
remote _ user:root
tasks:
name:test connection
ping:
remote _ user:magedu
sudo;yes 默认sudo为root
sudo _ user: wang sudo为wang
3、task 列表和 action
play 的主体部分是 task list。 task list 中的各任务按次序逐个在 hosts 中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。
在运行自下而下某 playbook 时,如果中途发生错误,所有已执行任务都将回滚,因此,在更正 playbook 后重新执行一次即可。
task 的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致。
每个 task 都应该有其 name,用于 playbook 的执行结果输出,建议其内容尽可能清晰地描述任务执行步骤。如果未提供 name,则 action 的结果将用于输出。
4、tasks:任务列表
5、书写格式:
(1) action:module arguments
(2) module:arguments
(目前实用得多建议使用)
注意:shell 和 command 模块后面跟命令,而非 key=value
6、某任务的状态在运行后为 changed 时,可通过“notify”通知给相应的handlers
7、任务可以通过 "tags" 打标签,而后可在 ansible-playbook 命令上使用 -t 指定进行调用
示例:
tasks:
- name:disable selinux
command:/shin/ setenforce 0
8、如果命令或脚本的退出码不为零,可以使用如下方式替代
tasks:
-
name:run this command and ignore the result
shell:/usr/bin/ somecommand |I/bin/true
9、或者使用 ignore _ errors 来忽略错误信息:
tasks:
-
name:run this command and ignore the result
shell:/usr/bin/ somecommand
ignore _ errors:True
七、运行playbook
1、运行 playbook 的方式
ansible-playbook<filename. yml>...[options]
2、常见选项:
--check 只检测可能会发生的改变,但不真正执行操作
--list-hosts 列出运行任务的主机
--limit 主机列表只针对主机列表中的主机执行
-v 显示过程 -vv 、-vvv 显示的更详细
3、示例:
ansible-playbook file. yml--check 只检测
ansible-playbook file. yml
ansible-playbook file. yml--limit websrvs
八、playbook VS ShellScripts
1、SHELL 脚本:一一一一一一一一一一一一一
#!/bin/bash
#安装 Apache
yum install−-quiet-yhtpd
#复制配置文件
cp/tmp/httpd.conf/etc/httpd/conf/httpd.conf cp/tmp/vhosts.conf/etc/http/d/conf:d/I
#启动 Apache,并设置开机启动
servicehttpdstart
2、Playbook 定义:
-
hosts:all
tasks:
-name:"
安装 Apache"
yum:name=httpd
name:
“复制配置文件”
copy:src=/tmp/httpd.confdest=/etc/httpd/conf/
copy:src=/tmp/vhosts.confdest=/etc/httpd/conf.cd/
-name:
“启动 Apache,
并设置开机启动"
service;name= httpdstate = startedenabled =yes
九、示例
1、示例:sysuser. yml
-hosts:all
remote _ user:root
tasks:
-
name:create mysql user
user:name=mysql system=yes uid=36
-
name:create a group
group:name= httpdsystem =yes
2、示例:
httpd.yml
-
hosts:websrvs
remote user:root
tasks:
-name: Installhttpd
yum:name= httpdstate =present
-name:Install configure file
copy:src=files/httpd.confdest=/etc/httpd/conf/
-name;start service
service:name= httpdstate = startedenabled =yes
大体上配置服务,基本上是装包,拷贝基本文件,启动服务。
但此过程也会有一定的问题,如拷贝完文件,发现文件需要更改,更改完后继续拷贝过去,但服务已经启动过,注意服务重启才会生效,导致新文件无法生效,下节课就将介绍到高效的解决方法。