一,YAML语法

  1. YAML的语法和其他高阶语言类似并且可以简单表达清单、散列表、标量等数据结构。(列表用横杆表示,键值对用冒号分割,键值对里又可以嵌套另外的键值对)
  2. YAML文件扩展名通常为.yaml或者.yml
  3. 一定要对齐,只能使用空格
name: tom
age: 21
gender: male
spourse:
name: lily
gender: female
children:
- name: susan
age: 2
gender: feamle
- name: sunny
age: 10
gender: male

二,ansible playbook 核心组件

  • tasks:任务
    • name
    • notify 调用handlers
    • 模块名称(shell,yum,script)
  • variables:变量
  • templates:模板
  • handlers:处理器
  • roles:角色
  • host :执行对象
  • remote_user:定义执行命令的远程用户

三,示例

示例一

#vim /root/first.yml

- hosts: all
remote_user: root
vars: httpd_port=80 tasks:
- name: install httpd
yum: name=httpd state=present
- name: install php
yum: name=php state=present
- name: start httpd
service: name=httpd state=started enabled=true
hosts 定义单个主机或组
remote_user 定义执行命令的远程用户
vars 定义变量,
tasks 定义执行哪些命令,
handlers 定义调用哪些处理器

vars(变量):

变量命名: 字母数字下划线组成,只能以字母开头

变量种类:

facts(内置变量)
由远程主机发回的主机属性信息,这些信息被保存在ansible变量当中
例如:ansible 192.168.238.170 -m setup 来获取远程主机上的属性信息,这些属性信息保存在facts中
 
通过命令行传递
通过命令行传递:ansible-playbook test.yml –extra-vars “host=www user=tom“(如果剧本中已有此处定义的变量则会被覆盖)
 
通过roles传递
主机变量
在/etc/ansible/hosts中定义
[web1]
192.168.1.1 name=haha
 
组变量
[group_name:vars]
foo=bar

示例二

#vim /root/second.yml
- hosts: web1
remote_user: root
vars:
username: bob
password: 123 tasks:
- name: add user
user: name={{ username }} state=present #
when: ansible_os_family == "Debian"
- name: set password
shell: echo {{ password }} |passwd --stdin {{ username }}
- name: install httpd php
yum: name={{ item }} state=present
with_items:
- httpd
- php
- name: add two users
user: name={{ item }} state=present groups={{ item.groups }}
with_items:
- { name: 'user1', groups: 'group1'}
- { name: 'user2', groups: 'group2'}
在playbook中调用变量的方式为{{ variable }}
when 语句用来条件测试
ansible_os_family 是facts中内置的属性信息 ansible_os_family的信息可以使用ansible all -m setup | grep ansible_os_family 查看
在task中调用内置的item变量;在某task后面使用with_items语句来定义元素列表
 

示例三

#vim /root/third.yml

- hosts: web1
remote_user: root
vars:
httpd_port=80 tasks:
- name: install httpd
yum: name=httpd state=present
- name: install php
yum: name=php state=present
- name: copy config file
copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify: restart httpd
- name: start httpd
service: name=httpd state=started enabled=true handlers:
- name: restart httpd
service: name=httpd state=restarted
copy中复制过去的文件跟远程主机上的文件不同,就通过notify调用handlers,即重启httpd服务
handler是重启服务是最通用的用法
 

示例四

#/root/httpd.conf
Listen {{ http_port }}
#vim /root/fourth.yml

- hosts: web1
remote_user: root
vars:
http_port: 80 tasks:
- name: install httpd
yum: name=httpd state=present
- name: copy config file
template: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf #变量 http_port 将在/etc/httpd/conf/httpd.conf中生效
notify: restart httpd
- name: start httpd
service: name=httpd state=started enabled=true handlers:
- name: restart httpd
service: name=httpd state=restarted
templates:用于生成文本文件(配置文件)
模板文件中可使用jinja2表达式,表达式要定义在{{ }},也可以简单地仅执行变量替换
 

示例五

roles:roles用于实现“代码复用
roles以特定的层次型格式组织起来的playbook元素(variables, tasks, templates,handlers),可被playbook以role的名字直接进行调用
 

roles的文件结构:

files/:此角色中用到的所有文件均放置于此目录中
templates/: Jinja2模板文件存放位置
tasks/:任务列表文件;可以有多个,但至少有一个叫做main.yml的文件
handlers/:处理器列表文件;可以有多个,但至少有一个叫做main.yml的文件
vars/:变量字典文件;可以有多个,但至少有一个叫做main.yml的文件
meta/:此角色的特殊设定及依赖关系
 
ansible服务器上执行
mkdir -p /opt/ansible/roles
cd /opt/ansible/roles
mkdir -p web/{files,templayes,tasks,handlers,vars,meta}
1,定义变量文件(web/vars/main.yml)
user: tom
group: tom
http_port: 8080
2,定义任务文件(web/tasks/main.yml)
- name: install httpd
yum: name=httpd state=present
- name: copy config file
template: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
notify: restart httpd
tags: conf
- name: start httpd
service: name=httpd state=started enabled=true
#这里的template指的是相对路径-->web1/templates
#tags可以在运行时指定标签任务
3,定义handlers文件(web/handlers/main.yml)
handlers:
- name: restart httpd
service: name=httpd state=restarted
4,定义配置文件(web/templates/httpd.conf)
……
Listen {{ http_port }}
……
5,定义一个调用roles文件(/opt/ansible/web_install.yml)
- hosts: web1
remote_user: root
roles:
- web1
#- { role:web2, http_port:8080 }
#hosts:web1 指在/etc/ansible/hosts中定义的组,上面有定义
#roles: web1 指的是当前目录下的web1目录,也可通过role传递变量, 也可调用多个role
#这样只需更改hosts的主机就可以实现不同主机的代码重用了

