《Ansible权威指南》笔记(4)——Playbook
七、Playbook
1、语法特性如下:
(1)"---"首行顶格开始
(2)#号注释
(3)缩进统一,不同的缩进代表不同的级别,缩进要对齐,空格和tab不能混用
(4)区别大小写,键值对k/v的值也大小写敏感
(5)k/v的值同行使用":"分开,换行写需以"-"分隔
2、格式
---
- name: test
hosts: test
gather_facts: no
vars:
http: 8080
https: 1443
vars_files:
- vars/server_vars.yml
remote_user: root
sudo: yes
tasks:
- name: test1
copy: src=/opt/apps/web/* dest=/opt/apps/web/
notify:
- restart apache
- name: test2
yum: name={{ item }} state=present
with_items:
- httpd
- httpd-devel
- name: test3
shell: "echo $TEST"
environment:
- TEST: abc
handlers:
- name: restart apache
service: name=httpd state=restarted
说明:
hosts:test #表示test组的节点主机
gather_facts: no #跳过收集facts信息,默认是yes
vars: #定义变量,引用变量{{vars}}
vars_files: #使用文件定义变量,文件中也是用k/v形式定义变量
remote_user: root #远程使用root用户
sudo:yes #使用sudo
tasks: #指定一系列将要运行的任务
name: test1 #test1任务,copy模块
notify: #与下面handlers对应,上一步copy之后文件发生改变,则通过name匹配handlers中的任务,这里匹配restart appche的service任务
name: test2 #test2任务,yum模块
with_items: #定义列表变量,直接用{{item}}引用。该关键字也可以用来定义数组。
with_dict: #定义字典
3、正式运行Playbook之前,可以--check或-C来检测,输出的结果和实际执行一模一样,但不会有实际影响。
4、ansible-playbook
-i 指定inventory文件
-v 详细输出,-vvv更详细,-vvvv更更详细
-f 并发数
-e 定义Playbook中使用的变量,格式"key=value,key=value"
--remote-user #远程用户
--ask-pass #远程用户密码
--sudo #使用sudo
--sudo-user #sudo的用户,默认root
--ask-sudo-pass #sudo密码
扩展:
(1)handlers:见test1
(2)environment:为某个play设置单独的环境变量,例子见P94-95
(3)delegate_to:任务委派
例:- name: 123
shell: "echo $PATH>/test/1"
delegate_to: 192.168.2.30
把shell命令委派给192.168.2.30节点执行,其他hosts中指定的节点不执行。
(4)register:注册变量
将操作结果,包括stdout和stderr,保存到变量中,再根据变量的内容决定下一步,这个保存操作结果的变量就是注册变量。
例:- shell: ***
register: result
使用result.stdout和result.stderr读取执行结果的标准输出和标准错误。
(5)vars_prompt: 交互式提示
例:
---
- hosts: all
vars_prompt:
- name: share_user
prompt: "username?"
- name: share_pass
prompt: "password"
private: yes
常用选项:
private: yes #用户输入不可见
default #设置默认值
confirm: yes #要求输入两次
5、流程控制
(1)when条件判断 P109
例1:第一步执行的返回值中有'ready'时,再执行下一步操作。
- command: my-app --status
register: myapp_result
- command: do-something
when: "'ready' in myapp_result"
例2:stat模块查看文件信息,如果文件没创建,则执行command
- stat: path=/etc/sysctl.conf
register: stat_result
- command: touch /etc/sysctl.conf
when: stat_result.stat.exists == false
(2)changed_when和failed_when P110-111
(3)wait_for模块,任务暂停 P112
6、循环
原文:http://xdays.me/ansible状态管理.html
(1)标准遍历
用with_items可以遍历一个列表,注意这里只会遍历一层。示例如下:
- name: add several users
user: name={{ item }} state=present groups=wheel
with_items:
- testuser1
- testuser2
(2)嵌套遍历
用with_nested可以遍历一个列表,注意这里会遍历多层,直到最内层。示例如下:
- name: give users access to multiple databases
mysql_user: name={{ item[0] }} priv={{ item[1] }}.*:ALL append_privs=yes password=foo
with_nested:
- [ 'alice', 'bob', 'eve' ]
- [ 'clientdb', 'employeedb', 'providerdb' ]
(3)遍历字典
用with_dict可以遍历一个字典,用key和value来表示。示例如下:
#变量文件
---
users:
alice:
name: Alice Appleworth
telephone: 123-456-7890
bob:
name: Bob Bananarama
telephone: 987-654-3210
#playbook文件
tasks:
- name: Print phone records
debug: msg="User {{ item.key }} is {{ item.value.name }} ({{ item.value.telephone }})"
with_dict: users
(4)文件通配符循环
用with_fileglob可以获取本地文件列表。示例如下:
# copy each file over that matches the given pattern
- copy: src={{ item }} dest=/etc/fooapp/ owner=root mode=600
with_fileglob:
- /playbooks/files/fooapp/*
(5)对齐的列表
用with_together可以达到类似Python里的zip函数的功能。示例如下:
#变量文件:
---
alpha: [ 'a', 'b', 'c', 'd' ]
numbers: [ 1, 2, 3, 4 ]
#playbook文件
tasks:
- debug: msg="{{ item.0 }} and {{ item.1 }}"
with_together:
- alpha
- numbers
(6)循环一个task的输出
with_lines指令后跟一个命令,ansible会遍历命令的输出。示例如下:
- name: Example of looping over a command result
shell: /usr/bin/frobnicate {{ item }}
with_lines: /usr/bin/frobnications_per_host --param {{ inventory_hostname }}
7、Tags标签 #P113-114
标签功能可以给Roles、文件、单独的任务甚至整个Playbook打上标签,然后利用这些标签来指定要运行或不运行Playbook中的个别任务。
例:
vim test.yml
---
- hosts: test
tags: deploy #给整个Playbook打一个标签
tasks:
- name: test_tags
shell: ***
tags: #为任务打标签
- test1
- test2
- include: foo.yml
tags: foo
ansible-playbook test.yml --tags "test1" #只执行test_tags任务
ansible-playbook test.yml --skip-tags "test2" #跳过test_tags任务
写法格式:
tags: ['one','two']
tags:
- one
- two
8、Block块 P115-116
9、Include
《Ansible权威指南》笔记(4)——Playbook的更多相关文章
- 《Ansible权威指南》笔记(1)——安装,ssh密钥登陆,命令
2016-12-23 读这本<Ansible权威指南>学习ansible,根据本书内容和网上的各种文档,以及经过自己测试,写出以下笔记.另,这本书内容很好,但印刷错误比较多,作者说第二版会 ...
- 《Ansible权威指南》笔记(3)——Ad-Hoc命令集,常用模块
五.Ad-Hoc命令集1.Ad-Hoc命令集通过/usr/bin/ansible命令实现:ansible <host-pattern> [options] -v,--verbose ...
- Struts2权威指南笔记
Struts2权威指南笔记 1.mvc特点包括: ① 多个视图可以对应一个模型 ② 模型返回的数据与显示逻辑分离 ③ 应用层被分隔为三层,降低了各层之间的耦合,提供了应用的可扩展性 ④ 控制层的概念也 ...
- 《Ansible权威指南》笔记(2)——Inventory配置
四.Inventory配置ansible通过Inventory来定义主机和组,使用时通过-i指定读取,默认/etc/ansible/hosts.可以存在多个Inventory,支持动态生成.1.定义主 ...
- Ansible权威指南-读书笔记
2 Ansible基础元素介绍 2.1 ansible 目录结构介绍 2.2 ansible 配置文件解析 配置文件解析顺序:当前命令执行目录-->用户家目录下的.ansible.cfg--&g ...
- javascript权威指南笔记
最近每天工作之余看下js的细节部分,时间不是很多,所以看的进度也不会太快,写个博客监督自己每天都看下. 以前不知道的细节或者以前知道但是没注意过的地方都会记录下来,所以适合有一定基础的,不适合零基础新 ...
- HTTP权威指南笔记-1.概述
1.1 通讯 Web内容是存储在服务器上的,Web服务所使用的是HTTP协议,所以经常称为HTTP服务器.通讯过程为客户端(正常我们所使用的)发出请求,服务端根据客户端的HTTP请求响应相应数据,这就 ...
- css 权威指南笔记(一)
零零散散接触css将近5年,俨然已经成为一个熟练工.如果不是换份工作,我不知道自己差的那么远:在qunar的转正review中我这种“知其然而不知其所以然” 的状况被标明,我才意识到我已停步不前近两年 ...
- Android编程权威指南笔记3:Android Fragment讲解与Android Studio中的依赖关系,如何添加依赖关系
Android Fragment 当我在学习时,了解了Fragment词汇 Fragment是一种控制器对象,我就把所了解的简单说一下.activity可以派fragment完成一些任务,就是管理用户 ...
随机推荐
- 透视 HTML子元素的margin-top样式会应用在父元素上的原由
情况说明 当对页面中元素设置margin-top样式时,如果该元素有父元素,则margin-top会应用与父元素,子元素的top与父元素的top重叠.举例说明 <style>body{ma ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(33)-MVC 表单验证
系列目录 注:本节阅读需要有MVC 自定义验证的基础,否则比较吃力 一直以来表单的验证都是不可或缺的,微软的东西还是做得比较人性化的,从webform到MVC,都做到了双向验证 单单的用js实现的前端 ...
- IIS7禁用单个静态文件的缓存配置方法
IIS7中,想将一个经常修改的静态文件设置为不可缓存,在IIS配置界面里怎么也找不到... 一番google之后在stackoverflow里边发现了这样一段回答,最终解决了问题: just stum ...
- 浅析JavaScript事件流——冒泡
一.什么是事件冒泡流 我们知道事件流指的是从页面中接受事件的顺序. 为了形象理解事件冒泡,可以想象三军主将诸葛亮,在帐内运筹帷幄,眼观六路耳听八方,这时候前方的战事情况就需要靠传令兵来传达,当第一位传 ...
- 解决手机浏览器上input 输入框导致页面放大的问题(记录)
在微信手机页面开发当中,页面是没有问题的,但是当焦点在input输入框的时候,手机页面会自动放大. 加入以下代码在head 区,可解决此问题 <meta name="viewport& ...
- [摘录]第三部分 IBM文化(1)
第二十章 论公司文化如果是在20世纪90年代初期,当一个人看见或者听到“IBM”时,他会联想到什么呢?或许是“大计算机”.“个人电脑”或者“ThinkPads”.但是,他们同时也必然会想到“大公司”. ...
- 数据结构笔记--二叉查找树概述以及java代码实现
一些概念: 二叉查找树的重要性质:对于树中的每一个节点X,它的左子树任一节点的值均小于X,右子树上任意节点的值均大于X. 二叉查找树是java的TreeSet和TreeMap类实现的基础. 由于树的递 ...
- u-boot的配置、编译及链接
第一次写技术博客,还有些兴奋呢.我是CrazyCatJack,大家可以叫我CCJ或者疯猫.我即将成为一名嵌入式Linux的驱动工程师,现在还是一枚大四狗,呼呼~大学期间做了一些项目和比赛,都是基于32 ...
- 12.JAVA之GUI编程打开与保存文件
功能:java图形用户界面开发,练习打开保存文件 代码如下: import java.awt.FileDialog; import java.awt.Frame; import java.awt.Me ...
- 基于 HTML5 的 WebGL 技术构建 3D 场景(一)
今天和大家分享的是 3D 系列之 3D 预定义模型. HT for Web 提供了多种基础类型供用户建模使用,不同于传统的 3D 建模方式,HT 的建模核心都是基于 API 的接口方式,通过 HT 预 ...