当前位置:网站首页>Ansible自动化运维工具(二)playbook剧本
Ansible自动化运维工具(二)playbook剧本
2022-08-08 19:36:00 【风雪一更ing】
目录
一、playbook
playbook是剧本的意思
通过 task 调用 ansible 的模块将多个 play 组织在一 个playbook中运行。
playbook本身由以下各部分组成:
- Tasks: 任务,即调用模块完成的某操作
- Variables: 变量
- Templates: 模板
- Handlers: 处理器,当某条件满足时,触发执行的操作
- Roles: 角色
- playbook yaml语法是换行空两格,-和:后必须空一格
playbook由YMAL语言编写,YAML是一种非标记语言。是用来写配置文件的语言,非常简洁合强大
- YAML语法和其他语言类似,也可以表达散列表、标量等数据结构
- 结构通过空格来展示,
- 序列里配置项通过 - 来表示
- Map里的键值用:来分隔
- YAML的扩展名为yaml
1、playbook简介
- Playbooks 是 Ansible的配置、部署、编排语言,他们可以被描述为一个需要希望远程主机执行命令的方案,或者一组IT程序运行的命令集合
- Playbooks 与 ad-hoc相比,是一种完全不同的运用ansible的方式,是非常之强大的。
- 简单来说,playbooks是一种简单的配置管理系统与多机器部署系统的基础,与现有的其他系统有不同之处,且非常适合于复杂应用的部署。
- playbook是ansible用于配置,部署,和管理被控节点的剧本。
- 通过playbook的详细描述,执行其中的一系列tasks,可以让远端主机达到预期的状态。playbook就像Ansible控制器给被控节点列出的的一系列to-do-list,而被控节点必须要完成。
- 也可以这么理解,playbook 字面意思,即剧本,现实中由演员按照剧本表演,在Ansible中,这次由计算机进行表演,由计算机安装,部署应用,提供对外服务,以及组织计算机处理各种各样的事情
2、playbook使用场景
- 执行一些简单的任务,使用ad-hoc命令可以方便的解决问题,但是有时一个设施过于复杂,需要大量的操作时候,执行的ad-hoc命令是不适合的,这时最好使用playbook。
- 就像执行shell命令与写shell脚本一样,也可以理解为批处理任务,不过playbook有自己的语法格式。
- 使用playbook你可以方便的重用这些代码,可以移植到不同的机器上面,像函数一样,最大化的利用代码。在你使用Ansible的过程中,你也会发现,你所处理的大部分操作都是编写playbook。可以把常见的应用都编写成playbook,之后管理服务器会变得十分简单。
3、yaml基本语法规则
1、大小写敏感
2、使用缩进表示层级关系
3、缩进时不允许使用tab键、只允许使用空格
4、缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
hosts | 定义节点,可以是组 |
---|---|
remote_user | 是你以什么用户身份进行登陆 |
tasks | 是你的任务 |
become:yes | 表示切换用户 |
become_user: mysql | 表示切换到mysql用户,配合上一条使用 |
- name: | 为下面执行的操作起名 |
4、yaml支持的数据结构
- 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes)/ 字典(dictionary)
- 数组:一组按次序排列的值,又称为序列(sequence)/ 列表(list)
- 纯量:单个的、不可再分的值
二、Inventory中的变量
Inventory是Ansible管理主机信息的配置文件,相当于系统HOSTS文件的功能,默认存放在/etc/ansible/hosts
主机变量
[web1]
www.zhangbin.com
www.lichen.com
组变量
[servers:vars]
组嵌套
[web1]
www.zhangbin.com
www.lichen.com
[web2]
www.lcdb.com
www.lc2b.com
[webservers]
web1
web2
1、inventor变量参数
参数 | 说明 |
ansible_ssh_host | 将要连接的远程主机名,与你想要设定的主机的别名不同的话,可通过此变量设置 |
ansible_ssh_port | ssh端口号,如果不是默认的端口号,通过此变量设置 |
ansible_ssh_user | 默认的ssh用户名 |
ansible_ssh_pass | ssh密码(这种方式并不安全,我们强烈建议使用 --ask-pass或SSH密钥) |
ansible_ssh_private_key_file | ssh使用的私钥文件,适用于有多个密钥,而你不想使用SSH代理的情况 |
ansible_ssh_common_args | 此设置附加到sftp,scp和ssh的缺省命令行 |
ansible_sftp_extra_args | 此设置附加到默认sftp命令行 |
ansible_scp_extra_args | 此设置附加到默认scp命令行 |
ansible_ssh_extra_args | 此设置附加到默认ssh命令行 |
ansible_ssh_pipelining | 确定是否使用SSH管道。这可以覆盖ansible.cfg中得到设置 |
ansible_shell_type | 目标系统的shell类型,默认情况下,命令的执行使用sh语法,可设置为csh 或 fish |
ansible_python_interpreter | 目标主机的python路径,适用于的情况:系统中有多个python,或者命令路径不是“/usr/bin/python” |
ansible_*_interpreter | 这里的*可以是ruby或perl或其他语言的解释器,作用和ansible_python_interpreter类似 |
ansible_shell_executable | 这将设置ansible控制器将在目标机器上使用的shell,覆盖ansible.cfg中的配置,默认为/bin/sh |
三、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 | 引入变量值 |
1、为每个任务定义远程执行用户
cd /opt
vim 1.yaml
- hosts: mysql
remote_user: root
tasks:
- name: test connection
ping:
remote_user: mysql
ansible mysql -m user -a 'name=mysql'
ansible mysql -m shell -a 'echo 123456 | passwd --stdin mysql'
ansible-playbook 1.yaml -k
123456
2、指定远程主机切换用户执行剧本
vim 2.yaml
- hosts: mysql
remote_user: root
become: yes
become_user: mysql
tasks:
- name: copy text
copy: src=/etc/fstab dest=/home/mysql/fstab.bak
ansible-playbook 2.yaml
3、tasks忽略错误,强制返回成功
- Play的主体部分是task列表,task列表中的各任务按次序逐个在hosts中指定的主机上执行,即在所有主机上完成第一个任务后再开始。在运行playbook时 (从上到下执行),如果一个host执行task失败, 整个tasks都会停止。
- 每一个task必须有一个名称 name,这样在运行playbook时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个task的。
错误示例:遇到错误task自动停止,apache服务不会继续安装
vim 3.yaml
- hosts: webserver
remote_user: root
tasks:
- name: stop selinux
command: '/usr/sbin/setenforc 0'
- name: install httpd
yum: name=httpd
- name: start httpd
service: name=httpd state=started
ansible-playbook 3.yaml
加入ignore_errors: True 忽略错误,报错后继续执行
vim 3.yaml
- hosts: webserver
remote_user: root
tasks:
- name: stop selinux
command: '/usr/sbin/setenforc 0'
ignore_errors: True
- name: install httpd
yum: name=httpd
- name: start httpd
service: name=httpd state=started
ansible-playbook 3.yaml
4、针对多个主机节点执行剧本
vim 4.yaml
- hosts: webserver
remote_user: root
tasks:
- name: remove httpd
yum: name=httpd state=absent
- hosts: mysql
remote_user: root
tasks:
- name: copy file
copy: src=/etc/fstab dest=/opt/haha.txt
5、Handlers概述
Handlers也是一些task的列表, 和一般的task并没有什么区别。
是由通知者进行的notify(通知),如果没有被notify,则Handlers不会执行,假如被notify了 ,则Handlers被执行不管有多少个通知者进行了notify,等到play中的所有task执行完成之后,handlers也只会被执行一次
vim 5.yaml
- hosts: webserver
remote_user: root
tasks:
- name: remove httpd
yum: name=httpd state=absent
- name: start firewalld
service: name=firewalld state=started
- name: setenforce 0 && install httpd
command: '/usr/sbin/setenforce 0'
notify:
- step one
- name: stop firewalld && start httpd
service: name=firewalld state=stopped
notify:
- step two
handlers:
- name: step one
yum: name=httpd
- name: step two
service: name=httpd state=started
ansible-playbook 5.yaml
6、引入变量
playbook引入变量有三种方式
- 通过ansible命令参数-e传递
- 直接在yaml中定义
- 引用主机清单中定义的变量
6.1 通过ansible命令参数-e传递
vim 6_1.yaml
- hosts: mysql
remote_user: root
vars:
- user:
tasks:
- name: add user
user: name={
{user}}
ansible-playbook 6_1.yaml -e "user=wangwu"
ansible mysql -a 'tail -1 /etc/passwd'
6.2 直接在yaml中定义,或者内置变量
vim 6_2.yaml
- hosts: mysql
remote_user: root
vars:
- user: lisi
tasks:
- name: add user
user: name={
{user}}
ansible-playbook 6_2.yaml
ansible mysql -a 'tail -1 /etc/passwd'
vim 6_2.yaml
- hosts: mysql
remote_user: root
tasks:
- name: copy file
copy: content="{
{ansible_all_ipv4_addresses}}" dest=/opt/vars.txt
ansible-playbook 6_2.yaml
ansible mysql -a 'ls /opt'
ansible mysql -a 'cat /opt/vars.txt'
6.3 引用主机清单内自定义变量
vim /etc/ansible/hosts
[webserver]
192.168.184.20
[mysql]
192.168.184.30 user=zhaoliu
vim 6_3.yaml
- hosts: mysql
remote_user: root
tasks:
- name: add user
user: name={
{user}}
ansible-playbook 6_3.yaml
ansible mysql -a 'tail -1 /etc/passwd'
7、条件测试
如果需要根据变量、facts (setup) 或此前任务的执行结果来作为某task执行与否的前提时要用到条件测试,在Playbook中条件测试使用。在task后添加when子句即可使用条件测试: when子句支持 jinjia2 表达式或语法
7.1 单条件判断
vim 7_1.yaml
- hosts: mysql
remote_user: root
tasks:
- name: "shutdown CentOS"
command: /sbin/shutdown -h now
when: ansible_distribution == "CentOS"
ansible-playbook 7_1.yaml
7.2 多条件判断
vim 7_2.yaml
- hosts: mysql
remote_user: root
tasks:
- name: "shut down CentOS 7 systems"
command: /sbin/shutdown -r now
when:
- ansible_distribution == "CentOS"
- ansible_distribution_major_version == "7"
ansible-playbook 7_2.yaml
7.3 组条件判断
vim 7_3.yml
- hosts: mysql
remote_user: root
tasks:
- name: "shut down CentOS 6 and Debian 7 systems"
command: /sbin/shutdown -t now
when: (ansible_distribution == "CentOS" and ansible_distribution_major_version == "6") or (ansible_distribution == "Debian" and ansible_distribution_major_version == "7")
ansible-playbook 7_3.yaml
7.4 迭代
当有需要重复性执行的任务时,可以使用迭代机制。其使用格式为将需要迭代的内容定义为item变量引用,并通过with_items语句指明迭代。
vim 7_5.yaml
- hosts: webserver
remote_user: root
tasks:
- name: install
yum: name={
{item}} state=latest
with_items:
- httpd
- rpcbind
- nfs-utils
ansible-playbook 7_5.yaml
ansible webserver -a 'rpm -q httpd'
ansible webserver -a 'rpm -q rpcbind'
ansible webserver -a 'rpm -q nfs-utils'
也可以自己定义item变量
vim 7_5.yaml
- hosts: webserver
remote_user: root
tasks:
- name: add user && join group
user: name={
{item.x}} state=present group={
{item.y}}
with_items:
- {x: 'qianqi', y: 'wheel'}
- {x: 'sicong', y: 'root'}
ansible-playbook 7_5.yaml
ansible webserver -a 'tail -2 /etc/passwd'
边栏推荐
- 黑猫带你学Makefile第9篇:menuconfig/Kconfig/deconfig/.config及Makefile之间的关系
- 对话框管理器第六章:消息循环中的细节
- 软考中级网络工程师全面学习笔记第2版(5万字)+配套视频及课件
- 黑猫带你学Makefile第2篇:程序编译的过程
- 虚假信息处理最新有何进展?KDD2022《打击错误信息和应对媒体偏见》教程,161页ppt
- openEuler 资源利用率提升之道02:典型应用下的效果
- Monaco-Editor 多人协作 编辑器
- 智驾科技完成C1轮融资,此前2轮已融4.5亿元
- FastDFS distributed file system
- 文档管理系统对于企业来说有哪些作用?
猜你喜欢
软考中级网络工程师全面学习笔记第2版(5万字)+配套视频及课件
JVM调优-JVM调优实践一
数组!!!
分布式链路追踪Jaeger + 微服务Pig在Rainbond上的实践分享
PX4-Things you need to know for secondary development of flight control-Cxm
电脑win键没有反应(最全方案)
培训预告 | 企业应用现代化实用教程——DevOps方法论及最佳实践篇 8月11日上线
wps表格怎么复制粘贴后与原来格式一样?
数字化工厂建设的内容主要有哪三个方面
Why Manufacturing Companies Should Deploy Digital Factory Systems
随机推荐
期货开户哪家公司好,要正规安全的
梅科尔工作室OpenHarmony设备开发培训笔记-第一章学习笔记
APICloud AVM wraps date and time selection components
传统和加密域名概述
laravel run scheduler command on weekdays (except holidays)
NAACL2022 NER SOTA—RICON学习笔记
How can recommender systems be trusted?A review of the latest "Trusted Recommender System" from Rutgers University, a 43-page pdf explaining the composition and technology of trusted RS
nyoj685 查找字符串(map)
LeetCode #104.二叉树的最大深度
卡通渲染的历史
odoo login layout adjustment
分布式链路追踪Jaeger + 微服务Pig在Rainbond上的实践分享
启牛商学院开户是安全的吗?开户靠谱吗?
工程 (六) ——PointNet点云分类
Codeforces Round #725 (Div. 3)
WPF DataGrid 展示数据
腾讯云原生成本优化平台FinOps Crane荣获国家级大奖!
Codeforces Round #721 (Div. 2)
如何在EasyDSS中使用ffmpeg实现点播视频的拼接与合成?
黑猫带你学Makefile第7篇:Makefile简单例程一览