如果你还没有配置基础的ansible和一些基础用法可以去下面的链接
playbook是基于ansible的
Linux:ansible自动化运维工具_鲍海超-GNUBHCkalitarro的博客-CSDN博客
Linux:ansible自动化运维工具_鲍海超-GNUBHCkalitarro的博客-CSDN博客
Linux:ansible自动化运维工具_鲍海超-GNUBHCkalitarro的博客-CSDN博客
目录
介绍
我们完成一个任务,例如安装部署一个httpd服务,我们需要多个模块(一个模块也可以称之为task)提供功能来完成。而playbook就是组织多个task的容器,他的实质就是一个文件,有着特定的组织格式,它采用的语法格式是YAML(Yet Another Markup Language)。YAML语法能够简单的表示散列表,字典等数据结构。
playbook是由一个或多个模块组成的,使用多个不同的模块,完成一件事情。
编写剧本-脚本(playbook)---针对重复性的操作
playbook基础组件
Hosts:运行执行任务(task)的目标主机
remote_user:在远程主机上执行任务的用户
tasks:任务列表
handlers:任务,与tasks不同的是只有在接受到通知时才会被触发
templates:使用模板语言的文本文件,使用jinja2语法。
variables:变量,变量替换{{ variable_name }}
整个playbook是以task为中心,表明要执行的任务。hosts和remote_user表明在哪些远程主机以何种身份执行。其他组件让其能够更加灵活。roles:角色。将hosts剥离出去。由tasks、handlers等所组成的一种特定的结构集合
Usage: ansible-playbook playbook.yml
相对于ansible,增加了下列选项:
--flush-cache # 清除fact缓存
--syntax-check # 语法检查
--force-handlers # 如果任务失败,也要运行handlers
--list-tags # 列出所有可用的标签
--list-tasks # 列出将要执行的所有任务
--skip-tags=SKIP_TAGS # 跳过运行标记此标签的任务
--start-at-task=START_AT_TASK # 在此任务处开始运行
--step 一步一步:在运行之前确认每个任务
-t TAGS, --tags=TAGS 只运行标记此标签的任务YAML有以下基本规则:
1、大小写敏感
2、使用缩进表示层级关系
3、禁止使用tab缩进,只能使用空格键
4、缩进长度没有限制,只要元素对齐就表示这些元素属于一个层级。
5、使用#表示注释
6、字符串可以不用引号标注7.'-'表示项
8。 ’:‘ 分隔键和值
9.整个文件以‘---’开始,以'...’结束
playbook基础用法(*.yml)
playbook的语法格式是YAML对空格缩进十分严格
现在我的主机列表是这样的
hosts详细写法在:Linux:ansible自动化运维工具_鲍海超-GNUBHCkalitarro的博客-CSDN博客
要写的playbook文件后缀必须以 .yml 结尾
创建一个文件 名字随便写 后缀要yml 我这里叫 a.yml
vim /root/a.yml
放在哪里无所谓
写入以下内容
---
# --- 代表着开始 ...就是结束
- hosts: web1
# 选择web1主机组 - 代表项 前面两个缩进
remote_user: root
# 远程执行的用户
tasks:
# tasks是任务列表
- name: useradd
# 任务名称 四缩进
user: name=test1111 state=present
# 调用user模块执行
tags:
- aaa
# 标签(别名)
...
---开始...结束上面的#注释就是上面一条命令的解释
开始测试文件有没有问题
ansible-playbook --syntax-check 文件路径
ansible-playbook --syntax-check /root/a.yml
没问题,但是预测试,并不真正执行命令
ansible-playbook -C 文件路径
ansible-playbook -C /root/a.yml
如果都没有问题,那么恭喜你,他就可以执行了
开始执行
ansible-playbook 文件路径
ansible-playbook /root/a.yml
查看执行结果
现在到了目标主上 刚刚在ansible主服务器远程执行的,成功了
列出该剧本执行主机
ansible-playbook --list-hosts 文件路径
ansible-playbook --list-hosts /root/a.yml
可以看到刚刚写的剧本里的,只有对web1组执行,那个组里包含了 192.168.254.2主机
查看剧本任务列表
ansible-playbook --list-tasks 文件路径
ansible-playbook --list-tasks /root/a.yml
那个aaa就是刚刚写的别名 前面的useradd 就是调用的模块
查看标签列表
ansible-playbook --list-tags 文件路径
ansible-playbook --list-tags /root/a.yml
aaa就是标签也是别名的意思
基础实战
我现在有两个主机组,现在web1 要求添加一个用户 和一个组 用户名为:tarro1111 组名为:tarrogroup
web2上 把ansible服务器上的/etc/passwd 文件 复制到web2的/root下
vim /root/yml/aaa.yml
---
- hosts: web1
remote_user: root
tasks:
- name: useradd
user: name=tarro1111 state=present
tags:
- usertarro1111
- name: groupadd
group: name=tarrogroup system=yes
tags:
- grouptarrogroup
- hosts: web2
remote_user: root
tasks:
- name: copypasswd
copy: src=/etc/passwd dest=/root
tags:
- ccc
~
ansible-playbook --syntax-check /root/yml/aaa.yml
ansible-playbook -C /root/yml/aaa.yml
测试成功
ansible-playbook /root/yml/aaa.yml
成功
触发器操作
vim /etc/ansible/httpd.yml
随便创建一个*.yml
---
- hosts: web1
# 对web1主机组执行
remote_user: root
# 远程用户使用root
tasks:
#任务列表
- name: change port
# 任务名称
command: sed -i 's/Listen\ 80/Listen \ 8080/g' /etc/httpd/conf/httpd.conf
##调用command模块,编辑httpd文件,更改侦听端口为8080
notify:
##配置触发条件,触发名称与下列的触发器名称对应
- restart httpd server
# 这里的和下面的名称一样就行
handlers:
##配置触发器
- name: restart httpd server
##触发器名称
service: name=httpd state=restarted
##调用服务模块,重启httpd服务
...
实战-安装数据库
创建角色目录
mkdir -pv /etc/ansible/roles/mariadb/{files,tasks,handlers}
创建三个目录,分别用于存放,主机组,任务,触发器 这里我管他们分别叫 主机组模块 任务模块 触发器模块 当然这些模块名字是我自己起的,在实际情况中,你也可以使用模块化的思路防止乱,每个模块就是目录
vim /etc/ansible/roles/mariadb/tasks/main.yml
先对我们的《安装数据库》任务模块进行playbook编写 写入一下内容
- name: install mariadb
yum: name=mariadb-server state=present
- name: move config file
shell: "[ -e /etc/my.cnf ] && mv /etc/my.cnf /etc/my.cnf.bak"
- name: provide a new config file
copy: src=my.cnf dest=/etc/my.cnf
- name: start mariadb
shell: systemctl start mariadb
- name: create database testdb
shell: mysql -u root -e "create database testdb;grant all on testdb.* to 'tarro'@'192.168.254.%' identified by '123';flush privileges;"
notify:
- restart mariadb
定义触发器的主文件模块
vim /etc/ansible/roles/mariadb/handlers/main.yml
写入
- name: restart mariadb
service: name=mariadb state=restarted
cp /etc/my.cnf /etc/ansible/roles/mariadb/files/
创建主角色(选择主机组模块)
vim /etc/ansible/mariadb.yml
- hosts: web1
remote_user: root
roles:
- mariadb
ansible-playbook -C /etc/ansible/mariadb.yml
预测一下
没问题
ansible-playbook /etc/ansible/mariadb.yml
开始执行
没问题,现在sshweb1组主机进行测试
ssh 192.168.254.2
mysql -uroot
show databases;
show grants for 'tarro'@'192.168.254.%';
成功