- 首页
- 正文
ansible的playbook模式
ansible 有两种模式,一种是 ad-hoc 模式,一种是 playbook 模式,playbook 就是通过组合多条ad-hoc操作的配置文件,而 playbook 的配置文件格式是 yaml,yaml 是一个类似于 json 或者 xml 的文件格式,但要比这些格式更加方便,用于指定分层配置数据
其实学习 ansible-playbook 最主要理解一些配置文件的常用指令,条件判断、循环、jinja2 的用法,还有一些常用模块的用法,role 角色的应用,今天最主要讲 playbook 模式的一些配置和用法:
ansible-playbook 的格式:
ansible-playbook yaml文件 [option]
ansible-playbook 的组成:
- host,应用 playbook 的主机范围
- play,一组task的集合
- task,由模块来完成的一项任务
- notify, 在 playbook 的每一个 task 结束时被触发
- handler,task可以触发一定的事件,通过名字来引用
- role,一组由playbook以及和其配合的元素(vars, files等)的集合
- include,在一个 yaml 配置文件中包含其它的 yaml 配置文件
yaml配置文件
注意几点
- 要以
---
开头(可选的) -
表示列表yaml
是区分大小的- 可以使用
tab
或者空格
,建议使用空格
常用的几个指令
hosts: 定义主机的范围
vars:定义变量
vars_files:定义变量文件
tasks:定义任务
name:定义playbook或者task的名称
notify:如果任务发生了改变,就会触发 handlers的任务
handlers:定义被触发的任务列表
include:包含各种 yaml 配置文件
yaml 变量的使用,有下面几种情况:
在
yaml
文件中 使用vars
定义使用
ansible-playbook
的参数--extra-vars
在
资源清单文件
中定义在
yaml
文件中 使用register
,这个可以把指定命令输出的结果保存到一个自定义的变量中
yaml 文件的循环语句有下面几种常用的:
with_items
安装 vim 和 emacs
---
- hosts: server1
tasks:
- name: install vim and emacs packages
yum: name={{ item }} state=present
with_items:
- vim
- emacs
添加用户 user1 和 用户 user2
---
- hosts: server1
tasks:
- name: add user1 and user2
user: name={{ item.name }} group={{ item.group }}
with_items:
- { name: 'user1', group: 'root' }
- { name: 'user2', group: 'root' }
或者
--
- hosts: server1
tasks:
- name: add user1 and user2
user: name={{ item.name }} group={{ item.group }}
with_items:
- name: 'user1'
group: 'root'
- name: 'user2'
group: 'root'
with_dict
添加用户 user1 和 user2
---
- hosts: server1
tasks:
- name: add user1 and user2
user: name={{ item.key }} state=present group={{ item.value }}
with_dict:
{ 'user1': 'root', 'user2': 'root' }
with_file
显示当前目录下 a.txt 的内容
---
- hosts: server1
tasks:
- name: show a.txt content
debug: msg={{ item }}
with_file: a.txt
with_fileglob
把当前的 test 目录下的所有文件复制到 远程的/tmp 目录中
---
- hosts: server1
tasks:
- name: copy file to tmp
copy: src={{ item }} dest=/tmp/ owner=root mode=644
with_fileglob:
- test/*
with_sequence
添加4个用户
---
- hosts: server1
tasks:
- name: add four users
user: name=user{{ item }} group=root
with_sequence: start=1 end=4
条件语句
显示偶数
---
- hosts: server1
tasks:
- name: debug number
debug: msg={{ item }}
with_items: [0, 2, 4, 5, 6, 8, 10]
when: item % 2 == 0
roles
一个项目的结构如下:
site.yml
webservers.yml
fooservers.yml
roles/
common/
files/
templates/
tasks/
handlers/
vars/
defaults/
meta/
webservers/
files/
templates/
tasks/
handlers/
vars/
defaults/
meta/
一个 playbook 如下:
---
- hosts: webservers
roles:
- common
- webservers
这个 playbook 为一个角色 ‘x’ 指定了如下的行为:
- 如果 roles/x/tasks/main.yml 存在, 其中列出的 tasks 将被添加到 play 中
- 如果 roles/x/handlers/main.yml 存在, 其中列出的 handlers 将被添加到 play 中
- 如果 roles/x/vars/main.yml 存在, 其中列出的 variables 将被添加到 play 中
- 如果 roles/x/meta/main.yml 存在, 其中列出的 “角色依赖” 将被添加到 roles 列表中 (1.3 and later)
- 所有 copy tasks 可以引用 roles/x/files/ 中的文件,不需要指明文件的路径。
- 所有 script tasks 可以引用 roles/x/files/ 中的脚本,不需要指明文件的路径。
- 所有 template tasks 可以引用 roles/x/templates/ 中的文件,不需要指明文件的路径。
- 所有 include tasks 可以引用 roles/x/tasks/ 中的文件,不需要指明文件的路径。
ansible-playbook的 option 选项有:
说明:
其实 ansible-playbook 的 option 选项有些跟 ansible 的 opition 选项是一样的
指定资源清单,默认 /etc/ansible/hosts
,使用 -i
参数
ansible-playbook yaml文件 -i 资源清单路径
并发线程数,默认5个线程,使用 -f
参数
ansible-playbook yaml文件 -f 进程数
输出详细的执行过程信息,使用 -v
参数,而 -vvv
可得到所有执行过程信息
ansible-playbook yaml文件 -v
指定远程主机以哪个用户运行命令,使用 -u
参数
ansible-playbook yaml 文件 -u 远程用户名
Linux系统下的 sudo
命令,使用 -s
参数
ansible-playbook yaml文件 -s
用户的密码(与 -s 一起使用),使用 -K
参数
ansible-playbook yaml文件 -K
指定密钥文件,使用 --private-key
ansible-playbook yaml文件 --private-key=密钥文件
列出符合条件的主机列表,不执行任何其他命令,使用 --list-hosts
ansible-playbook yaml文件 --list-hosts
列出 playbook 中会被执行的 task,使用 --list-tasks
ansible-playbook yaml文件 --list-tasks
设置额外的变量,使用 -e 参数
或者 --extra-vars参数
ansible-playbook yaml文件 -e "key1=value1" -e "key2=value2"
或者
ansible-playbook yaml文件 --extra-vars "key1=value1 key2=value2"
检测 playbook 文件语法是否有问题,不会执行 playbook,使用 --syntax-check
ansible-playbook yaml文件 --syntax-check
执行指定的 tag 标签任务,使用 -t
,如果要执行除了特定的标签的所有标签,使用 --skip-tags
ansible-playbook yaml文件 -t 标签名
举例
用 include 的方式实现在远程创建文件和创始用户
touchfile.yml 配置文件的内容
---
- name: touch file
shell: touch /tmp/file1
createuser.yml 配置文件的内容
---
- name: create user
user: name=user1 group=root
include.yml 配置文件的内容
---
- hosts: server1
tasks:
- include: touchfile.yml
- include: createuser.yml