Ansible Playbooks

Playbooks 组成部分:

  • Inventory
  • Modules
  • Ad Hoc Commands
  • Playbooks
    • Tasks: 任务,即调用模块完成的某些操作
    • Variables: 变量
    • Templates: 模板
    • Handlers: 处理器,由某时间触发执行的操作
    • Roles: 角色

YAML 介绍

YAML 是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言。

YAML Ain't Markup Language,即YAML不是XML。

其特性:

  • 可读性好
  • 和脚本语言的交互性好
  • 使用时限语言的数据类型
  • 有一个一直的信息模型
  • 易于实现
  • 可以基于流来处理
  • 表达能力强,扩展型好

YAML 语法

YAML 的语法和其他高阶语言类似,并且可以简单表达清单、散列表、变量等数据结构。其结构(Structure)通过空格来展示,序列(Squence)里的项用-来代办,Map里的键值对用:分割

案例:

name: John Smith
age: 41
gender: Male
spouse:
name: Jane Smith
age: 37
gennder: Female
children:
- name: Jimmy Smith
age: 17
gender: Male
- name: Jenny Smith
age: 13
gender: Female

YAML 文件扩展名通常为: .yaml,如 example.yaml

List

列表中的所有元素均使用-打头,例如:

# A list of t asty fruits
- Apple
- Orange
- Strawberry
- Mango

Dictionary

字典通过key与value进行表示,例如:

# An exployee record
name: Example Developer
job: Developer
skill: Elite

也可以将key:value 放置于{}中进行描述

# An exployee record
{name: Example Developer, job: Developer, skill: Elite}

Ansible 基础元素

变量

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

facts

facts是由正在通信的远程目标主机发挥的信息,这些信息被保存在ansible变量中,要获取指定额远程主机所支持的所有facts,可以使用如下命令进行:

# ansible hostname -m setup

registre

把任务的输出定义为变量,然后用于其他任务,示例如下:

tasks:
- shell: /usr/bin/foo
register: foo_result
ignore_errors: true

通过命令传递变量

在运行playbook的时候也可以通过一些变量供playbook使用,示例如下:

ansible-playbook test.yml --extra-vars "hosts=www user=mageedu"

通过roles传递变量

当一个主机应用角色的时候可以传递变量,然后在角色内使用这些变量,示例如下:

- hosts: webservs
roles:
- common
- { role: foo_app_instance, dir: '/web/htdocs/a.com', port: 8080 }

Inventory

ansible 的主要功能在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory file中将其分组命名。默认的Inventory file 为 /etc/ansible/hosts。

inventory file 可以有多个,且也可以通过Dynamic Inventory来动态生成

主机变量

可以在inventory中定义主机时为其添加主机变量以便于在playbook中使用。例如:

[webservs]
10.0.0.65 http_port=80 maxRequestsPerChild=888
10.0.0.66 http_port=8080 maxRequestsPerChild=909

组变量

组变量是指赋予给特定组内所有主机上在playbook中可用的变量。例如:

[webservs:vars]
ntp_server=ntp.aliyun.com
nfs_server=nfs.aliyun.com

注意:[组名:vars] 组名中的:vars 是固定用法

组嵌套

inventory中,组还可以包含其他的组,并且也可以像组中的主机指定变量。不过这些变量只能在ansible-playbook中使用,而不支持ansible。例如:

[apache]
http1.magedu.com
http2.magedu.com [nginx]
nginx1.magedu.com
nginx2.magedu.com [webservs:children]
apache
nginx [webservs:vars]
ntp_server=ntp.magedu.com

注意::childer 同样是固定用法

inventory 参数

ansible基于ssh链接inventory中指定的远程主机时,还可以通过参数指定其交互方式;这些擦桉树如下所示:

  • ansible_ssh_host
  • ansible_ssh_port
  • ansible_ssh_user
  • ansible_ssh_pass
  • ansible_sudo_pass
  • ansible_connection
  • ansible_ssh_private_key_file
  • ansible_shell_type
  • ansible_python_interpreter
  • ansible_*_interpreter

编写 ansible playbooks 剧本

playbook是由一个或多个play组成的列表。play的主要功能在于将事先归并一组的主机装扮成事先通过ansible中的tasks定义好的角色。从根据上来讲,所谓task无非是调用ansible的一个module。将多个play组织在一个playbook中,既可以让他们联通起来按事先编排的机制同唱一台大戏。下面是一个简单的示例:

- hosts: webnodes
vars:
http_port: 80
max_clients: 256
remote_user: root
tasks:
- name: ensure apache is at the lastest version
yum: name=httpd state=latest
- name: ensure apache is running
service: name=httpd state=started
handlers:
- name: restart apache
service:name=httpd state=restarted

playbook 基础组件

Hosts 和 Users

playbook 中的每一个play的目的都是为了让某个或某些主机一某个指定的用户执行任务。hosts用于指定要执行指定任务的主机,其可以使一个或多个由冒号分割主机组;remote_user则用于指定远程主机上的执行任务的用户。例如上面示例中的:

- hosts: webnodes
remote_user: root

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

- hosts: webnodes
remote_user: mageedu
tasks:
- name: test connection
ping:
remote_user: mageedu
sudo: yes

任务列表和action

  • play的主体部分是task list。task list中的个任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。在运行playbook 时,如果中途发生错误,所有已执行任务都将会滚,因此,在更正playbook后重新执行一次即可。

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

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

  • 定义task的可以使用"action: module options" 或 "module: options" 的格式,推荐使用候着以实现向后兼容。如果action一行的内容过度,也使用在行首使用几个空白字符进行换行

tasks:
- name: make sure apache is running
service: name=htpd state=running

在众多模块中,只有command 和shell模块仅需要给一个列表而无需使用"key=vale"格式,例如:

tasks:
- name: disable selinux
command: /sbin/setenforce 0

如果命令或脚本的退出码不为零,可以使用如下方式替代:

tasks:
- name: run this command and ignore the result
shell: /usr/bin/somecommand || /bin/true
ignore_errors: true

或者使用ignore_errors来忽略错误信息

tasks:
- name: run this command and ignore the result
shell: /usr/bin/somecommand
ignore_errors: true

playbook 案例 1

在所有的webservs组的主机上创建nginx用户和用户组

并模拟拷贝文件到dbservs中

[root@node01 ansible]# cat nginx.yml
- hosts: webservs
remote_user: root
tasks:
- name: create nginx group
group: name=nginx system=yes gid=208
- name: create nginx user
user: name=nginx system=yes uid=208 group=nginx - hosts: dbservs
remote_user: root
tasks:
- name: copy file to dbservs
copy: src=/etc/inittab dest=/tmp/inittab.ans

使用ansible-playbook命令执行:

[root@node01 ansible]# ansible-playbook nginx.yml 

PLAY [webservs] ***********************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************
ok: [10.0.0.65] TASK [create nginx group] *************************************************************************************************
changed: [10.0.0.65] TASK [create nginx user] **************************************************************************************************
changed: [10.0.0.65] PLAY [dbservs] ************************************************************************************************************ TASK [Gathering Facts] ****************************************************************************************************
ok: [10.0.0.66] TASK [copy file to dbservs] ***********************************************************************************************
ok: [10.0.0.66] PLAY RECAP ****************************************************************************************************************
10.0.0.65 : ok=3 changed=2 unreachable=0 failed=0
10.0.0.66 : ok=2 changed=0 unreachable=0 failed=0

验证: webservs的nginx用户和组以及dbservs的/tmp/inittab.ans文件

[root@node01 ansible]# ansible webservs -a 'grep nginx /etc/passwd'
10.0.0.65 | CHANGED | rc=0 >>
nginx:x:208:208::/home/nginx:/bin/bash [root@node01 ansible]# ansible webservs -a 'grep nginx /etc/group'
10.0.0.65 | CHANGED | rc=0 >>
nginx:x:208: [root@node01 ansible]# ansible dbservs -a 'ls -l /tmp/inittab.ans'
10.0.0.66 | CHANGED | rc=0 >>
-rw-r--r-- 1 root root 511 Oct 12 10:38 /tmp/inittab.ans

