运维自动化之ansible--(playbook模式)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介:

运维自动化之ansible--(playbook模式) 

一、Ansible Playbook简介

    playbook是ansible用于配置,部署,和管理被控节点的剧本。

   通过playbook的详细描述,执行其中的一系列tasks,可以让远端主机达到预期的状态。playbook就像Ansible控制器给被控节点列出的的一系列to-do-list,而被控节点必须要完成。也可以这么理解,playbook 字面意思,即剧本,现实中由演员按照剧本表演,在Ansible中,这次由计算机进行表演,由计算机安装,部署应用,提供对外服务,以及组织计算机处理各种各样的事情。

二、Ansible playbook使用场景

   使用ad-hoc命令可以方便的执行一些简单的任务来解决问题,但是有时一个设施过于复杂,需要大量的操作时候,执行的ad-hoc命令是不适合的,这时最好使用playbook。

   就像执行shell命令与写shell脚本一样,也可以理解为批处理任务,不过playbook有自己的语法格式。

   使用playbook你可以方便的重用这些代码,可以移植到不同的机器上面,像函数一样,最大化的利用代码。在你使用Ansible的过程中,你也会发现,你所处理的大部分操作都是编写playbook。可以把常见的应用都编写成playbook,之后管理服务器会变得十分简单。

三、Ansible playbook格式

    playbook由YMAL语言编写。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822。

    YMAL格式是类似于JSON的文件格式,便于人理解和阅读,同时便于书写。以下为playbook常用到的YMAL格式。

    ①文件的第一行应该以 ”—” (三个连字符,无空格)开始,表明YMAL文件的开始。

    ②在同一行中,#之后的内容表示注释,类似于shell,python和ruby。

     ③YMAL中的列表元素以”-”开头然后紧跟着一个空格,后面为元素内容。就像这样- apple

     ④[ “apple”, “banana”, “orange” ] 同一个列表中的元素应该保持相同的缩进。否则会被当做错误处理。

     ⑤play中hosts,variables,roles,tasks等对象的表示方法都是键值中间以”:”分隔,”:”后面还要增加一个空格。

house:

family: { name: Doe, parents: [John, Jane], children: [Paul, Mark, Simone] }

address: { number: 34, street: Main Street, city: Nowheretown, zipcode: 12345 }

     ⑥剧本以.yml后缀

四、在mysql.yml剧本中,主要由三个部分组成

     ①hosts部分:使用hosts指示使用哪个主机或主机组来运行下面的tasks,每个playbook都必须指定hosts,hosts也可以使用通配符格式。主机或主机组在inventory清单中指定,可以使用系统默认的/etc/ansible/hosts,也可以自己编辑,在运行的时候加上-i选项,指定清单的位置即可。在运行清单文件的时候,-list-hosts选项会显示哪些主机将会参与执行task的过程中。

     ②remote_user:指定远端主机中的哪个用户来登录远端系统,在远端系统执行task的用户,可以任意指定,也可以使用sudo,但是用户必须要有执行相应task的权限。

     ③tasks:指定远端主机将要执行的一系列动作。tasks的核心为ansible的模块,前面已经提到模块的用法。tasks包含name和要执行的模块,name是可选的,只是为了便于用户阅读,不过还是建议加上去,模块是必须的,同时也要给予模块相应的参数。

五、执行有三个步骤:

    1、收集facts

    2、执行tasks

    3、报告结果

示例:安装samba服务并启动

vim /etc/ansible/smb.yml

---

- hosts: web

  remote_user: root

  tasks:

     - name: yum install samba

        yum: name=samba state=latest

     - name: start smb

        service: name=smb state=started

        tags: startsmb  #标记此start smb任务

执行:ansible-playbook smb.yml

blob.png 

六、Playbook的核心元素:

Hosts:主机

Tasks:任务列表

Variables   变量

Templates:包含了模板语法的文本文件;

Handlers:由特定条件触发的任务;

Playbooks配置文件的基础组件:

Hosts:运行指定任务的目标主机;

remoute_user: 在远程主机上执行任务的用户;

sudo_user:sudo权限的用户

tasks:任务列表

1、模块,模块参数格式:

(1) action: module arguments

(2) module: arguments

