目录
一、playbook简介
1.什么是playbook
Ansible Playbook 是设定自动化任务的一种蓝图,可在无需人工干预或有限干预的前提下执行复杂的 IT 操作。Ansible Playbook 对一组或一类共同构成 Ansible 清单的主机执行。
Ansible Playbook 本质上是一些框架,是一些预先编写的代码,开发人员可以用作临时模板或起始模板。Ansible Playbook 常被用于自动化 IT 基础架构(例如,操作系统和 Kubernetes 平台)、网络、安全系统,以及开发人员角色(例如 Git)。
Ansible Playbook 可以帮助 IT 人员进行应用、服务、服务器节点或其他设备的编程,无需花费人力去从头创建所有事物。Ansible Playbook 及其中的条件、变量和任务,都可以无限期保存、分享或重复使用。
2.playbook组成
(1)Tasks:任务,即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行
(2)Variables:变量
(3)Templates:模板
(4)Handlers:处理器,当changed状态条件满足时,(notify)触发执行的操作
(5)Roles:角色
二、应用实例
1.使用playbook安装启用httpd服务
首先编写xxx.yaml文件
--- #多个yaml文件以---开头,以表明这是一个yaml文件,可省略
- name: apache play #定义一个play的名称,可省略
gather_facts: false #设置不进行facts信息收集(即setup模块收集信息),这可以加快执行速度,如果不使用其中的信息可省略
hosts: webservers #指定要执行任务的被管理主机组,如多个主机组用冒号:分隔
remote_user: root #指定被管理主机上执行任务的用户
tasks: #定义任务列表,任务列表中的各任务按次序逐个在hosts中指定的主机上执行
- name: disable selinux #自定义任务名称
command: '/usr/sbin/setenforce 0' 键值对,键是ansible模块,值是 -a 中的内容
ignore_errors: true #如执行命令的返回值不为0,就会报错,tasks停止,可使用ignore_errors忽略失败的任务
- name: disable firewalld
service: name=firewalld state=stopped enabled=no
- name: prepare local repo
copy: src=/etc/yum.repos.d/local.repo dest=/etc/yum.repos.d/local.repo
- name: mount cdrom
mount: src=/dev/sr0 path=/mnt fstype=iso9660 state=mounted
- name: install apache
yum: name=httpd state=latest
- name: prepare httpd configuration file
copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf mode=644 owner=apache group=apache
notify: "restart httpd" #如以上操作后为changed的状态时,会通过notify指定的名称触发对应名称的handlers操作
- name: start httpd
service: name=httpd state=started enabled=yes
handlers: #handlers中定义的就是任务,此处handlers中的任务使用的是service模块
- name: restart httpd #notify和handlers中任务的名称必须一致
service: name=httpd state=restarted
运行playbook
ansible-playbook xxx.yaml
补充参数:
-k(–ask-pass):用来交互输入ssh密码
-K(-ask-become-pass):用来交互输入sudo密码
-u:指定用户
Ansible在执行完某个任务之后并不会立即去执行对应的handler,而是在当前play中所有普通任务都执行完后再去执行handler,这样的好处是可以多次触发notify,但最后只执行一次对应的handler,从而避免多次重启。
2.使用playbook安装启用nginx服务
首先编写xxx.yaml文件
---
- name: nginx play
gather_facts: false
hosts: webservers
remote_user: root
tasks:
- name: test connection
ping:
- name: disable selinux
command: '/usr/sbin/setenforce 0'
ignore_errors: true
- name: disable firewalld
service: name=firewalld state=stopped enabled=no
- name: prepare nginx repo
copy: src=/etc/yum.repos.d/nginx.repo dest=/etc/yum.repos.d/nginx.repo
- name: add dns
copy: content="nameserver 8.8.8.8" dest=/etc/resolv.conf
- name: install nginx
yum: name=nginx state=latest
- name: prepare nginx configuration file
copy: src=/opt/nginx.conf dest=/etc/nginx/nginx.conf mode=644 owner=nginx group=nginx
- name: prepare nginx configuration.d file
copy: src=/opt/default.conf dest=/etc/nginx/conf.d/default.conf mode=644 owner=nginx group=nginx
notify: "restart nginx"
- name: start nginx
service: name=nginx state=started enabled=yes
handlers:
- name: restart nginx
service: name=nginx state=restarted
运行playbook
三、ansible-playbook其他用法
1.检查yaml文件的语法是否正确
ansible-playbook xxx.yaml --syntax-check
如果语法格式有问题会报错
2.检查tasks任务
ansible-playbook xxx.yaml --list-task
如果任务列表中的语法格式有问题会报错
3.检查指定的主机
ansible-playbook test1.yaml --list-hosts
4.指定从某个task开始运行
ansible-playbook xxx.yaml --start-at-task='任务名'
四、playbook进阶语法
1.引用变量
(1)自定义变量
编写文件
运行playbook
查看结果
(2)引用setup模块信息中的变量
编写文件
运行playbook
查看结果
2.遍历值
Ansible提供了很多种循环结构,一般都命名为with_items,作用等同于 loop 循环。
with_items:将每个列表中所有值遍历输出。
with_list:将每个列表作为一个整体输出。
with_together:将每个列表中对应的值混合输出,如果个数不一致,将无法混合输出的值用null值填补组合的空缺。
with_nested:将每个列表中的每个值组合输出,类似多重循环。
(1)遍历变量中的值
(2)遍历指定的多个值
指定方式,也可以是列表的格式
(3)遍历参数列表
格式也可以是 - {username: zhangsan, filename: 1.txt}
3.条件判断
在Ansible中,提供的唯一一个通用的条件判断是when指令,当when指令的值为true时,则该任务执行,否则不执行该任务。
when一个比较常见的应用场景是实现跳过某个主机不执行任务或者只有满足条件的主机执行任务。
when: ansible_default_ipv4.address 条件表达式 "ip地址"
when: inventory_hostname 条件表达式 "主机名"
4.指定远程主机sudo切换用户
当ssh不允许root用户登录时,打开普通用户sudo提权
5.tags 模块
可以在一个playbook中为某个或某些任务定义“标签”,在执行此playbook时通过ansible-playbook命令使用--tags选项能实现仅运行指定的tasks。
playbook还提供了一个特殊的tags为always。作用就是当使用always作为tags的task时,无论执行哪一个tags时,定义有always的tags都会执行。
五、Template模板
Jinja是基于Python的模板引擎。Template类是Jinja的一个重要组件,可以看作是一个编译过的模板文件,用来产生目标文本,传递Python的变量给模板去替换模板中的标记。
以nginx为例,在服务配置文件添加变量,然后改名为后缀为.j2的模板文件
之后在ansible主机清单文件hosts中对主机指定变量值,这样就能实现执行文件实现不同的配置
编写playbook
执行playbook
验证结果,发现两台nginx分别监听81和82,各自网页根目录也被创建了
六、Roles 模块
Ansible为了层次化、结构化地组织Playbook,使用了角色(roles),roles可以根据层次型结构自动装载变量文件、task以及handlers等。简单来讲,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们。roles一般用于基于主机构建服务的场景中,但也可以用于构建守护进程等场景中。
1.在/etc/ansible/roles下创建角色(服务名),以LNMP为例,有三个角色
2.在每个角色的目录下创建模块目录
roles 内各目录含义解释
● files:用来存放由 copy 模块或 script 模块调用的文件。
● templates:用来存放 jinjia2 模板,template 模块会自动在此目录中寻找 jinjia2 模板文件。
● tasks:此目录应当包含一个 main.yml 文件,用于定义此角色的任务列表,此文件可以使用 include 包含其它的位于此目录的 task 文件。
● handlers:此目录应当包含一个 main.yml 文件,用于定义此角色中触发条件时执行的动作。
● vars:此目录应当包含一个 main.yml 文件,用于定义此角色用到的变量。
● defaults:此目录应当包含一个 main.yml 文件,用于为当前角色设定默认变量。
● meta:此目录应当包含一个 main.yml 文件,用于定义此角色的特殊设定及其依赖关系。
3.在每个角色的 handlers、tasks、meta、defaults、vars 目录下创建 main.yml 文件(文件名固定,内容可以为空)
4.编辑yml文件去引用这些roles执行剧本