03-编写和运行 Playbook
2026/3/30 18:35:57 网站建设 项目流程

实验环境

[laoma@controller ~]$mkdirweb&&cdweb[laoma@controller web]$cat>ansible.cfg<<'EOF' [defaults] remote_user = laoma inventory = ./inventory [privilege_escalation] become = True become_user = root become_method = sudo become_ask_pass = False EOF[laoma@controller web]$cat>inventory<<'EOF' controller node1 node2 node3 node4 EOF

Playbook 介绍

adhoc 命令可以作为一次性命令对一组主机运行一项简单的任务。不过,若要真正发挥Ansible的能力,需要使用功能 playbook。
playbook 是一个文本文件,其中包含由一个或多个按特定顺序运行的play组成的列表。play针
对清单中选定的主机运行的一组有序任务。play可以让您将一系列冗长而复杂的手动管理任转
变为可轻松重复的例程,并且具有可预测性。
在 playbook 中,您可以将play内的任务序列保存为人类可读并可立即运行的形式。根据任务的
编写方式,任务本身记录了部署应用或基础架构所需的步骤。
ad hoc 命令示例:

[laoma@controller web]$ ansible -m user -a"name=newbie uid=4000 state=present"node1

Playbooks以yaml格式编写,通常以 yaml 和 yml 扩展名保存。

改写成playbook:

--- - name: Configure important user consistently hosts: node1 tasks: - name: newbie exists withUID4000user: name: newbie uid:4000state: present...

yaml格式只使用空格缩进,对于空格的数量没有强制要求,正常使用2个空格。
基本规则:

  • 同一级别的元素,使用相同的缩进。
  • 对于子项目,使用比父项目更多的缩进。
  • 增加空白行,提高可读性。

Vim 编辑器设置

如果使用vim编辑器,设置vim环境便于编辑Playbooks。
在$HOME/.vimrc文件中添加以下内容:

setaits=2number

或者

autocmd FileType yamlsetaits=2

效果:

  • “ai”,即 “autoindex”,表示自动缩进。
  • “ts”,即 “tabstop”,表示tab键使用2个空格代替。
  • “number”,显示行号。
  • autocmd FileType yam,代表文件类型是yaml时,自动执行“set ai ts=2”。

Playbook 编写

Playbook 示例

playbook.yaml 内容如下:

# yaml格式起始行,一般不省略---# Playbook中第一个play# play具有属性:name,hosts,become,tasks,缩进一致# name属性,用于简要描述play- name: debploy WebSite# hosts属性,用于定义要在哪个受管理节点执行hosts: webs# tasks属性,用于描述play中任务,属性是列表格式tasks:# 第一个任务# 任务具有属性:涵name和模块名等。# name属性,用于简要描述任务- name: latest version of httpd and firewalld installed# 指明模块名,也就是要执行的任务yum:# 指定要操作的rpm包名称name:# rpm包名称是-开头的列表格式,或者逗号分隔的列表格式- httpd - firewalld# 定义软件包的状态,lastet代表升级为最新版本state: latest# 第二个任务- name: prepare index.html# copy 模块,用于将content属性值写入到目标文件copy: content:"Welcome to Laoma WebSite!\n"dest: /var/www/html/index.html# 第三个任务- name:enableand start httpd# service模块,用于启用并启动httpd服务service: name: httpd enabled:truestate: started# 第四个任务- name:enableand start firewalld# service模块,用于启用并启动firewalld服务service: name: firewalld enabled:truestate: started# 第五个任务- name: firewalld permits access to httpdservice# firewalld,用于放行http服务firewalld: service: http permanent:truestate: enabled immediate:yes# Playbook中第二个play,-开头表示列表- name: Test WebSite hosts: localhost become: no tasks: - name: connect to intranet web server# uri模块,用于测试网站是否可以访问uri: url: http://{{item}}loop: - node1 - node2# yaml格式结束行,一般省略...

YAML 注释

