Ansible学习 / 系统运维

Ansible-Playbook介绍与使用

温馨提示:本文最后更新于2021-03-02 18:52:53,某些文章具有时效性,若有错误或已失效,请在下方留言或提交工单提交工单
浅时光 · 12月27日 · 2020年 · 本文4584个字,预计阅读12分钟 42902次已读

4.1:Playbook介绍


  • playbook剧本是由一个或多个play组成的列表
  • play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定义好的角色,Task实际是调用ansible的一个module,将多个play组织在一个playbook中,即可以让它们联合起来,按事先编排的机制执行预定义的动作
  • Playbook 文件是采用YAML语言编写的
Ansible-Playbook介绍与使用-浅时光博客

4.2:YAML语言


4.2.1:YAML语言介绍

YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年首次发表了这种语言,另外Ingy dot Net与0ren Ben-Kiki也是这语言的共同设计者,目前很多软件中采有此格式的文件,如:ubuntu,anisble,docker,k8s等

YAML:YAML Ain't Markup Language ,即YAML不是XML。不过,在开发的这种语言时,YAML的意思其实是:Yet Another Markup Language(仍是一种标记语言)

YA原文链接:https://www.dqzboy.comML官方网站:http://www.yaml.org

4.2.2:YAML语言特性

  • YAML的可读性好
  • YAML和脚本语言的交互性好
  • YAML使用实现语言的数据类型
  • YAML有一个一致的信息模型
  • YAML易于实原文链接:https://www.dqzboy.com
  • YAML可以基于流来处理
  • TAML表达能力强,扩展性好

4.2.3:YAML语法介绍

  • 在单一文件第一行,用连续三个连字号 - 开始,还有选择性的连续三个点号 用来表示文件的结尾
  • 次行开始正常写Playbook的内容,一般建议写明该Playbook的功能
  • 使用#号注释代码
  • 缩进必须是统一的,不能空格和tab混用
  • 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的,YAML文件内容是区别大小写的,key/value的值均需大小写敏感
  • 多个k/v可同行写与也可换行写,同行使用英文逗号分隔
  • value可以是个字符串,也可以是另一个列表
  • 一个完整的代码块功能需最少元素需包括name(名称)task(调用的模块)
  • 一个name只能包括一个task
  • YAML文件扩展名通常为ymlyaml

YA文章来源(Source):浅时光博客ML的语法和其他高阶语言类以,并且可以简单表达清单、散列表、标量等数据结构。其结构(Structure)通过空格来展示,序列(Sequence)里的项用-来代表,Map里的建值对用:分隔,下面介绍常见的数据结构。

4.2.3.1:List列表

  • 列表由多个元素组成,且所有元素前均使用-打头
范例:
#A list of tasty fruits
- Apple
- Orange
- Strawberry
- Mango

[Apple,Orange,Strawberry,Mango]

4.2.3.2:Dictionary字典

  • 字典通常由多个keyvalue构成
范例1:
#An employee record 
name: Example Developer
job: Developer
skill: Elite

#也可以将key:value放置于{}中进行表示,用英文逗号分隔多个key:value

#An employee record
{name: "Example Developer", job: "beveloper", skill: "Elite"}
范例2:
name: John Smith
age: 41
gender: Male
spouse:
  name: Jane Smith
  age: 37
  gender: Fenale
children:
  - name: Jimmy Smith
    age: 17
gender: Male
  - name: Jenny Smith
    age: 13
    gender: Female

4.2.4:三种创建的数据格式

  • XML:Extensible Markup Language,可扩展标记语言,可用于数据交换和配置
  • JSON: JavaScript Object Notation JavaScript对象表记法,主要用来数据交换或配置,不支持注释
  • YAML:YAML Ain't Markup Language YAML 不是一种标记语言,主要用来配置,大小写敏感,不支持tab
Ansible-Playbook介绍与使用-浅时光博客

4.3:核心元素


  • Hosts 执行的远程主机列表
  • Tasks 任务集
  • Variables内置变量或自定义变量在playbook中调用
  • Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
  • Handlersnotify结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
  • tags标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的,时间依然会非常地长。此时,如果确信其没有变化,就可以通过t原文链接:https://www.dqzboy.comags跳过此些代码片断

4.3.1:hosts组件

Hosts:playbook中的每一个play的目的都是为了让特定主机以某个指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,须事先定义在主机清单中

范例:
~]# vim /etc/ansible/hosts
[webservers]
192.168.66.[151:152]

