本篇主要是根据官方翻译而来,从而使简单的翻译,并没有相关的实验步骤,以后文章会补充为实验步骤,此篇主要是相关理论的说明,可以称之为中文手册之一,具体内容如下:

Ansible playbooks最佳实践

本文档主要阐述如何来写最好的playbook,在如下网址中能找到相关的例子,如下:

https://github.com/ansible/ansible-examples

在使用playbooks的最佳路径中,最好的方法是使用roles,这是最好的方法,在官方文档中,至少强调了三篇,从而在使用playbooks的时候,最好就是使用roles来进行组织playbook。

1、    目录结构

在使用roles进行组织的时候,是具有目录结构的,目录结构的使用也是将playbooks进行组织,在使用include的时候,主要是为了重用的目的,从而将复杂的playbook进行分割成小的,从而达到重用的目的,如下所示,表示为roles的目录组织结构。

production                #
生产环境服务器的列表(inventory file)

staging                   #
测试环境服务器列表(inventory file)

group_vars/

group1                 #
对特定的组分配变量

group2                 # ""

host_vars/

hostname1              #
主机特定变量

hostname2              # ""

library/                  #
客户端模块(可选)

filter_plugins/           #
客户端过滤模块(可选)

site.yml                  # master playbook

webservers.yml            # webserver
的playbook

dbservers.yml             # dbserver
的playbook

roles/

common/               #
此层表示为一个 "role"

tasks/            #

main.yml      #  <--
任务文件

handlers/         #

main.yml      #  <-- handlers文件

templates/        #  <--
模板文件位置

ntp.conf.j2   #  <-------
模板后缀符 .j2

files/            #

bar.txt       #  <--
拷贝文件资源

foo.sh        #  <-- script文件脚本资源

vars/             #

main.yml      #  <--
本role相关联的变量

defaults/         #

main.yml      #  <--
默认情况下优先级比较低的变量

meta/             #

main.yml      #  <-- role的依赖

webtier/              # webtier的role,和comman的role结构相同   
monitoring/           # ""

fooapp/               # ""

2、    使用动态inventory

在使用云的时候,可以不使用静态的inventory文件,可以使用动态的inventory文件。

3、    如何区分测试环境和生产环境

在测试环境和生产环境的管理中,主要用不同的inventory文件来进行区分。

在进行使用playbook的时候,最好在测试环境中进行测试,然后再在生产环境中进行执行。

在管理静态的inventory文件的时候,如果来区分生产环境和测试环境,主要就是使用前缀名,如下所示

# file: production
 
[atlanta-webservers]
www-atl-1.example.com
www-atl-2.example.com
 
[boston-webservers]
www-bos-1.example.com
www-bos-2.example.com
 
[atlanta-dbservers]
db-atl-1.example.com
db-atl-2.example.com
 
[boston-dbservers]
db-bos-1.example.com
 
# webservers in all geos
[webservers:children]
atlanta-webservers
boston-webservers
 
# dbservers in all geos
[dbservers:children]
atlanta-dbservers
boston-dbservers
 
# everything in the atlanta geo
[atlanta:children]
atlanta-webservers
atlanta-dbservers
 
# everything in the boston geo
[boston:children]
boston-webservers
boston-dbservers

在上图中,都使用相同的前缀名,从而来区分各个主机。

在进行管理不同环境的主机的时候,推荐的做法是使用不同的前缀名来进行区分主机环境,从而做到可读性比较强

4、    组和主机变量

组是比较容易管理的,但是并不是所有组都是这样的,同样可以对组的变量进行设置,在下面例子中,atlanta有其自己的变量,从而定义如下:

---
# file: group_vars/atlanta
ntp: ntp-atlanta.example.com
backup: backup-atlanta.example.com

在进行设置组变量的时候,可以根据不同组的属性从而来划分各个不同的变量,当具有默认属性的时候,那么可以将变量值设置在一下目录中,group_vars/all,如下所示:

---
# file: group_vars/all
ntp: ntp-boston.example.com
backup: backup-boston.example.com

也可以在目录host_vars中定义具体的系统变量,但是应当尽量避免此种情况的发生,如下图所示:

---
# file: host_vars/db-bos-1.example.com
foo_agent_port: 86
bar_agent_port: 99

5、    最高层的playbook划分为role

在site.yml中,可以使用include一个playbook来表述一个整体的结构,注意在整个里面是很简短的,如下所示,playbooks是包含一系列的playbook:

---
# file: site.yml
- include: webservers.yml
- include: dbservers.yml

在文件webserver.yml中,也就是配置这个组所对应的role,如下所示:

---
# file: webservers.yml
- hosts: webservers
  roles:
    - common
    - webtier

在进行运行的时候,我们可以使用site.yml来进行或者使用单独的webserver.yml来运行,如下就是来进行明确运行哪个playbook:

ansible-playbook site.yml --limit webservers
ansible-playbook webservers.yml

6、    在role中来组织task和handler

以下例子中演示如何使用一个role来进行工作,在这里可以做很多,如下所示:

---
# file: roles/common/tasks/main.yml
 
- name: be sure ntp is installed
  yum: name=ntp state=installed
  tags: ntp
 
- name: be sure ntp is configured
  template: src=ntp.conf.j2 dest=/etc/ntp.conf
  notify:
    - restart ntpd
  tags: ntp
 
- name: be sure ntpd is running and enabled
  service: name=ntpd state=running enabled=yes
  tags: ntp

下面的例子中,表示为一个handler,如下所示:

---
# file: roles/common/handlers/main.yml
- name: restart ntpd
  service: name=ntpd state=restarted

7、    组织结构如何启用

在上面的roles组织中,如何开启这种布局结构

如果要重新配置组织架构,只要执行下面的命令即可:

ansible-playbook -i production site.yml

如果要重新配置NTP,执行下面命令即可:

ansible-playbook -i production site.yml --tags ntp

如果要重新配置webservers,如下:

ansible-playbook -i production webservers.yml

如果要重新配置boston的webservsers,如下:

ansible-playbook -i production webservers.yml --limit boston

如果要重新配置前十个和下十个,如下:

ansible-playbook -i production webservers.yml --limit boston[0-10]
ansible-playbook -i production webservers.yml --limit boston[10-20]

如果要执行临时任务,如下:

ansible boston -i production -m ping
ansible boston -i production -m command -a '/sbin/reboot'

比较有用的指令如下:

# confirm what task names would be run if I ran this command and said "just ntp tasks"
ansible-playbook -i production webservers.yml --tags ntp --list-tasks
 
# confirm what hostnames might be communicated with if I said "limit to boston"
ansible-playbook -i production webservers.yml --limit boston --list-hosts

8、    使用state

在有的模块中,state是有默认值得,但是在playbook中最好是明确的标示state的状态是present还是absent,并且在state还有其他值得时候,明确指定state的值有利于可读性。

9、    操作系统和发行版变量

如果是针对的是不同操作系统的变量,最好的方法是使用group_by模块。这样会对动态的主机进行确认,虽然不在inventory文件中,如下:

---
 
# talk to all hosts just so we can learn about them
- hosts: all
  tasks:
     - group_by: key=os_{{ ansible_distribution }}
 
# now just on the CentOS hosts...
 
- hosts: os_CentOS
  gather_facts: False
  tasks:
     - # tasks that only happen on CentOS go here

这样会形成将所有的系统形成一个动态组,基于操作系统的名称。

如果需要特殊的设置组,那么如下所示:

---
# file: group_vars/all
asdf: 10
 
---
# file: group_vars/os_CentOS
asdf: 42

上例中,表示出了centos的机器获得的值为10,centos的机器获得值为42

也可以设置以下的变量:

- hosts: all
  tasks:
    - include_vars: "os_{{ansible_distribution}}.yml"
    - debug: var=asdf

此种变量是基于操作系统的名称

10、 其他

在使用的时候,注意用空格来进行分割不同的内容;

使用#来进行注释;

在书写playbook的时候,name最好是写上,从而表明相关的目的;

尽量保持playbook的简洁性;

控制版本。

在进行变量设置的时候,最好放在相关的目录中,并且可以使用grep等相关的工具来查找到变量位置。

