目录
一、playbook
1、简介
2、playbook组成部分:
3、如何编写Playbook?
4、语句的横向/纵向写法
二、playbook模版实例:
1、playbook模版:
2、playbook的条件判断:
3、playbook中的循环:
4、循环练习:
一、playbook
1、简介
Playbook 剧本是由一个或多个play组成的列表。
play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定义好的角色。
Task实际是调用ansible的一个module,将多个play组织在一个playbook中,即可以让它们联合起来,按事先编排的机制执行预定义的动作
Playbook 文件是采用YAML语言编写的。
2、playbook组成部分:
1、tasks任务:包含要在目标主机上执行的操作,使用模块定义这些操作。每个任务都是一个模块的调用。
2、variables变量:存储和传递数据,和shell脚本中的变量是一个意思,可以在playbook当中定义为全局变量,也可以在外部传参。
3、templates模版:主要用于生成配置文件。模版是包含占位符的文件。占位符由ansible在执行时转化为变量值
4、handlers处理器:当需要有变更的时候,可以执行触发器
5、roles角色:类似于docker-compose,是一种组织和封装playbook的。允许把相关的任务,变量和模版和处理器组织成一个可复用的单元
3、如何编写Playbook?
xxx.yaml/xxx.yml
--- #表示开始
- name: #指定play的名称
hosts: #指定主机清单中定义的主机组名
remote_user: #指定远程主机的执行用户
grather_facts: ture|fales #指定是否要收集远程主机的facts信息
vars: #自定义变量,只能在当前play有效
- 变量1: 值1 #格式为key: value
- 变量2: 值2
tasks: #定义任务列表,默认从上往下依次执行
- name: #定义任务的名称
模块名: 模块参数
ignore errors: true #忽略任务的失败
- name: #可以定义多个任务
模块名: 模块参数
notify: 任务名 #如以上操作后为changed的状态时,会通过notify指定的名称触发对应名称的handlers操作
##条件判断##
- name:
模块名: 模块参数
when: #定义条件表达式(== != > < >= <=),条件成立时执行此task任务,否则不执行任务
##循环##
- name:
模块名: 模块参数={{item}}
with_items: #定义循环列表
##tags模块,标签##
- name:
模块名: 模块参数
tags:
- 标签1
- 标签2
handlers:
- name: 任务名 #和notify中的任务名相同
模块名: 模块参数
#无注释版
---
- name:
hosts:
remote_user:
grather_facts: ture|fales
vars:
- 变量1: 值1
- 变量2: 值2
tasks:
- name:
模块名: 模块参数
ignore errors: true
- name:
模块名:
notify: 任务名
- name:
模块名:
when:
- name:
模块名: 模块参数={{item}}
with_items:
handlers:
- name: 任务名
模块名: 模块参数
4、语句的横向/纵向写法
task任务的模块语法格式
横向格式:
模块名: 参数1=值 参数2={{变量名}} ...
纵向格式:
模块名:
参数1: 值
参数2: "{{变量名}}"
...
with_items 和 vars 的语法格式
横向格式:
with_items: ["值1", "值2", "值3", ...]
值为对象(键值对字段)时:
with_items:
- {key1: "值1", key2: "值2"}
- {key1: "值3", key2: "值4"}
...
纵向格式:
with_items:
- 值1
- 值2
- 值3
...
值为对象(键值对字段)时:
with_items:
- key1: "值1"
key2: "值2"
- key1: "值3"
key2: "值4"
...
二、playbook模版实例:
1、playbook模版:
ansible-playbook test1.yml
执行脚本
ansible-playbook test1.yml --start-at-task='install httpd'
从指定任务模块开始执行
ansible-playbook test1.yml --syntax-check
检查yml文件的语法是否正确
ansible-playbook test1.yml --list-task
检查有多少tasks任务
ansible-playbook test1.yml --list-hosts
检查在哪台主机生效
若要切换用户,比如从koeda切换到root用户
71行要取消注释
hosts中:
改过用户,运行时的命令
ansible-playbook test1.yml -K(大K)
-K:输入密码
若脚本中没有指定用户,可以命令指定:
ansible-playbook test1.yml -u root -k(小k)
模版实例2:
#this is second
#声明和引用变量,以及外部传参
- hosts: 192.168.10.201
remote_user: root
vars:
groupname: guoqi
username: wangdefu
tasks:
- name: create group
group:
name: "{{ groupname }}"
system: yes
gid: 111
- name: create user
user:
name: "{{ username }}"
uid: 1011
group: "{{ groupname }}"
shell: /sbin/nologin
- name: copy file
copy:
content: "{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address']}}"
dest: /opt/ky32.txt
#获取目标的ip地址,然后复制到目标文件
vars:
groupname: koeda
username: koeda
字典方式:key-value
"{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address']}}"
包含所有主机变量的字典
inventory_hostname:目标主机的主机名
ansible_default_ipv4:获取目标主机的IP地址
也可以里面不指定变量参数,外部传参:
ansible-playbook test2.yaml -e 'username=koeda groupname=koeda'
2、playbook的条件判断:
when 是一个比较常见的应用场景,实现满足条件即执行,不满足条件即跳过的任务
when是满足条件即执行,不满足不执行
- hosts: all
remote_user: root
tasks:
- name: nginx when
yum: name=nginx
when: ansible_default_ipv4.address == '20.0.0.25'
- name: nginx info
debug:
msg: "安装nginx"
when: ansible_default_ipv4.address == '20.0.0.25'
- name: httpd when
yum: name=httpd
when: ansible_default_ipv4.address == '20.0.0.26'
- name: httpd info
debug:
msg: "安装httpd"
when: ansible_default_ipv4.address == '20.0.0.26'
3、playbook中的循环:
四种循环方式:
with_items 最常用的
with_list 列表分组循环
with_together 列表对应的列中,以数据结合的方式循环
with_nested 相当于双层循环,第一层定义了循环的次数,第二层表示第一层中的每个元素会循环几次
ansible有多中循环格式:
with_items 循环遍历
- hosts: 20.0.0.25
remote_user: root
gather_facts: false
tasks:
- debug:
msg: "{{ item }}"
with_items: [a,b,c,d]
- hosts: 20.0.0.25
remote_user: root
gather_facts: false
tasks:
- debug:
msg: "{{ item }}"
with_items:
- [a,b,c,d]
- [1,2,3,4]
with_list:列表输出
- hosts: 20.0.0.25
remote_user: root
gather_facts: false
tasks:
- debug:
msg: "{{item}}"
with_list:
- [a,b,c]
- [1,2,3]
练习:
- hosts: 20.0.0.25
remote_user: root
gather_facts: false
tasks:
- name: create
file:
path: "{{item}}"
state: touch
with_items:
- /opt/a
- /opt/b
- /opt/1
- /opt/2
with_together:组合输出
组循环,列表中的值,一一对应打印出来
- hosts: 20.0.0.25
remote_user: root
gather_facts: false
tasks:
- debug:
msg: "{{item}}"
with_together:
- [a,b,c]
- [1,2,3]
- [A,B]
循环嵌套:
- hosts: 20.0.0.25
remote_user: root
gather_facts: false
tasks:
- debug:
msg: "{{item}}"
with_nested:
- [a,b,c]
- [1,2,3]
4、循环练习:
创建用户test1、test2,用户组分别为dn1、dn2
- name: play1
hosts: 20.0.0.25
gather_facts: false
tasks:
- name: create group
group:
name: "{{ item }}"
state: present
with_items:
- 'dn1'
- 'dn2'
- name: create user
user:
name: "{{ item.name }}"
state: present
groups: "{{ item.groups }}"
with_items:
- {name: 'test1', groups: 'dn1'}
- {name: 'test2', groups: 'dn2'}
yum 一键安装多个软件 tree sl nginx httpd vsftpd dhcp
- name: play2
hosts: 20.0.0.25
gather_facts: false
tasks:
- name: create tree sl nginx httpd vsftpd dhcp
yum:
name: "{{ item }}"
with_list:
- tree
- sl
- nginx
- httpd
- vsftpd
- dhcp