ansible的脚本——playbook剧本

一、playbook概念

playbook是剧本的意思

通过 task 调用 ansible 的模块将多个 play 组织在一 个playbook中运行。

1.1 playbooks 本身由以下各部分组成

(1)Tasks:任务,即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行

(2)Variables:变量

(3)Templates:模板

(4)Handlers:处理器,当changed状态条件满足时,(notify)触发执行的操作

(5)Roles:角色

1.2 编写playbook的语言yaml语法规则

playbook yaml语法是换行空两格,-和:后必须空一格

YAML:是一种非标记语言。是用来写配置文件的语言,非常简洁合强大;

YAML语法和其他语言类似,也可以表达散列表、标量等数据结构

结构通过空格来展示,序列里配置项通过 - 来表示;Map里的键值用:来分隔;YAML的扩展名为yaml

① 大小写敏感

② 使用缩进表示层级关系

③ 缩进时不允许使用tab键、只允许使用空格

④ 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

|--------------------|----------------------|
| hosts | 定义节点,可以是组 |
| remote_user | 是你以什么用户身份进行登陆 |
| tasks | 是你的任务 |
| become:yes | 表示切换用户 |
| become_user: mysql | 表示切换到mysql用户,配合上一条使用 |
| - name: | 为下面执行的操作起名 |

1.3 yaml支持的数据结构

**对象:**键值对的集合,又称为映射(mapping)/ 哈希(hashes)/ 字典(dictionary)

**数组:**一组按次序排列的值,又称为序列(sequence)/ 列表(list)

**纯量:**单个的、不可再分的值

二、inventory 主机清单

//Inventory支持对主机进行分组,每个组内可以定义多个主机,每个主机都可以定义在任何一个或多个主机组内。

//inventory 中的变量

Inventory变量名 含义

ansible_host ansible连接节点时的IP地址

ansible_port 连接对方的端口号,ssh连接时默认为22

ansible_user 连接对方主机时使用的主机名。不指定时,将使用执行ansible或ansible-playbook命令的用户

ansible_password 连接时的用户的ssh密码,仅在未使用密钥对验证的情况下有效

ansible_ssh_private_key_file 指定密钥认证ssh连接时的私钥文件

ansible_ssh_common_args 提供给ssh、sftp、scp命令的额外参数

ansible_become 允许进行权限提升

ansible_become_method 指定提升权限的方式,例如可使用sudo/su/runas等方式

ansible_become_user 提升为哪个用户的权限,默认提升为root

ansible_become_password 提升为指定用户权限时的密码
//如果是名称类似的主机,可以使用列表的方式标识各个主机。

vim /etc/ansible/hosts

[webservers]

192.168.10.14:2222 #冒号后定义远程连接端口,默认是 ssh 的 22 端口

192.168.10.1[2:5]

[dbservers]

db-[a:f].example.org #支持匹配 a~f

(1)主机变量

[webservers]

192.168.10.14 ansible_port=22 ansible_user=root ansible_password=abc1234

(2)组变量

[webservers:vars] #表示为 webservers 组内所有主机定义变量

ansible_user=root

ansible_password=abc1234

[all:vars] #表示为所有组内的所有主机定义变量

ansible_port=22

(3)组嵌套

[nginx]

192.168.10.20

192.168.10.21

192.168.10.22

[apache]

192.168.10.3[0:3]

[webs:children] #表示为 webs 主机组中包含了 nginx 组和 apache 组内的所有主机

nginx

apache

三、playbook示例

基本命令介绍

ansible-playbook xxx.yaml --syntax-check #检查yaml文件的语法是否正确

ansible-playbook xxx.yaml --list-task #检查tasks任务

ansible-playbook xxx.yaml --list-hosts #检查生效的主机

ansible-playbook xxx.yaml --start-at-task='xxx' #指定从某个task开始运行

  • hosts: webserver #指定主机组,可以是一个或多个组

remote_user: root #指定远程主机执行的用户名

