概述
Playbook
1.Ansible Playbook与临时命令
临时命令可以作为一次性命令对一组目标主机运行一项简单的任务。不过,若要真正发挥Ansible的力量,需要了解如何使用playbook以便轻松重复的方式对一组目标主机执行多项复杂的任务。
play是针对清单中选定的主机运行的一组有序任务。playbook是一个文本文件,其中包含由一个或多个按特定顺序运行的play组成的列表。
Play可以将一系列冗长而复杂的手动管理任务转变为可轻松重复的例程,并且具有可预测的成功成果。在playbook中,可以将play内的任务序列保存为人类可读并可立即运行的形式。根据任务的编写方式,任务本身记录了部署应用或基础架构所需的步骤。
2. playbook基础组件
- Hosts:运行执行任务(task)的目标主机
- remote_user:在远程主机上执行任务的用户
- tasks:任务列表
- handlers:任务,与tasks不同的是只有在接受到通知时才会被触发
- templates:使用模板语言的文本文件
- variables:变量,变量替换
3.格式化Asible PLaybook
前面我们学习了临时命令模块,下面以一条命令做为案例来讲解下其在playbook中是如何编写的。
[root@master xk]# ansible 192.168.72.135 -m user -a 'name=xk uid=2500 state=present'
192.168.72.135 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true,
"comment": "",
"create_home": true,
"group": 2500,
"home": "/home/xk",
"name": "xk",
"shell": "/bin/bash",
"state": "present",
"stderr": "useradd:警告:此主目录已经存在。n不从 skel 目录里向其中复制任何文件。n正在创建信箱文件: 文件已存在n",
"stderr_lines": [
"useradd:警告:此主目录已经存在。",
"不从 skel 目录里向其中复制任何文件。",
"正在创建信箱文件: 文件已存在"
],
"system": false,
"uid": 2500
}
上面我们是用user模块来实现对对面的用户创建,那么我们现在用ansible中的paylbook(剧本)来实现在受管主机上创建用户
[root@master]# vim xk.yml
//这是用playbook写的一个剧本, 意思是创建用户
---
- name: test1
hosts: 192.168.72.135
//受管主机执行的IP地址
tasks:
//任务
- name: create user
//任务名,创建用户
user:
//利用user模块
name: xk
//用户名
uid: 2400
//指定id,当然也可以不指定,让其默认
state: present
//状态
[root@master]#
[root@master xk]# ansible-playbook xk.yml
//运行看是否报错,没有报错表示上面写的是正常的
PLAY [test1]
//测试*******************************************************************
TASK [Gathering Facts]
//获取对面的信息
*********************************************************
ok: [192.168.72.135]
TASK [create user]
//改变了这个任务 ***************************************************
changed: [192.168.72.135]
PLAY RECAP *********************************************************************
192.168.72.135
: ok=2
changed=1
unreachable=0
failed=0
skipped=0
rescued=0
ignored=0
[root@master xk]#
[root@localhost ~]# id xk
//查看发现受管主机已经创建用户test1
uid=2400(xk) gid=2400(xk) 组=2400(xk)
[root@localhost ~]#
Playbook是以YAML格式编写的文本文件,通常使用扩展名yml保存。Playbook使用空格字符缩进来表示其数据结构。YAML对用于缩进的空格数量没有严格的要求,但有两个基本的规则:
- 处于层次结构中同一级别的数据元素(例如同一列表中的项目)必须具有相同的缩进量。
- 如果项目属于其他项目的子项,其缩进量必须大于父项
只有空格字符可用于缩进,不允许使用tab键。约定俗成的缩进量一般是一级2个空格
Playbook开头的一行由三个破折号(—)组成,这是文档开始标记。其末尾可能使用三个圆点(…)作为文档结束标记,尽管在实践中这通常会省略。
在这两个标记之间,会以一个play列表的形式来定义playbook。YAML列表中的项目以一个破折号加空格开头。例如,YAML列表可能显示如下:
[root@master xk]# vim xk.yml
---
- name: test1
//也就是我们开头一行必须加-
hosts: 192.168.100.147
tasks:
- name: create test1 for user
//这里也是需要加-
user:
name: test1
uid: 2400
state: present
Play本身是一个键值对集合。同一play中的键应当使用相同的缩进量。以下示例显示了具有三个键的YAML代码片段。前两个键具有简单的值。第三个将含有三个项目的列表作为值,我们在这里为受管主机安装一个vsftpd服务,并且设置开机启动。
[root@master xk]# vim vsftpd.yml
//也就是说他可以一个剧本里面包含三个任务
---
- hosts: 192.168.72.135
tasks:
- name: vsftpd
yum:
name: vsftpd
state: latest
- name: service vsftpd
service:
name: vsftpd
state: started
enabled: yes
[root@master xk]#
[root@master]# ansible-playbook vsftpd.yml
//执行结果没有报错,并且对方已经下载vsftpd,并重启
PLAY [192.168.72.135] *********************************************************************************************
TASK [Gathering Facts] *********************************************************************************************
ok: [192.168.72.135]
TASK [vsftpd] ******************************************************************************************************
changed: [192.168.72.135]
TASK [service vsftpd] **********************************************************************************************
changed: [192.168.72.135]
PLAY RECAP *********************************************************************************************************
192.168.72.135
: ok=3
changed=2
unreachable=0
failed=0
skipped=0
rescued=0
ignored=0
[root@localhost ~]# rpm -qa |grep vsftpd
//查看发现受管主机安装了vsftpd,并且已经设置开机自启动
vsftpd-3.0.3-34.el8.x86_64
[root@localhost ~]# systemctl status vsftpd
● vsftpd.service - Vsftpd ftp daemon
Loaded: loaded (/usr/lib/systemd/system/vsftp>
Active: active (running) since Mon 2021-07-19>
Process: 825724 ExecStart=/usr/sbin/vsftpd /et>
4.语法验证
//语法验证成功
[root@localhost opt]# ansible-playbook --syntax-check playbook/auto.yml
playbook: playbook/auto.yml
//语法验证失败
[root@localhost opt]# ansible-playbook --syntax-check playbook/auto.yml
ERROR! We were unable to read either as JSON nor YAML, these are the errors we got from each:
JSON: Expecting value: line 1 column 1 (char 0)
Syntax Error while loading YAML.
did not find expected key
The error appears to be in '/opt/playbook/auto.yml': line 9, column 7, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
- name: enabled autofs
^ here
5.执行空运行
//可以使用-C选项对playbook执行空运行。这会使Ansible报告在执行该playbook时将会发生什么更改,但不会对受管主机进行任何实际的更改。
[root@localhost opt]#ansible-playbook -C playbook/httpd.yml
6.实施多个play
[root@localhost playbook]# vim test.yml
---
- hosts: httpd
tasks:
- name: create user qwer uid 4567
user:
name: qwer
uid: 4567
state: present
- hosts: mysql
tasks:
- name: create user lol uid 6789
user:
name: lol
uid: 6789
state: present
//
[root@localhost opt]# ansible-playbook playbook/test.yml
PLAY [httpd] *******************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.72.135]
TASK [create user qwer uid 4567] ***********************************************
changed: [192.168.72.135]
PLAY [mysql] *******************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.72.136]
TASK [create user lol uid 6789] ************************************************
changed: [192.168.72.136]
PLAY RECAP *********************************************************************
192.168.72.136
: ok=2
changed=1
unreachable=0
failed=0
skipped=0
rescued=0
ignored=0
192.168.72.135
: ok=2
changed=1
unreachable=0
failed=0
skipped=0
rescued=0
ignored=0
7.play中的远程用户和特权升级
//指定用户
remote_user: remoteuser
//升级特殊权限
become: true
//实例
[root@localhost playbook]# vim test.yml
---
- hosts: php
remote_user: xym
become: yes
tasks:
- name:
lineinfile:
path: /etc/hosts
line: '192.168.72.135 www.php.com'
state: present
//运行
[root@localhost opt]# ansible-playbook playbook/test.yml
PLAY [php] *********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.72.135]
TASK [lineinfile] **************************************************************
changed: [192.168.72.135]
PLAY RECAP *********************************************************************
192.168.72.135
: ok=2
changed=1
unreachable=0
failed=0
skipped=0
rescued=0
ignored=0
//查看受控主机
[root@php ~]# visudo
[root@php ~]# cat /etc/hosts
127.0.0.1
localhost localhost.localdomain localhost4 localhost4.localdomain4
::1
localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.72.135 www.php.com
8.playbook语法变化
YAML注释
注释也可以用于提高可读性。在YAML中,编号或井号字符(#)右侧的所有内容都是注释。如果注释的左侧有内容,请在该编号符号的前面加一个空格
# This is a YAML comment
some data # This is also a YAML comment
YAML字符串
YAML中的字符串通常不需要放在引号里,即使字符串中包含空格。字符串可以用双引号或单引号括起。
this is a string
'this is another string'
"this is yet another a string"
编写多行字符串有两种方式。可以使用管道符表示要保留字符串中的换行字符。
include_newlines: |
Example Company
123 Main Street
Atlanta, GA 30303
要编写多行字符串,还可以使用大于号字符来表示换行字符转换成空格并且行内的引导空白将被删除。这种方法通常用于将很长的字符串在空格字符处断行,使它们跨占多行来提高可读性。
fold_newlines: >
This is an example
of a long string,
that will become
a single sentence once folded.
最后
以上就是天真音响为你收集整理的PlaybookPlaybook的全部内容,希望文章能够帮你解决PlaybookPlaybook所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复