[dbservers]
192.168.66.151

[appservers]
192.168.66.[152:153]

- hosts: webservers:appservers

4.3.2:remote_user组件

remote_user:可用于Hosttask中,也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户

- hosts: webservers
  remote_user: root   
tasks:
    - name: test connection       
      ping:
      remote_user: dqzboy
      sudo: yes  #默认sudo为root
      sudo_user: dqz  #sudo 为dqz

4.3.2:task列表和action组件

play的主体部分是task listtask list中有一个或多个task,各个task按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个task后,再开始第二个task

task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致

每个task都应该有其name,用于playbook的执行结果输出,建议其内容能清晰地描述任务执行步骤。如果未提供name,则action的结果将用于输出

task两种格式:
  1. action:module arguments
  2. module:arguments     #建议使用
  • 注意shell和command模块后面跟命令,而非key=value
范例:
---
- hosts: webservers
  remote_user: root
  tasks:
  - name: install httpd	#描述信息
    yum: name=httpd	#调用yum模块安装httpd服务
  - name: start httpd	#同样是描述信息
service: name=httpd state=started enabled=yes	#调用service模块启动httpd服务并设置开机自启

4.3.4:其它组件

某任务的状态在运行后为changed时,可通过notify 通知给相应的handlers任务可以通过tags打标签,可在ansible-playbook命令上使用-t指定进行调用

4.3.5:ShellSrcipt VS Playbook案例

(1)shell脚本实现

~]# vim install_apache
#!/bin/bash
#安装Apache, --quiet静默执行
yum install --quiet -y httpd
#设置为开机自动激活单元并现在立刻启动,--now参数
systemctl enable --now httpd

~]# chmod +x install_apache 
~]# ./install_apache

(2)Playbook实现

~]# vim install_apache.yaml	#yaml或者yml都可以
---
- hosts: webservers	#指定执行任务的主机列表
  remote_user: root 	#远程执行任务的用户
  tasks:
  - name: "安装Apache"	#描述信息
    yum: name=httpd	#执行的任务
  - name: "启动Apache,并设置开机启动"
service: name=httpd state=started enabled=yes

~]# ansible-playbook install_apache.yaml
Ansible-Playbook介绍与使用-浅时光博客

4.4:Playbook命令


格式:
ansible-playbook <filename.yml>...[options]
常见选项:
-C --check 	#只检测可能会发生的改变,但不真正执行操作
--1ist-hosts	#列出运行任务的主机
--list-tags	#列出tag
--list-tasks	#列出task
--limit 主机列表	#只针对主机列表中的主机执行
-v -vv -vvv	#提示过程
范例:
~]# ansible-playbook -C install_apache.yaml
~]# ansible-playbook --limit webservers install_apache.yaml

4.5:Playbook使用


4.5.1:利用playboo原文链接:https://www.dqzboy.comk创建mysql用户

~]# vim create_user.yml
- hosts: dbservers
  remote_user: root
  tasks:
  - name: create user
user: name=mysql shell=/sbin/nologin system=yes uid=3306 home=/data/mysql create_home=no

~]# ansible-playbook -C create_user.yml
~]# ansible-playbook create_user.yml
Ansible-Playbook介绍与使用-浅时光博客
#然后检查是否创建用户成功
[root@ansible-server ~]# ansible dbservers -a 'getent passwd mysql'
192.168.66.152 | CHANGED | rc=0 >>
mysql:x:3306:995::/data/mysql:/sbin/nologin

4.5.2:利用playbook安装Nginx

~]# vim install_nginx.yml
---
- hosts: webservers
  remote_user: root
  gather_facts: no	#不收集目标主机的系统信息等,加快执行效率
  tasks:
  - name: Install Nginx
    yum: name=nginx
  - name: Start Nginx
service: name=nginx state=started enabled=yes 

~]# ansible-playbook -C install_nginx.yml
~]# ansible-playbook  install_nginx.yml
Ansible-Playbook介绍与使用-浅时光博客




本文作者:浅时光
原文链接:https://www.dqzboy.com/4605.html
版权声明:知识共享署名-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)协议进行许可
转载时请以超链接形式标明文章原始出处和作者信息

2 条回应

必须 注册 为本站用户, 登录 后才可以发表评论!

  1. xuelang浙江·杭州2021-3-3 · 17:22

    大佬博客是自己写的么,太好看了

本站已稳定运行: | 耗时 0.389 秒 | 查询 38 次 | 内存 12.63 MB