注意:shell和command模块后面直接跟命令,而非key=value类的参数列表;

(1) 某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers;

(2) 任务可以通过“tags“打标签,而后可在ansible-playbook命令上使用-t指定进行调用;

示例:

vim /etc/ansible/nginx.yml

---

- hosts: web

  remote_user: root

  tasks:

     - name: yum install nginx  #安装nginx

        yum: name=nginx state=latest

     - name:copy nginx.conf   #拷贝配置文件

        copy: src=/etc/nginx/nginx.conf dest=/etc/nginx/nginx.conf backup=yes

        notify: reload     #会触发handlers中名字为reload的任务

        tags: reloadnginx

     - name: start nginx   #启动nginx服务

        service: name=nginx state=started

        tags: startnginx

 handlers:

     - name: reload  #重载配置

      service: name=nginx state=reloaded

执行:ansible-playbook nginx.yml -vv

blob.png 

blob.png 

修改配置文件内容之后执行时调用标签ansible-playbook nginx.yml -vv -t reloadnginx,就会跳过安装步骤直接重载配置文件并启动服务

blob.png 

 

2、variables:变量

 (1) facts:可直接调用;

     注意:可使用setup模块直接获取目标主机的facters;

 (2) 用户自定义变量:

    (a) ansible-playbook命令的命令行中的

      -e VARS, --extra-vars=VARS

    (b) 在playbook中定义变量的方法:

vars:

 - var1: value1

 - - var2: value2

(3) 通过roles传递变量;

(4) Host Inventory

  (a) 用户自定义变量

  (i) 向不同的主机传递不同的变量;

   IP/HOSTNAME varaiable=value var2=value2

  (ii) 向组中的主机传递相同的变量;

[groupname:vars]

variable=value

比如:向web组传递变量rpmname=samba

[web]

172.17.251.188

172.17.250.209

[web:vars]

rpmname=samba

示例:使用变量rpmname来代替服务名

vim /etc/ansible/nginx.yml

---

- hosts: web

  remote_user: root

  vars:

     - rpmname: nginx

  tasks:

     - name: yum install {{ rpmname }}  #安装{{ rpmname }}

        yum: name={{ rpmname }} state=latest

     - name: copy {{ rpmname }}.conf   #拷贝配置文件

        copy: src=/etc/{{ rpmname }}/{{ rpmname }}.conf dest=/etc/{{ rpmname }}/{{ rpmname }}.conf backup=yes

        notify: reload     #会触发handlers中名字为reload的任务

        tags: reload{{ rpmname }}

     - name: start {{ rpmname }}   #启动{{ rpmname }}服务

        service: name={{ rpmname }} state=started

        tags: start{{ rpmname }}

  handlers:

     - name: reload  #重载配置

        service: name={{ rpmname }} state=reloaded

运行:ansible-playbook nginx.yml

 

3、模板:模板文件以.j2后缀

示例:

编辑模板配置文件

cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.j2

vim /etc/nginx/nginx.conf.j2

     worker_processes {{ ansible_processor_vcpus }};  #引用内置变量获得cpu颗数

     listen {{ nginxport }};  #自定义变量

编辑剧本:vim /etc/ansible/nginx.yml

---

- hosts: web

  remote_user: root

  vars:

     - rpmname: nginx   

        nginxport: 8888   #定义nginx监听端口为8888

  tasks:

     - name: yum install {{ rpmname }}  #安装{{ rpmname }}

        yum: name={{ rpmname }} state=latest

     - name: copy {{ rpmname }}.conf   #拷贝配置文件

        template: src=/etc/{{ rpmname }}/{{ rpmname }}.conf.j2 dest=/etc/{{ rpmname }}/{{ rpmname }}.conf backup=yes

        notify: reload     #会触发handlers中名字为reload的任务

        tags: reload{{ rpmname }}

     - name: start {{ rpmname }}   #启动{{ rpmname }}服务

        service: name={{ rpmname }} state=started

        tags: start{{ rpmname }}

  handlers:

     - name: reload  #重载配置

        service: name={{ rpmname }} state=reloaded

运行:ansible-playbook nginx.yml -t reloadnginx

查看是否开启端口8888:ansible web -m shell -a 'ss -ntlp|grep "nginx"'

