Blog:博客园 个人

概述

playbook是由一个或者多个play组成的列表。

主要功能是将预定义的一组主机装扮成事先通过ansible中的task定义好的角色。task实际是调用ansible的一个模块,将多个play组织在一个playbook中,即可以让它们联合起来,将事先编排的机制执行预定义的动作。

playbook文件是使用YAML语言编写的。

YAML语言

官网:https://yaml.org/

YAML(Yet another Markup Language,仍是一种标记语言)是一个可读性高的用来表达资料序列的格式。

目前很多软件采用了此格式,如ansible、docker、k8s等。

语法说明

  • YAML 的配置文件后缀为.yml
  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进不允许使用tab,只允许空格
  • 缩进的空格数不重要,只要相同层级的元素左对齐即可
  • #表示注释,从这个字符一直到行尾,都会被解析器忽略

数据结构

YAML 支持的数据结构有三种。

  • 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
  • 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
  • 纯量(scalars):单个的、不可再分的值

对象

对象的一组键值对,使用冒号:结构表示。例如:

name: 'Rohn'

Yaml 也允许另一种写法,将所有键值对写成一个行内对象。例如:

{ hash: { name: 'Steve', foo: 'bar' } }

数组

一组连词线-开头的行,构成一个数组。例如:

- Cat
- Dog
- Goldfish

纯量

纯量是最基本的、不可再分的值。

纯量的类型:

  • 字符串
  • 布尔值
  • 整数
  • 浮点数
  • Null
  • 时间
  • 日期
字符串
  • 字符串默认不使用引号表示。
  • 如果字符串之中包含空格或特殊字符,需要放在引号之中。
  • 单引号和双引号都可以使用,双引号不会对特殊字符转义。
  • 单引号之中如果还有单引号,必须连续使用两个单引号转义。
  • 字符串可以写成多行,从第二行开始,必须有一个单空格缩进。换行符会被转为空格。
  • 多行字符串可以使用|保留换行符,也可以使用>折叠换行。
  • +表示保留文字块末尾的换行,-表示删除字符串末尾的换行。
  • 字符串之中可以插入 HTML 标记。

核心元素

元素 说明
hosts 远程主机列表
tasks 任务集
variables 内置变量或自定义变量,用于playbook中调用
templates 模板
handlers和notify handlers和notify配合使用,由特定条件触发的操作,满足条件则执行,否则不执行
tags 标签

hosts

playbook中的每一个play的目的是为了让特定主机以某个指定用户身份执行任务。hosts用于指定要执行指定任务的主机,需事先定义在主机清单中。例如:

- hosts: websrvs:dbsrvs  # 或者,两个组的并集
- hosts: websrvs:&dbsrvs # 与,两个组的交集
- hosts: websrvs:!dbsrvs # 在websrvs组,但不在dbsrvs组

remote_user

可以用于host和task中。也可通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户。

task列表和action组件

play的主体部分是task list。task list中有一个或者多个task,各个task按顺序逐个在hosts指定的所有主机上执行、也就是所有主机完成一个task后,再开始下一个task。

task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致。

每个task都应该有name,用于playbook的执行结果输出,建议其内容能清晰地描述任务执行步骤。若未能提供name,则action的结果将用于输出。

task格式有两种:

  • action: module arguments
  • module: arguments # 推荐使用这种

Tips:shell模块和command的模块后面跟的是命令,而非key=value的方式。

其他组件

若有任务的状态在运行后为changed时,可通过notify通知给相应的handlers。

shell脚本和playbook对比

部署Nginx

Shell脚本:

#!/bin/bash
yum -y install nginx
\cp /tmp/nginx.conf /etc/nginx/
\cp /tmp/web.conf /etc/nginx/conf.d/
systemctl enable nginx
nginx -t
systemctl start nginx

playbook实现:

---
- hosts: web_server
remote_user: root
tasks:
- name: "部署nginx"
yum: name=nginx
- name: "复制配置文件"
copy: src=/tmp/nginx.conf dest=/etc/nginx/
- name: "复制配置文件"
copy: src=/tmp/web.conf dest=/etc/nginc/conf.d/
- name: "启动nginx,并设置开机启动"
service: name=nginx state=started enable=yes

playbook命令

语法格式

usage: ansible-playbook [-h] [--version] [-v] [-k]
[--private-key PRIVATE_KEY_FILE] [-u REMOTE_USER]
[-c CONNECTION] [-T TIMEOUT]
[--ssh-common-args SSH_COMMON_ARGS]
[--sftp-extra-args SFTP_EXTRA_ARGS]
[--scp-extra-args SCP_EXTRA_ARGS]
[--ssh-extra-args SSH_EXTRA_ARGS] [--force-handlers]
[--flush-cache] [-b] [--become-method BECOME_METHOD]
[--become-user BECOME_USER] [-K] [-t TAGS]
[--skip-tags SKIP_TAGS] [-C] [--syntax-check] [-D]
[-i INVENTORY] [--list-hosts] [-l SUBSET]
[-e EXTRA_VARS] [--vault-id VAULT_IDS]
[--ask-vault-pass | --vault-password-file VAULT_PASSWORD_FILES]
[-f FORKS] [-M MODULE_PATH] [--list-tasks]
[--list-tags] [--step] [--start-at-task START_AT_TASK]
playbook [playbook ...]

