ansible高级应用

上一篇博客介绍了ansible的基础应用Modules,博客地址 http://www.178linux.com/14860 。这次介绍下Ansible的另一个核心模块Playbooks。

 

Ansible的核心模块:

    Ansible core:            核心;

    core Modules:          包括 Ansible 自带的核心模块及自定义模块;

    connect Plugins:       完成模块功能的补充,包括连接插件、邮件插件等;

    Playbooks:       网上很多翻译为剧本,个人觉得理解为编排更为合理;定义 Ansible 多任务配置文件,由 Ansible 自动执行;

    host Inventory:         定义 Ansible 管理主机的清单、主机池、主机列表;

 

        Playbook是由一个或多个“play”组成的列表。play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。
从根本上来讲,所谓task无非是调用ansible的一个module。将多个play组织在一个playbook中,即可以让它们联同起来按事先编排的机制同唱一台大戏。

        ansinbl使用 Python paramiko 开发,分布式,无需客户端,轻量级,配置语法使用 YMAL 及 Jinja2模板语言,更强的远程命令执行操作。

 

YAML介绍:

        YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者。

YAML Ain't Markup Language,即YAML不是XML。不过,在开发的这种语言时,YAML的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)。其特性:

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

更多的内容及规范参见http://www.yaml.org

 

1、YAML语法:

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

Playbook组成结构:
 Inventory
 Modules
 Ad Hoc Commands
 Playbooks
  Tasks:任务,即调用模块完成的操作
  Variables:变量
  Templates:模板
  Handlers:处理器,由某个条件触发执行的操作
  Roles:角色
基本结构:
 – host:webservices
  remote_user:
  – tasks:
   – task1
    module_name

YAML文件扩展名通常为.yml,如test.yml。

2、使用yaml模板文件安装httpd、提供其配置文件、配置开机启动并启动服务:

[root@master ansible]# vim apache.yml
– hosts: webserver
  remote_user: root
  tasks:
  – name: install httpd package
    yum: name=httpd state=latest
  – name: install configuration file for httpd
    copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf
  – name: start httpd service
    service: enabled=true name=httpd state=started

    apache-yml.jpg

    apache-yml-client.jpg

 

3、YAML语言变量:

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

 facts变量:

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

            ansible hostname -m setup

             register

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

  tasks:
     – shell: /usr/bin/foo
       register: foo_result
       ignore_errors: True

通过命令行传递变量:

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

     ansible-playbook test.yml –extra-vars "hosts=webserver user=node1"

通过roles传递变量:

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

     – hosts: webservers
       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文件格式:

        inventory文件遵循INI文件风格,中括号中的字符为组名。可以将同一个主机同时归并到多个不同的组中;此外,当如若目标主机使用了非默认的SSH端口,还可以在主机名称之后使用冒号加端口号来标明。

 test.ansible.com

 [webservers]
 www1.mageedu.com:2222
 www2.mageedu.com

 [dbservers]
 db1.mageedu.com
 db2.mageedu.com
 db3.mageedu.com

如果主机名称遵循相似的命名模式,还可以使用列表的方式标识各主机,例如:

[webservers]
www[01:50].example.com

[databases]
db-[a:f].example.com

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

[webservers]
www1.mageedu.com http_port=80 maxRequestsPerChild=808
www2.mageeducom http_port=8080 maxRequestsPerChild=909

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

[webservers]
www1.mageedu.com
www2.mageedu.com

[webservers:vars]
ntp_server=ntp.mageedu.com
nfs_server=nfs.mageedu.com

 

4、使用变量、模板文件安装配置apache:

    apache-template.jpg

    var-apache.jpg

 5、条件测试:

    如果需要根据变量、facts或此前任务的执行结果来做为某task执行与否的前提时要用到条件测试。

    when语句

在task后添加when子句即可使用条件测试;when语句支持Jinja2表达式语法。例如:

tasks:
  – name: "shutdown Debian flavored systems"
    command: /sbin/shutdown -h now
    when: ansible_os_family == "Debian"

when语句中还可以使用Jinja2的大多“filter”,例如要忽略此前某语句的错误并基于其结果(failed或者sucess)运行后面指定的语句,可使用类似如下形式:

tasks:
  – command: /bin/false
    register: result
    ignore_errors: True
  – command: /bin/something
    when: result|failed
  – command: /bin/something_else
    when: result|success
  – command: /bin/still/something_else
    when: result|skipped

此外,when语句中还可以使用facts或playbook中定义的变量。

6、迭代:

        当有需要重复性执行的任务时,可以使用迭代机制。其使用格式为将需要迭代的内容定义为item变量引用,并通过with_items语句来指明迭代的元素列表即可。例如:

调用:item
定义循环列表:whit_item
 – apache
 – php
 – mysql-server
注意:whit_items中的列表值也可以是字典,但引用是要使用item_KEY
 – {name: apache,conf: confffiles/httpd.conf}
 – {name: php,conf:conffiles/php.ini}
 – {name: mysql-servce,conf/conffiles/my.cnf}
 
– name: add several users
  user: name={{ item }} state=present groups=wheel
  with_items:
     – testuser1
     – testuser2

上面语句的功能等同于下面的语句:

– name: add user testuser1
  user: name=testuser1 state=present groups=wheel
– name: add user testuser2
  user: name=testuser2 state=present groups=wheel

事实上,with_items中可以使用元素还可为hashes,例如:

– name: add several users
  user: name={{ item.name }} state=present groups={{ item.groups }}
  with_items:
    – { name: 'testuser1', groups: 'wheel' }
    – { name: 'testuser2', groups: 'root' }

