ansible playbook
一、 yaml语法简介
在单一档案中,可用连续三个连字符号(---)区分多个档案
次行开始正常写playbook的内容,一般建议写明该playbook的功能
使用#注释
缩进必须是统一的,不能空格和tab混用
缩进的级别必须是一致的,同样的缩进达标同样的级别,
yaml我呢见区分大小写
多个k/v可同行写也可换行写,同行使用逗号分隔
v可以是字符串,也可以是另一个列表
一个完成的代码块功能需最少元素包括name和task
一个name只能包括一个task
yaml文件扩展名通常为yml或yaml
List: 列表,其所有严肃均使用”-“ 大头
Dictionary: 字典,通常由多个key与value构成,也可以放置于{}中
二、Playbook核心元素
hosts 执行的远程主机列表
tasks 人物集
varniables 内置变量或自定义变量在playbook中调用
template 模板,可替换模板文件中变量并实现一些简单逻辑文件
handlers和notity结合使用,由特定条件触发的操作,满足条件方才执行
tags 标签,指定某条任务执行,用于选择运行行ploybook中的部分代码
三、playbook基础组件
remote_user: 可用于host和task中。也可以指定通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户
- hosts: webserver
remote_user: rooot
tasks:
- name: test connection
ping
sudo: yes
sudo_user:wang
运行playboook
ansible-playbook filename.yaml [options]
常见选项
--check -C 只检测可能会发生的改变,但不真正执行操作
--list-hosts 列出运行任务的主机
--list-tags 列出tag
--list-tasks 列出task
--limit 主机列表 只正对主机列表中的主机执行
-v -vv -vvv 显示过程
编写安装httpd的playbook例子
---
- hosts: server
remote_user: root
tasks:
- name: install
yum: name=httpd
- name: config
copy: src=/data/playbook/httpd.conf dest=/etc/httpd/conf/
- name: service
service: name=httpd state=started enabled=yes
二进制安装mariadb
---
- hosts: appserver
remote_user: root
tasks:
- name: user
user: name=mysql system=yes home=/data/mysql create_home=no shell=/sbin/nologin
- name: unarchive
unarchive src=压缩包 dest=/usr/local owner=mysql group=root
- name: mysql link
file: src=解压后文件夹 dest=路径 state=link
- name: create director
file: /data/mysql state=director
- name owner group
file: path=/data/mysql owner=mysql group=mysql
- name: mysql database
shell: chdir=路径/scripts scripts/mysql_install_db --datadir=/data/mysql --user=mysql
- name: path
file: content='PATH=/usr/local/mysql/bin:$PATH' dest=/etc/profile.d/mysql.sh
- name: config
copy: 拷贝文件
- name: service
- name: start service
(自己补充去...)
handlers和notify 结合使用触发条件
handlers
是task列表,这些task与前述的task并没有本质上的不同,用于当关注的资源发生变化时,才会采取一定的操作
notify此action可用于在每个play的最后被触发,避免多次有改变发生时每次都执行指定的操作,在notify中列出的操作都成为handler
---
- hosts: server
remote_user: root
tasks:
- name: install
yum: name=httpd
- name: config
copy: src=/data/playbook/httpd.conf dest=/etc/httpd/conf/
notify: restart httpd
- name: service
service: name=httpd state=started enabled=yes
handler:
- name: restart httpd
service: name=httpd state=restarted
playbook中tags的使用
给某一个动作加一个标签,后面可以挑着执行
- hosts: server
remote_user: root
tasks:
- name: install
yum: name=httpd
- name: config
copy: src=/data/playbook/httpd.conf dest=/etc/httpd/conf/
tags: copy
notify: restart httpd
- name: service
service: name=httpd state=started enabled=yes
执行: ansible-playbook -t copy httpd.yaml
playbook中变量使用
调用变量: 两个花括号
变量名: 仅能由字母、数字和下划线组成,且只能以字母开头
变量来源:
1. ansible setup facts 远程主机的所有变量都可以直接调用
setup模块: 显示主机上的各种信息
ansible all -m setup -a 'filter=ansible_fqdn'
2. 在/etc/ansible/hosts中定义
普通变量:主机组中主机单独定义,优先级高于公共变量
公共组变量:针对主机组中所有主机定义统一变量
[webserver]
ip
[webserver:vars]
ntp_server=ntp.cn.com
ngs_server=nfs.cn.com
3. 通过命令行指定变量,优先级最高
ansible-playbook -e varname=value
4. 在playbook中定义
vars
- var1: value1
- var2: value2
5. 在独立的变量yaml文件中定义
hostname: testnode
suf: log
调用:在文件里面写上文件 vars_fies: vars.yml
6.在role中定义
模板template
文本文件,嵌套有脚本(使用模板变成语言编写)
Jinjia2语言, 使用字面量,有下面形式
字符串:使用单引号或双引号
数字: 整数,浮点数
列表:[item1, item2,...]
元组: (item1, item2,...)
字典: {key1: value1, key2: value2}
布尔型: true/false
算术运算:+, -, *, /, //, %, **
比较运算:==, !=, >, >=, <, <=
逻辑运算: and, or, not
流表达式: for, if, when
template功能: 根据模块文件动态生成对应的配置文件
template文件必须存放于templates目录下,且命名为.j2结尾
yaml/yml文件需和templates目录平级,结果如下
./
temnginx.yml
templates
nginx.conf.j2
应用在yml的tasks下
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
ps: 主要按照格式来写,src直接写文件名即可
when 类似if
条件测试:如果需要根据变量、facts或此前任务的执行结果来作为或task执行与否的前提时要用到条件测试,通过when语句实现,在task中使用,jinjia2语法格式
when语句
在task后添加when子句即可使用条件测试;when语句支持jinjia2
迭代: with_items
迭代:当有需要重复性执行的让你无时,可以使用迭代机制
对迭代项的引用,固定变量名为 item
要在task中使用with_items给要迭代的元素列表
列表格式:
字符串
字典
示例
- name: add serveral users
user: name={{item}} state=present group=wheel
with_items:
- testuser1
- testuser2
playbook中template for if
roles
ansible 1.2版本引入的新特性,用于层次化,结构化的组织playbook,roles能够根据层次型结构自动装载变量文件、task及handlers等,要使用roles只需要在playbook中使用include指令即可。roles就是将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷的include他们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中
复杂场景: 建议使用roles, 代码服务度高
变更指定主机或主机组
如命名不规范维护和传承成本大
某些功能需要多个playbook, 通过include即可
角色: 角色集合
usercof.yml
roles/
mysql/
tasks
main.yml
create_dir.yml
static_dir.yml
files
main.yml
vars
main.yml
httpd/
roles各目录作用
以nginx为例
mkdir roles/nginx/{tasks,files} -pv
cd roles/nginx/
vim tasks/user.yml
- name: create user
user: name=nginx shell=/sbin/nologin system=yes create_home=no
vim install.yml
- name: install
yum: name=nginx
cp /usr/local/nginx/conf/nginx.conf.default /data/ploybook/roles/nginx/files/
vim sysconfig.yml
- name: config
copy: src=nginx.conf dest=/etc/nginx/
vim service.yml
- name: service
service: name=nginx state=started enabled=yes
vim main.yml
- include: user.yml
- include: install.yml
- include: config.yml
- include: service.yml
vim nginx_role.yml
- hosts: appservers
roles:
- role: nginx
引用
ansible-playbook nginx_role.yml
目录结构