精简为:

ansible-playbook <filename.yml> ... [options]

常用参数

参数 说明
-C 只检测可能发生的改变,并不真正执行操作
--list-hosts 列出运行任务的主机
--list-tags 列出tag
--list-taks 列出task
--limit 只针对主机列表中的主机执行
-v 显示过程

例子

安装MariaDB

---
#Installing MariaDB Binary Tarballs
- hosts: db_server
remote_user: root
gather_facts: no tasks:
- name: create group
group: name=mysql gid=27 system=yes
- name: create user
user: name=mysql uid=27 system=yes group=mysql shell=/sbin/nologin home=/data/mysql create_home=no
- name: mkdir datadir
file: path=/data/mysql owner=mysql group=mysql state=directory
- name: unarchive package
unarchive: src=/data/ansible/files/mariadb-10.2.27-linux-x86_64.tar.gz dest=/usr/local/ owner=root group=root
- name: link
file: src=/usr/local/mariadb-10.2.27-linux-x86_64 path=/usr/local/mysql state=link
- name: install database
shell: chdir=/usr/local/mysql ./scripts/mysql_install_db --datadir=/data/mysql --user=mysql
- name: config file
copy: src=/data/ansible/files/my.cnf dest=/etc/ backup=yes
- name: service script
shell: /bin/cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
- name: start service
service: name=mysqld state=started enabled=yes
- name: PATH variable
copy: content='PATH=/usr/local/mysql/bin:$PATH' dest=/etc/profile.d/mysql.sh

变量

变量名:仅能由字母、数字和下划线组成,且只能以字母开头。

语法格式

var=value

例如:

db_port=3306

变量调用方式

"{{ variable_name }}"

变量来源

  • ansible 的 setup facts 远程主机的所有变量都可直接调用;

  • 通过命令行指定变量,优先级最高

    ansible-playbook -e var=value
  • 在playbook文件中定义:

      vars:
    - var1: value1
    - var2: value2
  • 在独立的变量YAML文件中定义:

      - hosts: all
    vars_files:
    - vars.yml
  • /etc/ansible/hosts中定义:

    • 主机(普通)变量:主机组中主机单独定义,优先级高于公共变量;
    • 组(公共)变量:针对主机组中所有主机定义同一变量;
  • 在role中定义

template模板

模板是一个文本文件,可以作为生成文件的模板,并且模板文件中还可以嵌套jinja语法。

jinja语言

URL:https://jinja.palletsprojects.com/en/2.11.x/

  • jinja2 语言使用字面量,有下面形式:
  • 字符串:使用单引号或双引号
  • 数字:整数,浮点数
  • 列表:[item1, item2, ...]
  • 元组:(item1, item2, ...)
  • 字典:{key1:value1, key2:value2, ...}
  • 布尔型:true/false
  • 算术运算:+, -, *, /, //, %, **
  • 比较操作:==, !=, >, >=, <, <=
  • 逻辑运算:and,or,not
  • 流表达式:For,If,When

流程控制

template中也可以使用流程控制 for 循环和 if 条件判断,实现动态生成文件功能。

例如:

#temlnginx2.yml
---
- hosts: websrvs
remote_user: root
vars:
nginx_vhosts:
- 81
- 82
- 83
tasks:
- name: template config
template: src=nginx.conf.j2 dest=/data/nginx.conf #templates/nginx.conf2.j2
{% for vhost in nginx_vhosts %}
server {
listen {{ vhost }}
}
{% endfor %} ansible-playbook -C templnginx2.yml --limit 10.0.0.8 #生成的结果:
server {
listen 81
}
server {
listen 82
}
server {
listen 83
}

实例

同步nginx配置文件:

---
- hosts: web_server
remote_user: root tasks:
- name: "config"
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf

ansible:playbook详解的更多相关文章

  1. ansible playbook详解

    ansible playbook是由yml语法书写,结构清晰,可读性强,所以必须掌握yml基础语法 语法 描述 缩进 YAML使用固定的缩进风格表示层级结构,每个缩进由两个空格组成,不能使用tabs键 ...

  2. Ansible Playbook 详解

    一.playbook 的简单使用 1.创建文件实例 (1)编辑配置文件 [root@tiejiangSRC1 ~]# cd /etc/ansible/ [root@tiejiangSRC1 ansib ...

  3. Ansible之Playbook详解

    1.Playbook详解 playbook是一个非常简单的配置管理和多主机部署系统,可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式. 核心元素 Hosts:主机 Tasks:任务,由 ...

  4. Ansible配置详解

    目录 Ansible配置详解 参考 配置优先级 配置参数说明 Ansible配置详解

  5. ansible自动化运维详细教程及playbook详解

    前言 当下有许多的运维自动化工具( 配置管理 ),例如:Ansible.SaltStack.Puppet.Fabric 等. Ansible 一种集成 IT 系统的配置管理.应用部署.执行特定任务的开 ...

  6. Ansible配置文件ansible.cfg详解

    Ansible是一个系列文章,我会尽量以通俗易懂.诙谐幽默的总结方式给大家呈现这些枯燥的知识点,让学习变的有趣一些. Ansible系列博文直达链接:Ansible入门系列 前言 此时外面小雨淅淅沥沥 ...

  7. 2、Ansible配置文件详解

    0.配置文件 两个核心文件:ansible.cfg和hosts文件,默认都存放在/etc/ansible目录下. ansible.cfg:主要设置一些ansible初始化的信息,比如日志存放路径.模块 ...

  8. Ansible 配置文件详解

    # config file for ansible -- http://ansible.com/ # ============================================== #  ...

  9. Ansible之Playbook详解、案例

    什么是playbook playbooks是一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活.简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的 ...

  10. ansible中的playbook详解

    首先简单说明一下playbook,playbook是什么呢?根本上说playbook和shell脚本没有任何的区别,playbook就像shell一样,也是把一堆的命令组合起来,然后加入对应条件判断等 ...

随机推荐

  1. NGK公链:夯实基础设施 实现产业大规模应用

    当前,区块链已经成为全球技术角逐的前沿,大国及科技巨头竞相在该领域布局,引导区块链服务实体经济,激发市场经济活力.据市场相关研究机构预测,2020年,基于区块链的业务将达到1000亿美元. 对于区块链 ...

  2. 人物传记:Mila Fletcher:如何勤于思考抓住关键?

    Mila Fletcher于2007年毕业于耶鲁大学,她是一名真正意义上的法学博士,在校期间获得了马歇尔奖学金,毕业后曾在美国多家知名律师事务所任职,目前就职于星盟全球投资公司,专注于帮助公司和客户提 ...

  3. Renice INC:解密干型葡萄酒

    市场上,干型葡萄酒往往对比甜型葡萄酒(如甜红.甜白)受到更多葡萄酒爱好者的青睐.在葡萄酒界,大部分的红葡萄酒和白葡萄酒也都是干型的,而且它们的口感往往各有特色,并非千篇一律.今天,就跟随Renice ...

  4. Vue(1)

    一:概述 Vue是一套用于构建用户界面的渐进式JavaScript框架,与其它大型框架不同的是,Vue被设计为可以自底向上逐层应用.Vue的核心库只关心视图层,不仅易于上手,还便于与第三方库或既有项目 ...

  5. IDEA如何快速查看类中的属性和方法?

    在idea中,当需要快速的查看一个类的所有属性和方法时,直接去代码中查看,就显得非常的麻烦,idea是有快捷键的,可显示所有的属性和方法,方法如下. 打开一个类,使用快捷键ALT+7,就可以在左侧看到 ...

  6. 基于【腾讯云函数】/【GitHub Actions】/【Docker】的每日签到脚本(支持多账号使用)

    每日签到集合 基于[腾讯云函数]/[GitHub Actions]/[Docker]的每日签到脚本 支持多账号使用 特别声明: 本仓库发布的脚本及其中涉及的任何解锁和解密分析脚本,仅用于测试和学习研究 ...

  7. ADT基础(一)—— List,Stack,and Queue

    ADT基础(一)-- List,Stack,and Queue 1 List 表示 数组:易于search,难于insert和remove 链表:难于search,易于insert和remove // ...

  8. HBase 数据存储结构

    在HBase中, 从逻辑上来讲数据大概就长这样: 单从图中的逻辑模型来看, HBase 和 MySQL 的区别就是: 将不同的列归属与同一个列族下 支持多版本数据 这看着感觉也没有那么太大的区别呀, ...

  9. 《C++ Primer》笔记 第10章 泛型算法

    迭代器令算法不依赖于容器,但算法依赖于元素类型的操作. 算法永远不会执行容器的操作.算法永远不会改变底层容器的大小. accumulate定义在头文件numeric中,接受三个参数,前两个指出需要求和 ...

  10. 剑指 Offer 66. 构建乘积数组 + 思维

    剑指 Offer 66. 构建乘积数组 Offer_66 题目描述 题解分析 java代码 package com.walegarrett.offer; /** * @Author WaleGarre ...