|----------------------|--------------|
| 参数 | 说明 |
| -k(-ask-pass) | 用来交互输入ssh密码 |
| -K(-ask-become-pass) | 用来交互输入sudo密码 |
| -u | 指定用户 |
| -e | 引入变量值 |

3.1 用playbookyaml安装http

//示例:

vim test1.yaml

--- #yaml文件以---开头,以表明这是一个yaml文件,可省略

  • name: first play #定义一个play的名称,可省略

gather_facts: false #设置不进行facts信息收集,这可以加快执行速度,可省略

hosts: webservers #指定要执行任务的被管理主机组,如多个主机组用冒号分隔

remote_user: root #指定被管理主机上执行任务的用户

tasks: #定义任务列表,任务列表中的各任务按次序逐个在hosts中指定的主机上执行

  • name: test connection #自定义任务名称

ping: #使用 module: [options] 格式来定义一个任务

  • name: disable selinux

command: '/sbin/setenforce 0' #command模块和shell模块无需使用key=value格式

ignore_errors: True #如执行命令的返回值不为0,就会报错,tasks停止,可使用ignore_errors忽略失败的任务

  • name: disable firewalld

service: name=firewalld state=stopped #使用 module: options 格式来定义任务,option使用key=val ue格式

  • name: install httpd

yum: name=httpd state=latest

  • name: install configuration file for httpd

copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf #这里需要一个事先准备好的/opt/httpd.conf文件

notify: "restart httpd" #如以上操作后为changed的状态时,会通过notify指定的名称触发对应名称的handlers操作

  • name: start httpd service

service: enabled=true name=httpd state=started

handlers: #handlers中定义的就是任务,此处handlers中的任务使用的是service模块

  • name: restart httpd #notify和handlers中任务的名称必须一致

service: name=httpd state=restarted

##Ansible在执行完某个任务之后并不会立即去执行对应的handler,而是在当前play中所有普通任务都执行完后再去执行handler,这样的好处是可以多次触发notify,但最后只执行一次对应的handler,从而避免多次重启。

//运行playbook

ansible-playbook test1.yaml

//补充参数:

-k(--ask-pass):用来交互输入ssh密码

-K(-ask-become-pass):用来交互输入sudo密码

-u:指定用户

ansible-playbook test1.yaml --syntax-check #检查yaml文件的语法是否正确

ansible-playbook test1.yaml --list-task #检查tasks任务

ansible-playbook test1.yaml --list-hosts #检查生效的主机

ansible-playbook test1.yaml --start-at-task='install httpd' #指定从某个task开始运行

3.2 定义、引用变量

//定义、引用变量

  • name: second play

hosts: dbservers

remote_user: root

vars: #定义变量

  • groupname: mysql #格式为 key: value

  • username: nginx

tasks:

  • name: create group

group: name={{groupname}} system=yes gid=306 #使用 {{key}} 引用变量的值

  • name: create user

user: name={{username}} uid=306 group={{groupname}}

  • name: copy file

copy: content="{{ansible_default_ipv4}}" dest=/opt/vars.txt #在setup模块中可以获取facts变量信息

ansible-playbook test1.yaml -e "username=nginx" #在命令行里定义变量

3.3 when条件判断

在Ansible中,提供的唯一一个通用的条件判断是when指令,当when指令的值为true时,则该任务执行,否则不执行该任务。

//when一个比较常见的应用场景是实现跳过某个主机不执行任务或者只有满足条件的主机执行任务

vim test2.yaml


  • hosts: all

remote_user: root

tasks:

  • name: shutdown host

command: /sbin/shutdown -r now

when: ansible_default_ipv4.address == "192.168.10.14" #when指令中的变量名不需要手动加上 {{}}

when: inventory_hostname == "<主机名>"

ansible-playbook test2.yaml

3.4 //迭代Ansible提供了很多种循环结构,一般都命名为with_items,作用等同于 loop 循环。多个创建文件用户

便利方式,使用在创建多个文件夹或文件,通常指持续地对ansible playbook 进行修改、更改和改进的过程

