playbook基础
基础知识
playbook
ansible七种武器
JSON简介
YAML简介
Jinja2模版简介
playbook是什么
playbook语法基础
playbook基础
基础知识
ansible七种武器
- 第一种武器
ansible命令,用于执行临时性的工作,必须掌握
- 第二种武器
ansible-doc是ansible模块的文档说明,针对每个模块都有详细的说明及应用案例介绍,功能和Linux系统man命令类似,必须掌握
- 第三种武器
ansible-console:是ansible为用户提供的交互式工具用户可以在ansible-console虚拟出来的终端上像Shell一样使用ansible内置的各种命令 ,这为 习惯使用Shell交互方式的用户提供了良好的使用体验
- 第四种武器
ansible-galaxy从github.上下载管理Roles的一款工具与python的pip类似
- 第五种武器
ansible- playbook是日常应用中使用频率最高的命令,工作机制:通过读取先编写好的playbook文件实现批量管理,可以理解为按一定条件组成的ansible任务集 ,必须掌握
- 第六种武器
ansible-vault主要用于配置文件加密,如编写的playbook文件中包含敏感信息,不想其他人随意查看, 可用它加密/解密这个文件
- 第七种武器
1.ansible-pull
2.ansible有两种工作模式pull/push , 默认使用push模式工作, pull和push.工作模式机制刚好相反
3.适用场景:有大批量机器需要配置,即便使用高并发线程依旧要花费很多时间
4.通常在配置大批量机器的场景下使用,灵活性稍有欠缺,但效率几乎可以无限提升,对运维人员的技术水平和前瞻性规划有较高要求
JSON简介
- JSON是什么
JSON是JavaScript对象表示法,它是一 种基于文本独立于语言的轻量级数据交换格式
JSON中的分隔符限于单引号" ' ", 小括号" ()"、中括号"[]”、大括号"{}"、冒号":"和逗号"
- JSON特性
JSON是纯文本
JSON具有"自我描述性" (人类可读)
JSON具有层级结构(值中存在值)
JSON可通过JavaScript进行解析
- JSON语法规则
数据在名称/值对中
数据由逗号分隔
大括号保存对象
中括号保存数组
- JSON数据的书写格式是: 名称/值对
名称/值对包括字段名称(在双引号中) ,后面写个冒号,然后是值,例如:
"诗仙”: "李白"
- JSON语法规则之数组
{ "诗人":
["李白", "杜甫","白居易","李贺"]
}
- 复合复杂类型
{"诗人":
[{"李白":"诗仙","年代":"唐"}
{"杜甫":"诗圣","年代":"唐"}
{"白居易":"诗魔","年代":"唐"}
{"李贺":" 诗鬼","年代":"唐"}
]
}
YAML简介
- YAML简介
是一个可读性高,用来表达数据序列的格式
YAML ( YAML Ain't Markup Language )
YAML参考了多种语言, 如: C语言、Python、 Perl等, 并从XML、电子邮件的数据格式中获得灵感, Clark Evans在2001年首次发表了这种语言,目前已有数种编程语言或脚本语言支持这种语言
- YAML基础语法
YAML的结构通过空格来展示
数组使用"-"来表示
YAML使用一个固定的缩进风格表示数据层级结构关系
一般每个缩进级别由两个以上空格组成
#表示注释
- 注意:
不要使用tab ,缩进是初学者容易出错的地方之一
同一层级缩进必须对齐
- YAML的键值表示方法
采用冒号分隔
:后面必须有一个空格
YAML键值对例子
"诗仙”: "李白”
或
"李白":
"诗仙”
- 复杂YAML的键值对嵌套
"诗人":
"李白": "诗仙"
或
"诗人":
"李白":
"诗仙”
数组
["李白","杜甫","白居易","李贺"]
- YAML数组表示方法
使用一个短横杠加一个空格
YAML数组例子
- "李白"
- "杜甫"
- "白居易"
- "李贺"
哈希数组复合表达式
"诗人":
- "李白"
- "杜甫"
- "白居易"
- "李贺"
高级复合表达式
"诗人":
-
"李白": "诗仙"
"年代": "唐"
-
"杜甫": "诗圣"
"年代": "唐"
-
"白居易": "诗魔”
"年代": "唐"
-
"李贺": "诗鬼”
"年代": "唐"
Jinja2模版简介
- Jinja2是什么
Jinja2是基于Python的模板引擎,包含变量和表达式两部分,两者在模板求值时会被替换为值,模板中还有标签,控制模板的逻辑
- 为什么要学习Jinja2模版
因为playbook的模板使用Python的Jinja2模块来处理
- Jinja2模版基本语法
模板的表达式都是包含在分隔符"{{ }}" 内的
控制语句都是包含在分隔符"{% %}" 内的
模板支持注释,都是包含在分隔符"{# #}"内,支持块注释
调用变量
{{varname}}
计算
{{2+3}}
判断
{{1 in [1,2,3]}}
- Jinja2模版控制语句
{% if name == '诗仙' %}
李白
{% elif name == '诗圣' %}
杜甫
{% elif name == '诗魔' %}
白居易
{%else%}
李贺
{% endif %}
- Jinja2模版控制语句
{% if name == ...%}
.......
{% elif name == '于谦' %}
{% for method in [抽烟,喝酒,烫头] %}
{{do method}}
{% endfor %}
.......
{% endif %}
- Jinja2过滤器
变量可以通过过滤器修改。过滤器与变量用管道符号(I )分割,也可以用圆括号传递可选参数,多个过滤器可以链式调用,前一个过滤器的输出会被作为后一个过滤器的输入
- 例如
把一个列表用逗号连接起来: {{ listljoin(, ') }}
过滤器这里不再 ---- 列举,需要的可以查询在线文档http://docsjinkan.org/docs/jinja2/templates.html#builtin-filters
playbook
playbook是什么
- playbook是什么
1.playbook是ansible用于配置,部署和管理托管主机剧本,通过playbook的详细描述,执行其中的一系列tasks ,可以让远端主机达到预期状态
2.也可以说, playbook字面意思即剧本,现实中由演员按剧本表演,在ansible中由计算机进行安装,部署应用,提供对外服务,以及组织计算机处理各种各样的事情
playbook语法基础
- playbook语法格式
1.playbook由YAML语言编写,遵循YAML标准
2.在同一行中, #之后的内容表示注释
3.同一个列表中的元素应该保持相同的缩进
4.playbook由一个或多个play组成
5.play中hosts , variables ,roles,tasks等对象的表示方法都是键值中间以": "分隔表示
6.YAML还有一个小的怪癖,它的文件开始行都应该是 -- 这是YAML格式的一部分,表明一个文件的开始
playbook
hosts 定义主机的集合
vars 定义变量表达式
tasks 定义命令的集合
- playbook构成
1.Target :定义将要执行playbook的远程主机组
2.Variable :定义playbook运行时需要使用的变量
3.Tasks :定义将要在远程主机上执行的任务列表
4.Handler :定义task执行完成以后需要调用的任务
- playbook执行结果
- 使用ansible-playbook运行playbook文件,输出内容为JSON格式,由不同颜色组成便于识别
绿色代表执行成功
***代表系统代表系统状态发生改变
红色代表执行失败
- 第一个playbook
[root@web1 ~]# vim ping.yml
--- # 第一行,表示开始
- hosts: all
remote_user: root
tasks:
- ping:
# - 模块名: 模块参数
[root@web1 ~]# ansible-playbook ping.yml
-f 并发进程数量,默认是5
hosts行内容是一个(多个)组或主机的patterns,以逗号为分隔符
remote_user 账户名
- tasks
1.每一个play包含了一个task列表(任务列表)
2.一个task在其所对应的所有主机上(通过host pattern 匹配的所有主机)执行完毕之后,下一个task才会执行
3.有一点很重要,在一个play之中,所有hosts会获取相同的任务指令,这是play的一个目的所在,即将一组选出的hosts映射到task ,执行相同的操作
- playbook执行命令
给xl主机添加用户aa ,设置默认密码123
要求第一次登录修改密码
[root@web1 ~]# ansible-doc -l | grep user
[root@web1 ~]# ansible-doc user
[root@web1 ~]# ansible-doc shell
[root@web1 ~]# vim user.yml
--- # 第一行,表示开始
- hosts: xl
remote_user: root
tasks:
# - 模块名: 模块参数
- user:
name: aa
- name: 注释和说明!
shell: echo 123 | passwd --stdin aa
- shell: chage -d 0 aa
# 设置它的有效期为0
或
--- # 第一行,表示开始
- hosts: xl
remote_user: root
tasks:
# - 模块名: 模块参数
- name: create user aa
user:
name: aa
- name: 注释和说明!
shell: echo 123 | passwd --stdin aa
- shell: chage -d 0 aa
# 设置它的有效期为0
[root@web1 ~]# ansible-playbook user.yml
--- # 第一行,表示开始
- hosts: mysql1
remote_user: root
tasks:
# - 模块名: 模块参数
- name: 创造用户名!
user:
name: aa
- name: 设置密码!
shell: echo 123 | passwd --stdin aa
- shell: chage -d 0 aa
# 设置它的有效期为0
安装Apache并修改监听端口为888
修改ServerName配置,执行apachectl -t命令不报错
设置默认主页hello ansible
启动服务并设开机自启
[root@web1 ~]# ansible-doc yum
[root@web1 ~]# ansible-doc lineinfile
[root@web1 ~]# vim index.html
hello ansible
[root@web1 ~]# ansible-doc copy
[root@web1 ~]# ansible-doc service
[root@web1 ~]# vim httpd.yml
---
- hosts: all
remote_user: root
tasks:
- name: 部署Apache
yum:
name: httpd
state: latest
- lineinfile:
path: /etc/httpd/conf/httpd.conf
regexp: '^Listen '
insertafter: '^#Listen '
line: 'Listen 8080'
- lineinfile:
path: /etc/httpd/conf/httpd.conf
regexp: '^Listen '
line: 'ServerName localhost'
- copy:
src: /root/index.html
dest: /var/www/html/index.html
owner: apache
group: apache
mode: 0644
- service:
name: httpd
state: started
enabled: yes
[root@web1 ~]# ansible-playbook httpd.yml
测试
[root@web1 ~]# ssh xl
[root@xl ~]# ss -untlp | grep 8080
[root@xl ~]# apachectl -t
[root@xl ~]# curl 127.0.0.1:8080
[root@xl ~]# systemctl is-enabled httpd