四,运行playbook

ansible-playbook web1.yml
指定运行任务:
ansible-playbook -t conf web1.yml

(三)ansible playbook的更多相关文章

  1. Ansible playbook API 开发 调用测试

    Ansible是Agentless的轻量级批量配置管理工具,由于出现的比较晚(13年)基于Ansible进行开发的相关文档较少,因此,这里通过一些小的实验,结合现有资料以及源码,探索一下Ansible ...

  2. ansible playbook实践(四)-如何调试写好的playbook文件

    有时,我们写了一个长长,功能很强悍的yaml文件,但是,我们有可能会担心,写的yaml文件是否正确,是否有漏洞危机,毕竟是要修改线上的机器,那么,有可能我们可以从以下几个检查维度来进行,确保在大规模应 ...

  3. ansible playbook批量改ssh配置文件,远程用户Permission denied

    最近手里的数百台服务器需要改/etc/ssh/sshd_config的参数,禁止root直接登陆,也就是说 [root@t0 ~]# cat /etc/ssh/sshd_config | grep R ...

  4. ansible笔记(11):初识ansible playbook(二)

    ansible笔记():初识ansible playbook(二) 有前文作为基础,如下示例是非常容易理解的: --- - hosts: test211 remote_user: root tasks ...

  5. ansible笔记(10):初识ansible playbook

    ansible笔记():初识ansible playbook 假设,我们想要在test70主机上安装nginx并启动,我们可以在ansible主机中执行如下3条命令 ansible test70 -m ...

  6. Ansible Playbook 详解

    一.playbook 的简单使用 1.创建文件实例 (1)编辑配置文件 [root@tiejiangSRC1 ~]# cd /etc/ansible/ [root@tiejiangSRC1 ansib ...

  7. Ansible playbook基础组件介绍

    本节内容: ansible playbook介绍 ansible playbook基础组件 playbook中使用变量 一.ansible playbook介绍 playbook是由一个或多个“pla ...

  8. ansible playbook基本操作

    一.ansible playbook简单使用 相当于是把模块写入到配置文件里面 vim /etc/ansible/test.yml //写入如下内容: --- - hosts: 127.0.0.1 r ...

  9. ansible入门四(Ansible playbook基础组件介绍)

    本节内容: ansible playbook介绍 ansible playbook基础组件 playbook中使用变量 一.ansible playbook介绍 playbook是由一个或多个“pla ...

随机推荐

  1. java实现第五届蓝桥杯年龄巧合

    年龄巧合 小明和他的表弟一起去看电影,有人问他们的年龄.小明说:今年是我们的幸运年啊.我出生年份的四位数字加起来刚好是我的年龄.表弟的也是如此.已知今年是2014年,并且,小明说的年龄指的是周岁. 请 ...

  2. PAT A除以B

    本题要求计算A/B,其中A 是不超过 1000 位的正整数,B 是 1 位正整数.你需要输出商数Q 和余数R,使得 A=B*Q+R 成立. 输入格式: 输入在一行中依次给出A 和B,中间以 1 空格分 ...

  3. Java基础(十一)

    一.连接到服务器 telnet是一种用于网络编程的非常强大的测试工具,你可以在命令shell中输入telnet来启动它. 二.实现服务器 服务器循环体: 1.通过输入数据流从客户端接收一个命令. 2. ...

  4. 体验SpringBoot(2.3)应用制作Docker镜像(官方方案)

    关于<SpringBoot-2.3容器化技术>系列 <SpringBoot-2.3容器化技术>系列,旨在和大家一起学习实践2.3版本带来的最新容器化技术,让咱们的Java应用更 ...

  5. 大话计算机网络一 聊聊UDP

    引言 UDP是一个简单的面向数据报的运输层协议 UDP不提供可靠性,它把应用程序传给IP层得数据发送出去,不保证它们能达到目的地 UDP首部 端口号表示发送进程和接受进程. UDP长度字段指的是UDP ...

  6. mysql字符串类型(set类型)

    集合 set  不定想项选 类似于 enum枚举,在定义时,也需要指定其已有值! 与字符串相比,优势是: 1, 也是采用 整数进行管理的!采用位运算,从第一位开始为1,逐一x2! 2, 每个集合类型8 ...

  7. jmeter对数据库进行简单的压测

    1.点击测试计划,再点击“浏览”,把JDBC驱动添加进来: 注:JDBC驱动一般的位置在java的安装地址下,路径类似于:    \java\jre\lib\ext 文件为:mysql-connect ...

  8. Flutter学习笔记(32)--PointerEvent事件处理

    如需转载,请注明出处:Flutter学习笔记(32)--PointerEvent事件处理 在Android原生的开发中,对于事件的处理,我们都知道事件分为down.move.up事件,对于ViewGr ...

  9. Mybatis框架介绍

    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis.201 ...

  10. Java 从入门到进阶之路(二十四)

    在之前的文章我们介绍了一下 Java 中的  集合框架中的Collection 的泛型,本章我们来看一下 Java 集合框架中的Collection 的子接口 List. Collection 接口有 ...