vim test3.yaml


  • name: play1

hosts: dbservers

gather_facts: false

tasks:

  • name: create directories

file:

path: "{{item}}"

state: directory

#路径调用变量item,变量值为下面的with_items的内容,一次执行一个有几个值执行几次,state为创建类型为目录

with_items: #等同于 loop:

  • /tmp/test1

  • /tmp/test2

  • name: add users

user: name={{item.name}} state=present groups={{item.groups}}

with_items:

  • name: test1

groups: wheel

  • name: test2

groups: root

with_items:

  • {name:'test1', groups:'wheel'}

  • {name:'test2', groups:'root'}

ansible-playbook test3.yaml

3.5 playbook中的templates模块

Jinja是基于Python的模板引擎。Template类是Jinja的一个重要组件,可以看作是一个编译过的模板文件,用来产生目标文本,传递Python的变量给模板去替换模板中的标记。

3.5.1安装http

先准备一个以 .j2 为后缀的 template 模板文件,设置引用的变量

1.先准备一个以 .j2 为后缀的 template 模板文件,设置引用的变量

cp /etc/httpd/conf/httpd.conf /opt/httpd.conf.j2

vim /opt/httpd.conf.j2

Listen {{http_port}} #42行,修改

ServerName {{server_name}} #95行,修改

DocumentRoot "{{root_dir}}" #119行,修改

2.修改主机清单文件,使用主机变量定义一个变量名相同,而值不同的变量

vim /etc/ansible/hosts

[webservers]

192.168.10.14 http_port=192.168.10.14:80 server_name=www.accp.com:80 root_dir=/etc/httpd/htdocs

[dbservers]

192.168.10.15 http_port=192.168.0.15:80 server_name=www.benet.com:80 root_dir=/etc/httpd/htdocs

3.编写 playbook

vim apache.yaml


  • hosts: all

remote_user: root

vars:

  • package: httpd

  • service: httpd

tasks:

  • name: install httpd package

yum: name={{package}} state=latest

  • name: install configure file

template: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf #使用template模板

notify:

  • restart httpd

  • name: create root dir

file: path=/etc/httpd/htdocs state=directory

  • name: start httpd server

service: name={{service}} enabled=true state=started

handlers:

  • name: restart httpd

service: name={{service}} state=restarted

ansible-playbook apache.yaml

3.6 tags 模块

可以在一个playbook中为某个或某些任务定义"标签",在执行此playbook时通过ansible-playbook命令使用--tags选项能实现仅运行指定的tasks。

playbook还提供了一个特殊的tags为always。作用就是当使用always当tags的task时,无论执行哪一个tags时,定义有always的tags都会执行。

案例二:- always #表示始终要运行的代码

案例三、顺序是从上至下运行

3.7 roles模块

Ansible为了层次化、结构化地组织Playbook,使用了角色(roles),roles可以根据层次型结构自动装载变量文件、task以及handlers等。简单来讲,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们。roles一般用于基于主机构建服务的场景中,但也可以用于构建守护进程等场景中。

相关推荐
紫晓宁3 天前
jmeter结合ansible分布式压测--3压测执行
分布式·jmeter·ansible
紫晓宁4 天前
jmeter结合ansible分布式压测--1数据准备
分布式·jmeter·ansible
紫晓宁5 天前
jmeter结合ansible分布式压测--2jmter环境准备
分布式·jmeter·ansible
SG.xf8 天前
ansible中的任务执行控制
ansible
赶紧回家去10 天前
Ansible基本使用
运维·ansible
我就是全世界11 天前
ansible详细介绍和具体步骤
ansible
福大大架构师每日一题11 天前
27.9 调用go-ansible执行playbook拷贝json文件重载采集器
golang·json·ansible·prometheus
SG.xf11 天前
Ansible
运维·ansible
避凉闲庭11 天前
ansible开局配置-openEuler
linux·运维·ansible·脚本·openeuler·免密登录·批量化
运维小白。。14 天前
Ansible 批量部署
ansible