---------源码附在文末---------
前言
Playbook 是 Ansible “任务书”,它采用了 YAML
语法,学习 Ansible 以及前置配置请移步:Ansible的原理与配置
Playbook
扩展名:.yml
/ .yaml
格式:严格的缩进语法,两个空格(建议不用 Tab);采用键值对格式
开头:---
正文:(以 play 列表的形式定义 Playbook)
项目:- 项目
一个 play 下可以对应多个任务(tasks
)
键值对之间需要有空格隔开
末尾:...
(一般不写)
若有任务执行失败,其后任务不再执行
每个 play 前会默认加一条任务:收集事实(Gathering Facks
)
最简单的 Playbook 的正文部分包括的键有:play名(name
)、主机或主机组(hosts
)、任务列表(tasks
);
一个任务列表包括:任务名(name
)、模块名、模块相关参数。
play名、任务名、列表前必须加-
+空格
下面以装包为例写一个Playbook:
---
- name: install packages # 名字随便起
hosts: WebServers # 这个主机(组)必须写在清单里(inventory)
tasks: # 任务列表,一个键对应多个值
- name: install httpd and firewalld packages
yum: # yum 是一个 ansible 模块
name: # 这里的 name 是 yum 模块的一个参数(包名)
- httpd # 这里有两个包,可以以列表形式列出,也可以分别写两个任务(其他模块不一定可以如此列出)
- firewalld
state: latest # yum 的参数,指定软件包的状态(最新)
查看包相关信息:ansible-doc 包名
检查Playbook语法:ansible-playbook 文件名.yml --syntax-check
空执行:ansible-playbook 文件名.yml -C
/ ansible-playbook 文件名.yml -check
执行Playbook:ansible-playbook 文件名.yml
实验
任务:
给 web主机组
写一个 Playbook,该 Playbook 有两个 play,第一个 play 可以保证在 web主机组
上安装 httpd
和 php
,确保 web主机组
的 /var/www/html/
目录下面有一个文件为 index.php
,内容显示 phpinfo 界面;
该 Playbook 里面的第二个 play 用于测试该 web 主机组的 web 服务能否被成功访问 index.php
内容。
- 环境配置
前置环境配置在 Ansible的原理与配置 有详细描述,包括 IP 、DNS 解析、免密SSH、免密sudo等
本文只对清单、配置文件、Playbook做以详细描述
以 class 的身份创建工作目录:mkdir /home/class/web
- 编写清单:
vim inventory
- 编写配置文件:
vim ansible.cfg
- 编写 Playbook:
vim web.yml
(文件名随便起)
文末的~
是 vim 特色,表示空行,与 Playbook 无关
httpd 服务需要重启(restarted)而不是开启(started),因为每次修改完服务配置后需要重启,新增能加的 PHP 配置即应如此。started 不能达到重启的效果 - 检查语法:
ansible-playbook web.yml --syntax-check
执行:ansible-playbook web.yml
可以用命令行来访问一下:curl node12
源码
Ansible清单:
master
[web]
node12
node13
Ansible配置文件:
[defaults]
inventory=./inventory
remote_user=student
ask_pass=false
[privilege_escalation]
become=true
become_method=sudo
become_user=root
become_ask_pass=false
Playbook:
---
# The first play
- name: Build a Web site
hosts: web
tasks:
- name: Install the httpd php package
yum:
name:
- httpd
- php
state: latest
- name: Create an index.php page
copy:
content: "<?php\nphpinfo();\n"
dest: /var/www/html/index.php
- name: Delete the index.html page
file:
path: /var/www/html/index.html
state: absent
- name: Add a firewall rule
firewalld:
service: http
state: enabled
permanent: true
immediate: true
- name: Restart on the httpd service
service:
name: httpd
state: restarted
enabled: yes
# The second play
- name: URL testing
hosts: master
tasks:
- name: Connect to node12 web server
uri:
url: http://node12
- name: Connect to node13 web server
uri:
url: http://node13