blob.png 


4、循环:迭代,即需要重复执行的任务。

对迭代项的引用,固定变量名为”item“,而后,要在task中使用with_items给定要迭代的元素列表:

比如:vim /etc/ansible/items.yml

---

- hosts: web

  remote_user: root

  tasks:

     - name: install packages  #安装with_items中列出的包

        yum: name={{ item }} state=latest

        with_items:

       - vsftpd

       - php

       - php-mysql

执行:ansible-playbook items.yml 就会安装列表中的包

 

5、Ansible playbook字典:实现一一对应

示例:vim adduser.yml

---

- hosts: web

 remote_user: root

 tasks:

- name: add some groups  #添加一些组

 group: name={{ item }} state=present

 with_items:

   - group11

   - group12

   - group13

- name: add some users #创建用户到对应的组

 user: name={{ item.name }} group={{ item.group }} state=present

 with_items:

   - { name: 'user11', group: 'group11' }  

   - { name: 'user12', group: 'group12' }  

   - { name: 'user13', group: 'group13' }

执行:ansible-playbook adduser.yml 就会创建对应的用户及组

 

6、角色定制:roles

   对于以上所有的方式有个弊端就是无法实现复用假设在同时部署Web、db、ha 时或不同服务器组合不同的应用就需要写多个yml文件。很难实现灵活的调用。

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

 

示例:定制三个角色(nginx、mysql、tomcat)

(1)、在roles目录下生成对应的目录结构

mkdir -pv /etc/ansible/roles/{nginx,mysql,tomcat}/{files,templates,vars,tasks,handlers,meta,default}

blob.png 

(2)、定义tasks/main.yml的配置文件.先将模板文件考到template目录下

cp /etc/nginx/nginx.conf.j2 ./roles/nginx/templates/

vim task/main.yml

- name: cp

 copy: src=/etc/ansible/roles/nginx/files/nginx-1.10.2-1.el7.ngx.x86_64.rpm dest=/tmp/nginx-1.10.2- 1.el7.ngx.x86_64.rpm

- name: install

 yum: name=/tmp/nginx-1.10.2-1.el7.ngx.x86_64.rpm state=latest

- name: conf

 template: src=/etc/ansible/roles/nginx/templates/nginx.conf.j2 dest=/etc/nginx/nginx.conf

 tags: nginxconf

 notify: new conf to reload  #触发名字为new conf to reload的handles执行

- name: start service

 service: name=nginx state=started

(3)、修改变量文件vars/main.yml

    添加变量nginxport: 8080

(4)、定义handlers文件handlers/main.yml

- name: new conf to reload

 service: name=nginx state=reload

(5)、定义/etc/ansible/roles.yml的playbook文件

- hosts: web

 remote_user: root

 roles:

    - nginx

运行剧本:ansible-playbook roles.yml

查看端口:ansible web -m shell -a 'ss -ntlp|grep "nginx"'

blob.png 

    总结:ansible-playbook模式比较易于实现功能以及排错,除非是很简单的业务实现可以使用hoc模式,其他较复杂的场景一般都是playbook模式。

 

 