ansible playbook最佳实践的更多相关文章

  1. Ansible playbook循环实践总结<一>

    1.标准Loops 标准loops可以直接减少task的次数,如下: [root@zero01 playbook]# vi loops.yaml --- - hosts: all gather_fac ...

  2. ansible安装配置及最佳实践roles

    ansible是什么? ansible是一款轻量级配置管理工具,用于远程批量部署.安装.配置.类似的还有puppet.saltstack,各有所长,任君自选. 官方文档:http://docs.ans ...

  3. ansible playbook实践(四)-如何调试写好的playbook文件

    有时,我们写了一个长长,功能很强悍的yaml文件,但是,我们有可能会担心,写的yaml文件是否正确,是否有漏洞危机,毕竟是要修改线上的机器,那么,有可能我们可以从以下几个检查维度来进行,确保在大规模应 ...

  4. 《Ansible自动化运维:技术与最佳实践》第三章读书笔记

    Ansible 组件介绍 本章主要通过对 Ansible 经常使用的组件进行讲解,使对 Ansible 有一个更全面的了解,主要包含以下内容: Ansible Inventory Ansible Ad ...

  5. Ansible Playbook Variables

    虽然自动化存在使得更容易使事情重复,但所有的系统可能不完全一样. 在某些系统上,您可能需要设置一些与其他操作略有不同的行为或配置. 此外,一些观察到的远程系统的行为或状态可能需要影响如何配置这些系统. ...

  6. Ansible PlayBook语法

    PlayBook语法实例 playbook是由一个或多个play组成的列表,play的主要功能在于将事先归并为一组的主机装扮成事先通过Ansible中的tasks定义好的角色(play的内容被称为ta ...

  7. Python自动化运维:技术与最佳实践 PDF高清完整版|网盘下载内附地址提取码|

    内容简介: <Python自动化运维:技术与最佳实践>一书在中国运维领域将有“划时代”的重要意义:一方面,这是国内第一本从纵.深和实践角度探讨Python在运维领域应用的著作:一方面本书的 ...

  8. 《开源安全运维平台OSSIM最佳实践》

    <开源安全运维平台OSSIM最佳实践> 经多年潜心研究开源技术,历时三年创作的<开源安全运维平台OSSIM最佳实践>一书即将出版.该书用80多万字记录了,作者10多年的IT行业 ...

  9. ansible 学习与实践

    title: ansible 学习与实践 date: 2016-05-06 16:17:28 tags: --- ansible 学习与实践 一 介绍 ansible是新出现的运维工具是基于Pytho ...

随机推荐

  1. TEET

    [{"PROCESS_STORE_TIME":"3min 11s","PROCESS_GET_FILE_TIME":"3min&q ...

  2. CListCtrl使用方法汇总

    回顾: 刚刚写完,因为是分期写的,所以最初想好好做一下的文章格式半途而废了~说的也许会有点啰嗦,但是所有的基础用到的技术细节应该都用到了. 如果还有什么疑问,请回复留言,我会尽力解答. 如果有错误,请 ...

  3. C# 文本文件打印类库(C#)

    我写了一个打印文本文件的类库,功能包括:打印预览.打印.打印时可以选择打印机,可以指定页码范围.调用方法非常简单:TextFilePrinter p = new TextFilePrinter(tbx ...

  4. php实现新闻页面

    首页 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8& ...

  5. .NET Framework 4.5 五个很棒的特性

    转自http://news.cnblogs.com/n/192958/ 英文原文:Five Great .NET Framework 4.5 Features 简介 自 .NET 4.5 发布已经过了 ...

  6. CSS的display属性

    网页设计中最常用的标签p.div.h1-h6(默认为块级元素),span(默认为内联元素) 内联,内嵌,行内属性标签: 1.默认同行可以继续跟同类型标签: 2.内容撑开宽度 3.不支持宽高 4.不支持 ...

  7. HDU 1505 City Game

    这题是上一题的升级版 关键在于条形图的构造,逐行处理输入的矩阵,遇到'F'则在上一次的条形图基础上再加1,遇到'R'则置为0 然后用上一题的算法,求每行对应条形图的最大矩阵的面积. 另外:本来是deb ...

  8. 51nod1403 有趣的堆栈

    看成括号序列的话第二种方法其实就是左括号和右括号之间有多少对完整的括号. #include<cstdio> #include<cstring> #include<ccty ...

  9. POJ2886 Who Gets the Most Candies? 线段树 反素数

    题意:有一群小朋友围成一个环,编号1,2,3…N.每个人手上握着一个非0的数字,首先第K个人出列,然后看他手上的数字,假设为m,则从下一个开始第m个人出列,一直如此.并设i为小于等于N的最大反素数,问 ...

  10. SQLServer—系统中的内存配置

    前言: 本文讲述32位和64位系统中的内存配置,在SQLServer 2005/2008中,DBA们往往尝试开启AWE来限制内存.但是,在SQLServer2012以后,这个选项将被弃用,所以不能使用 ...