Ansible Playbooks 介绍 和 使用 一的更多相关文章

  1. Ansible Playbooks 介绍 和 使用 二

    目录 handlers playbook 案例 2 handlers vars 变量 setup facts 变量使用 案例 inventory 中定义变量 案例 条件测试 when 语句 案例 迭代 ...

  2. 3、Ansible playbooks(Hosts、Users、tasks、handlers、变量、条件测试(when、迭代)、templates)

    Ansible playbooks playbook是由一个或多个“play”组成的列表.play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色.从根本上来讲 ...

  3. Ansible简单介绍(一)

    一 :ansible简单介绍 此名取自 Ansible 作者最喜爱的<安德的游戏> 小说,而这部小说更被后人改编成电影 -<战争游戏>. 官网地址:https://www.an ...

  4. 第二十七章 ansible变量介绍

    一.ansible变量介绍 1.概念 变量提供了便捷的方式来管理Ansible playbook的每一个项目中的动态值,比如nginx-1.6.3这个软件包的版本,在其它地方或许会反复使用,那么如果讲 ...

  5. Ansible Playbooks入门介绍

    1.目录结构 2.详细目录 3.主任务文件main.yaml 主任务文件main.yaml - name: print server name and user to remote testbox # ...

  6. ansible的介绍和一些基本模块介绍

    必须保证ansible工作站与各个node实现无密码ssh登入 ①:192.168.1.100 - 在你本地的工作站或服务器上安装 Ansible.   ②:文件服务器1到代理服务器3 - 使用 19 ...

  7. Ansible playbooks

    Playbook是Ansible的配置,部署和编排语言. 他们可以描述您希望远程系统执行的策略,或一般IT流程中的一组步骤. 如果Ansible modules是您workshop的工具,则playb ...

  8. ansible模块介绍之ios_command

    一.模块简介 ios_command此模块将任意命令发送到ios节点并返回设备读取的结果 此模块不支持在配置模式下使用,即只支持在用户模式>和特权模式#下使用 官方文档地址:https://do ...

  9. ansible模块介绍之ios_facts

    一.模块简介 收集运行IOS系统的(此处指思科的ios)的远端设备信息 二.模块参数 auth_pass #特权密码,如果参数authorize=no,则不会检索此密码,如果任务task不指定,则默认 ...

随机推荐

  1. 解决node.js使用fs读取文件出错

      今天配接口,使用fs模块读取json出现了错误'no such file or directory',然后经查终于解决,特此记录. 使用nodejs的fs模块读取文件时习惯用相对路径,但是运行的时 ...

  2. CSPS模拟 64

    觉悟试炼场 暴力没打满有点遗憾 T2莫队没想到有点遗憾 T1 Trade 反悔贪心? 赛时猜了个解法,结果过样例过对拍就交了. 贪心依据:如果目前买入a有机会在b卖出赚钱,则a在任何最优方案中都被购买 ...

  3. JS中的两种数据类型以及实现引用类型的深拷贝

    一.前言 我们知道,在JS中数据类型按照访问方式和存储方式的不同可分为基本类型和引用类型.基本类型基本类型有String.Boolean.Number,Undefined.Null,这些基本类型都是按 ...

  4. day 1 堆 hash 线段树 树状数组 冰茶姬 字典树 二叉查找树

    来郑州的第二天,早上开始也没说什么就说了些注意安全,各种各样的注意安全... 冰茶姬: 原来再打食物链时看了一下冰茶姬,只注意了路径压缩,没想到还有什么按秩排序但确实快了不少... int find( ...

  5. 最新JetBrains PyCharm 使用教程--常用快捷键和设置PyCharm为Eclipse快捷键(四)

    PyCharm常用快捷键使用 Ctrl + D:复制当前行 Ctrl + Y:删除当前行 Ctrl + Z 撤销 Shift + Enter:快速换行 Ctrl + /:快速注释 Ctrl + F: ...

  6. Unity中用Mesh画一个圆环(二)

    中目标-生成完整面 在之前的内容中我们已经成功生成了一个面,接下来我们要生成剩下的面就很容易了. 我们把之前生成的面当作顶面,接着我们来生成底面. 还记得前面说过\(\color{#1E90FF}{D ...

  7. js数组方法大全(下)

    # js数组方法大全(下) 记录一下整理的js数组方法,免得每次要找方法都找不到.图片有点多,注意流量,嘻嘻! 本期分享 forEach() map() filer() every() some() ...

  8. 平滑启动shell脚本

    # 平滑关闭和启动 Spring Boot 程序#设置端口SERVER_PORT="8090"#当前时间time=`date +%Y-%m-%d`#设置应用名称JAR_NAME=& ...

  9. Reporting service个人使用经验

    (此文章是从自己写的Word文档里复制过来的,图没有了,文字也有些乱,凑合看吧) 部署环境 Windows server 2012 R2 软件环境 安装完整的sqlsever2012,IIS服务 需要 ...

  10. [LC]141题 Intersection of Two Linked Lists (相交链表)(链表)

    ①中文题目 编写一个程序,找到两个单链表相交的起始节点. 如下面的两个链表: 在节点 c1 开始相交. 注意: 如果两个链表没有交点,返回 null.在返回结果后,两个链表仍须保持原有的结构.可假定整 ...