本文转自lc0108131451CTO博客,原文链接: http://blog.51cto.com/13150617/2048228,如需转载请自行联系原作者

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
运维 Ubuntu 应用服务中间件
自动化运维之路:使用Ansible进行服务器管理
在现代IT基础设施中,自动化运维已成为提高效率和可靠性的关键。本文将引导您通过使用Ansible这一强大的自动化工具来简化日常的服务器管理任务。我们将一起探索如何配置Ansible、编写Playbook以及执行自动化任务,旨在为读者提供一条清晰的路径,从而步入自动化运维的世界。
|
1月前
|
运维 网络安全 Python
自动化运维:使用Ansible实现批量服务器配置
在快速迭代的IT环境中,高效、可靠的服务器管理变得至关重要。本文将介绍如何使用Ansible这一强大的自动化工具,来简化和加速批量服务器配置过程。我们将从基础开始,逐步深入到更复杂的应用场景,确保即使是新手也能跟上节奏。文章将不包含代码示例,而是通过清晰的步骤和逻辑结构,引导读者理解自动化运维的核心概念及其在实际操作中的应用。
|
1月前
|
运维 Ubuntu 网络协议
自动化运维:使用Ansible进行服务器配置管理
在现代IT架构中,自动化运维已成为提升效率、减少人为错误的关键。本文将介绍如何使用Ansible这一强大的自动化工具来简化和标准化服务器的配置管理过程。通过具体的代码示例和操作步骤,我们将展示如何快速部署应用、管理配置以及自动化日常任务,从而确保环境的一致性和可靠性。
|
2月前
|
运维 安全 Ubuntu
自动化运维:使用Ansible进行服务器配置管理
在现代IT基础设施中,自动化运维是确保高效、稳定和安全服务的关键。本文将深入介绍如何使用Ansible这一开源工具来简化服务器配置管理工作,从基础安装到高级应用,我们将一步步展示如何通过Ansible Playbooks实现自动化部署和维护,旨在帮助读者构建更加灵活和可扩展的运维体系。
50 7
|
2月前
|
运维 Ubuntu Linux
自动化运维:使用Ansible简化日常任务
在快节奏的IT世界中,时间就是一切。本文将揭示如何通过Ansible这一强大的自动化工具来节省宝贵的时间,从而提高效率和减少人为错误。我们将深入探讨Ansible的核心概念、安装过程以及如何编写简单的playbook来自动执行常见运维任务。无论你是新手还是有经验的系统管理员,这篇文章都将为你提供实用的知识和技能,让你能够更好地控制你的服务器环境。
|
2月前
|
运维 应用服务中间件 网络安全
自动化运维的新篇章:使用Ansible进行服务器配置管理
【10月更文挑战第34天】在现代IT基础设施的快速迭代中,自动化运维成为提升效率、确保一致性的关键手段。本文将通过介绍Ansible工具的使用,展示如何实现高效的服务器配置管理。从基础安装到高级应用,我们将一步步揭开自动化运维的神秘面纱,让你轻松掌握这一技术,为你的运维工作带来革命性的变化。
|
2月前
|
运维 应用服务中间件 Linux
自动化运维的利器:Ansible在配置管理中的应用
【10月更文挑战第39天】本文旨在通过深入浅出的方式,向读者展示如何利用Ansible这一强大的自动化工具来优化日常的运维工作。我们将从基础概念讲起,逐步深入到实战操作,不仅涵盖Ansible的核心功能,还会分享一些高级技巧和最佳实践。无论你是初学者还是有经验的运维人员,这篇文章都会为你提供有价值的信息,帮助你提升工作效率。
|
2月前
|
运维 监控 安全
自动化运维的利剑:Ansible在现代IT架构中的应用
在数字化浪潮中,企业对IT系统的敏捷性和可靠性要求日益提高。Ansible,一种简单但强大的自动化运维工具,正成为现代IT架构中不可或缺的一部分。它通过声明式编程语言YAM,简化了系统配置、应用部署和任务自动化的过程,显著提升了运维效率和准确性。本文将深入探讨Ansible的核心特性、应用场景以及如何有效整合进现有IT环境,为读者揭示其在自动化运维中的实用价值和未来发展潜力。
|
2月前
|
运维 Devops 应用服务中间件
自动化运维的利剑:Ansible在现代IT架构中的应用
【10月更文挑战第42天】本文旨在揭示自动化运维工具Ansible如何革新现代IT架构,通过简化配置管理和部署流程,提升效率和可靠性。我们将探索Ansible的核心功能、语言特性以及其在DevOps文化中的角色。文章还将展示如何借助Ansible构建模块化和可重用的配置代码,实现快速迭代与部署,并确保系统一致性。通过阅读本文,运维人员将了解如何利用Ansible优化日常任务,加速产品上线速度,同时提高系统的稳健性。
50 5
|
2月前
|
运维 监控 应用服务中间件
自动化运维的利器:Ansible实战应用
【10月更文挑战第41天】在现代IT运维领域,自动化已成为提高效率、减少错误的关键。Ansible作为一种简单而强大的自动化工具,正被越来越多的企业采纳。本文将通过实际案例,展示如何使用Ansible简化日常运维任务,包括配置管理和批量部署等,旨在为读者提供一种清晰、易懂的自动化解决方案。
35 1