一、 Playbook的介绍与运用
(一)、介绍
1、laybook与ad-hoc相比,是一种完全不同的运用ansible的方式,类似与saltstack的state状态文件。ad-hoc无法持久使用,playbook可以持久使用
2、playbook是由一个或多个play组成的列表,play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓的task无非是调用ansible的一个module。将多个play组织在一个playbook中,即可以让它们联合起来按事先编排的机制完成某一任务
(二)、Playbook的核心元素
Hosts | 执行的远程主机列表 |
Tasks | 任务集 |
Varniables | 内置变量或自定义变量在playbook中调用 |
Templates(模板) | 即使用模板语法的文件,比如配置文件等 |
Handlers 和notity结合使用 | 由特定条件触发的操作,满足条件方才执行,否则不执行 |
tags(标签) | 指定某条任务执行,用于选择运行playbook中的部分代码 |
(三)、playbook的YAML基本规则
playbook使用yaml语法格式,后缀可以是yaml,也可以是yml
1、在单一一个playbook文件中,可以连续三个连子号(---)区分多个play。还有选择性的连续三个点好(...)用来表示play的结尾,也可省略
2、次行开始正常写playbook的内容,一般都会写上描述该playbook的功能
3、使用#号注释代码
4、缩进必须统一,不能空格和tab混用
5、缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行实现的
6、YAML文件内容和Linux系统大小写判断方式保持一致,是区分大小写的,k/v 的值均需大小写敏感
7、k/v的值可同行写也可以换行写。同行使用 : 分隔
8、v可以是个字符串,也可以是一个列表
9、一个完整的代码块功能需要最少元素包括 name: task
案例
[root@Ansible ~]# vim jb.yaml
---
- hosts: node
remote_user: root
tasks:
- name: "测试"
file: name=/home/aaa.txt state=touch
- name: "创建用户"
user: name=aaa system=yes shell=/sbin/nologin
- name: "安装服务"
yum: name=httpd
- name: "复制html页面"
copy: src=/var/www/html/index.html dest=/var/www/html/index.html
- name: "启动服务"
service: name=httpd state=started
保存
——————————————————————————————————————————————————————————
--------- 说明
--- #固定格式
- hosts: node1 #定义需要执行主机
remote_user: root #远程用户
tasks: #定义一个任务的开始
- name: "测试" #定义任务的名称
file: name=/home/aaa.txt state=touch #调用模块,具体要做的事情
——————————————————————————————————————————————————————————
[root@Ansible ~]# mkdir -p /var/www/html/
[root@Ansible ~]# echo "<h1>playbook 测试</h1>" >>/var/www/html/index.html
[root@Ansible ~]# ansible-playbook -C jb.yaml #使用-C进行测试
PLAY [node] **************************************************************************************************
TASK [Gathering Facts] ***************************************************************************************
ok: [192.168.2.11]
ok: [192.168.2.12]
TASK [测试] ****************************************************************************************************
changed: [192.168.2.11]
changed: [192.168.2.12]
TASK [创建用户] **************************************************************************************************
changed: [192.168.2.12]
changed: [192.168.2.11]
TASK [安装服务] **************************************************************************************************
changed: [192.168.2.11]
changed: [192.168.2.12]
TASK [复制html页面] **********************************************************************************************
changed: [192.168.2.11]
changed: [192.168.2.12]
TASK [启动服务] **************************************************************************************************
changed: [192.168.2.11]
changed: [192.168.2.12]
PLAY RECAP ***************************************************************************************************
192.168.2.11 : ok=6 changed=5 unreachable=0 failed=0
192.168.2.12 : ok=6 changed=5 unreachable=0 failed=0
正式执行命令
[root@Ansible ~]# ansible-playbook jb.yaml
PLAY [node] **************************************************************************************************
TASK [Gathering Facts] ***************************************************************************************
ok: [192.168.2.12]
ok: [192.168.2.11]
TASK [测试] ****************************************************************************************************
changed: [192.168.2.11]
changed: [192.168.2.12]
TASK [创建用户] **************************************************************************************************
changed: [192.168.2.12]
changed: [192.168.2.11]
TASK [安装服务] **************************************************************************************************
changed: [192.168.2.11]
changed: [192.168.2.12]
TASK [复制html页面] **********************************************************************************************
changed: [192.168.2.12]
changed: [192.168.2.11]
TASK [启动服务] **************************************************************************************************
changed: [192.168.2.11]
changed: [192.168.2.12]
PLAY RECAP ***************************************************************************************************
192.168.2.11 : ok=6 changed=5 unreachable=0 failed=0
192.168.2.12 : ok=6 changed=5 unreachable=0 failed=0
验证访问
(四)、playbook的参数
格式
ansible-playbook <filename.yml> ... [options]
参数 | 说明 |
--syntax-check | 检测yaml文件的语法 |
-C(--check) | 预测试,不会改变目标主机的任何设置 |
--limit | 主机列表 只针对主机列表中的某个主机或者某个组执行 |
--list-hosts | 列出yaml文件影响的主机列表 |
--list-tasks | 列出playbook文件执行的所有任务 |
--list-tags | 列出playbook文件中所有可用的标签(tags) |
-t TAGS (--tags=TAGS) | 表示只运行标记此标签的任务 |
--skip-tags=SKIP_TAGS | 表示跳过运行标记此标签的任务,执行其他任务 |
--start-at-task=START_AT | 从指定的任务开始往下运行 |
--flush-cache | 清除fact缓存 |
--force-handlers | 如果任务失败,也要运行handlers |
--step | 在运行之前确认每个任务 |
-e | 传入变量 |
-f | 指定并发数,默认为5个 |
-t | 指定tags运行,运行某一个或者多个tags。(前提playbook中有定义tags) |
-v | 显示过程 -vv -vvv更详细 |
(五)、Playbook中配置文件
1、 主机与用户
在一个playbook的开头,最先定义的是要操作的主机和用户
---
- hosts: node
remote_user: root
在某一个tasks中定义要执行该任务的远程用户
tasks:
- name: run df -h
remote_user: aaa
shell: name=df -h
也可以定义使用sudo授权用户执行该任务
tasks:
- name: run df -h
sudo_user: aaa
sudo: yes
shell: name=df -h
2、tasks任务列表
每一个task必须有一个名称name,这样在运行playbook时,从其输出的任务执行信息中可以很清楚的辨别是属于哪一个task的,如果没有定义 name,action的值将会用作输出信息中标记特定的task
每一个playbook中可以包含一个或者多个tasks任务列表,每一个tasks完成具体的一件事,(任务模块)比如创建一个用户或者安装一个软件等,在hosts中定义的主机或者主机组都将会执行这个被定义的tasks
tasks:
- name:"创建文件"
file: path=/tmp/aaa.txt state=touch
- name: "创建用户"
user: name=aaa state=present
3、Handlers(动作)与Notify(触发)
在很多时候当我们某一个配置发生改变,我们需要重启服务,(比如httpd配置文件文件发生改变了)这时候就可以用到handlers和notify了;
(当发生改动时)notify actions会在playbook的每一个task结束时被触发,而且即使有多个不同task通知改动的发生,notify actions知会被触发一次;比如多个resources指出因为一个配置文件被改动,所以apache需要重启,但是重新启动的操作知会被执行一次
————————————————————给2.10 服务器拷贝一份配置文件
[root@node1 ~]# cd /etc/httpd/conf/
[root@node1 conf]# ls
httpd.conf magic
[root@node1 conf]# scp httpd.conf root@192.168.2.10:/root/
The authenticity of host '192.168.2.10 (192.168.2.10)' can't be established.
ECDSA key fingerprint is SHA256:W/vWUUz52EWoxAj6qq8J91ffWH4p8nCvmdGQCmUbRNo.
ECDSA key fingerprint is MD5:b2:4f:b6:ff:94:3a:1e:3d:2e:f8:f4:4e:f5:8c:ca:a9.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.2.10' (ECDSA) to the list of known hosts.
root@192.168.2.10's password:
httpd.conf 100% 11KB 15.1MB/s 00:00