ansible的循环机制还有更多的高级功能,具体请参见官方文档(http://docs.ansible.com/playbooks_loops.html)。

 

7、tags:

        tags用于让用户选择运行或路过playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断。

在playbook可以为某个或默写任务定义一个“标签”,在执行此playbook时,通过为ansible-playbook命令,使用–tags选项能实现仅运行指定的tasks而非所有:
 [root@master ansible]# vim targ.yml
– hosts: webserver
  remote_user: root
  vars:
  – package: httpd
  – service: httpd
  tasks:
  – name: install httpd package
    yum: name={{ package }} state=latest
  – name: install configuration file for httpd
    template: src=/etc/ansible/templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
    tags:
    – conf
    notify:
        – restart httpd
  – name: start httpd service
    service: enabled=true name={{ service }} state=started
  handlers:
  – name: restart httpd
    service: name=httpd state=restarted
~                                       
ansible-playbook targ.yml –tags="conf"

特殊tags:always 无论无可都运行

8、roles:

ansilbe自1.2版本引入的新特性,用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。
要使用roles只需要在playbook中使用include指令即可。简单来讲,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,
并可以便捷地include它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中。

 

 创建role的步骤:

 (1) 创建以roles命名的目录;
 (2) 在roles目录中分别创建以各角色名称命名的目录,如webservers等;
 (3) 在每个角色命名的目录中分别创建files、handlers、meta、tasks、templates和vars目录;用不到的目录可以创建为空目录,也可以不创建;
 (4) 在playbook文件中,调用各角色;

8.2 role内各目录中可用的文件

 tasks目录:至少应该包含一个名为main.yml的文件,其定义了此角色的任务列表;此文件可以使用include包含其它的位于此目录中的task文件;
 files目录:存放由copy或script等模块调用的文件;
 templates目录:template模块会自动在此目录中寻找Jinja2模板文件;
 handlers目录:此目录中应当包含一个main.yml文件,用于定义此角色用到的各handler;在handler中使用include包含的其它的handler文件也应该位于此目录中;
 vars目录:应当包含一个main.yml文件,用于定义此角色用到的变量;
 meta目录:应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系;ansible 1.3及其以后的版本才支持;
 default目录:为当前角色设定默认变量时使用此目录;应当包含一个main.yml文件;

 

9、使用roles角色分离task、files、handlers文件

    a、创建roles目录:

                            mkdir -pv /etc/ansible/ansible_playbooks/roles/websrvs{tasks,files,templates,meta,handlers,vars}

    b、提供配置文件:(也可以使用模板文件)

                           cp /etc/httpd/conf/httpd.conf  /etc/ansible/ansible_playbooks/roles/websrvs/files

            8080.jpg

    c、编辑task任务文件格式为main.yml

            roles-task.jpg

    d、编辑handlers通知文件格式为main.yml

           handler.jpg

   e、编辑站点site.yml文件调用roles角色的websrvs

           roles-site.png

    f、基于roles角色运行site.yml

          roles-site1.png

  g、测试客户端:

        start-httpd-roles.png

 

 

                                                                                                                                                    感谢马哥,每天进步一点点! 

原创文章,作者:n18-jude,如若转载,请注明出处:http://www.178linux.com/14869

(0)
n18-juden18-jude
上一篇 2016-04-18
下一篇 2016-04-19

相关推荐

  • Flex Ant自动构建

    1.  Flex SDK Ant        Flex开发者会遇到很多,比如自动构建,在一个有着N多模块,N处源码,构建过程复杂的Flex项目开发中,依赖人力手工构建项目非常不现实(机械重复且枯燥无味的过程,相信哪位开发人员都会避之唯恐不及,而且对于人力是非常大的浪费),而通过使用Ant,我们可以将这些工作…

    Linux干货 2016-03-22
  • 马哥教育网络班20期第2周课程练习

    答: 1、 cp,mv,rm,cat(tac,more,less,tail),touch 其中常用的有: cp(复制):                   -i:交互式              -…

    Linux干货 2016-06-23
  • Linux运维学习历程-第一天-基础知识

    什么是Linux   Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。 为什么学Linux…

    Linux干货 2016-08-03
  • M20-1 8月5日 文本查看工具以及文本处理工

    一、文本查看工具:  cat,tac,rev cat用法:cat [option]..[FILE]..   cat选项:    -E:显示行结束符$    -n:对显示出的每一行进行编号    -A:显示所有控制符    -b:非空行编号   &nb…

    Linux干货 2016-08-08
  • Linux系统发展史

    引言:     Linux是一类Unix计算机操作系统的统称。Linux操作系统的内核的名字也是“Linux”。Linux操作系统也是自由软件和开放源代码发展中最著名的例子。严格来讲,Linux这个词本身只表示Linux内核,但在实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU 工程各种工具…

    Linux干货 2016-10-19
  • 你的数据根本不够大,别老扯什么Hadoop了

    本文原名“Don’t use Hadoop when your data isn’t that big ”,出自有着多年从业经验的数据科学家Chris Stucchio,纽约大学柯朗研究所博士后,搞过高频交易平台,当过创业公司的CTO,更习惯称自己为统计学者。对了,他现在自己创业,提供数据分析、推荐优化咨询服务,他的邮件是:stucchio@gmail.co…

    Linux干货 2015-04-04

评论列表(1条)

  • 517766237
    517766237 2016-04-21 11:18

    写的很详细,学习