在 YAML中, 编号或井号符号(#)右侧的所有内容都是注释。如果注释的左侧有内容, 请在该编号符号的前面加一个空格。注释可用于提高可读性。
示例:

# This is YAML commentSome data# This is also a YAML comment

YAML 单行字符串

YAML中的字符串通常不需要放在引号里,即使字符串中包含空格。
字符串也可以用双引号或单引号括起。

this is a string'this is another string'"this is yet another a string"

YAML 多行字符串

  • 可以使用竖线(I)字符表示,保留字符串中的换行字符。

    示例:

--- - name:teststring hosts: node1 tasks: - name:teststring# 用户显示变量值或者字符串debug: msg:|Example Company123Main Street Atlanta, GA30303
  • 也可以使用大于号(>)字符表示换行字符。执行时换行符使用空格代替,并且行内的引导空白将被删除。

    示例:

--- - name:teststring hosts: node1 tasks: - name:teststring# 用户显示变量值或者字符串debug: msg:>This is an example of a long string, that will become a single sentence once folded.

这种方法通常用于将很长的字符串在空格字符处断行,使它们跨占多行来提高可读性。

YAML 字典

一组键值对的集合,又称为映射(mapping)和哈希(hashes)。
以缩进块的形式编写键值对集合,如下方所示:user属性是字典格式,是多个键值对集合。

user: name: laoma uid:1088state: absent

字典也可以使用以花括号括起的内联块格式编写,如下方所示:

user:{name: laoma, uid:1088, state: absent}

大多数情形中应避免内联块格式,其可读性较差。不过,当playbook中包含角色列表时,使用这种语法,更加容易区分play中包含的角色和传递给角色的变量。
某些 playbook 可能使用较旧的简写(shorthand)格式,通过将模块的键值对放在与模块名相
同的行上来定义任务。
示例:

- name: shorhand form user:name=laomauid=1088state=absent

普通格式:

- name: shorhand form user: name: laoma uid:1088state: absent

两者格式总结:

  • 通常您应避免简写格式,而使用普通格式。

  • 普通格式的行数较多,更容易操作。任务的关键字垂直堆叠,更容易区分。 阅读play时,您的眼睛直接向下扫视,左右运动较少。

  • 普通格式是原生的YAML,现代文本编辑器中的语法突出显示工具可以识别,简写形式则不

    支持。

  • 可能会在文档和他人提供的旧playbook中看到这种语法,而且这种语法仍然可以发挥作用。

YAML 列表

一组按次序排列的值,又称为序列(sequence)和数组(array)。
以缩进块的形式编写的键值对集合,如下方所示:

- name: latest version of httpd and firewalld installed yum: name: - httpd - firewalld state: latest - name:testhtml page is installed copy: content:"Welcome to the example.com intranet!\n"dest: /var/www/html/index.html

以上有两个任务,每个任务都是多个键值对描述。其中yum模块操作的软件包是一个简单的名称列表。
内联格式:

name:[httpd, firewalld]

尽量避免内联格式。

Playbook 运行

运行

[laoma@controller web]$ ansible-playbook playbook.yaml

第二次执行剧本,任务状态全是绿色。

语法检查

选项–syntax-check,只检查剧本语法,不执行剧本。

[laoma@controller web]$ ansible-playbook playbook.yaml --syntax-check

空运行

空运行,是指模拟运行,并不是真正执行。

[laoma@controller web]$ ansible-playbook playbook.yaml -C

提高输出详细程度

  • -v,显示任务结果。一般情况使用 -v 即可。

  • -vv,任务结果和任务配置都会显示。

  • -vvv,包含关于与受管主机连接的信息。

  • -vvvv,增加了连接插件相关的额外详细程度选项,包括受管主机上用于执行脚本的用户,

    以及所执行的脚本。

Playbook 提权

在playbook中指定此关键字将覆盖/etc/ansible/ansible.cfg文件中的设置特权升级属性

  • remote_user,指定ssh用户
  • become,启用或禁用特权升级
  • become_method,启用特权升级的方法
  • become_user,特殊升级的帐户
--- - name: Enable intranet services hosts: node1 remote_user: laoma become:truebecome_method:sudobecome_user: root tasks: - name: latest version of httpd and firewalld installed yum: name: - httpd - firewalld state: latest 启用或禁用特权升级 - become_method,启用特权升级的方法 - become_user,特殊升级的帐户 ```bash --- - name: Enable intranet services hosts: node1 remote_user: laoma become:truebecome_method:sudobecome_user: root tasks: - name: latest version of httpd and firewalld installed yum: name: - httpd - firewalld state: latest

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询