什么是YAML?

  YAML是一种标记语言。适合用来表达层次结构式的数据结构。

  YAML的基本组件:清单(短杠——空白字符)和散列表(短杠+空白字符分隔key:value对)。

Playbook的核心元素:

  hosts:主机

  tasks:任务列表

  variables

  templates:包含了末班语法的文本文件

  handlers:由特定条件出发的任务。

  roles:

  Playbook的基础组件:

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

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

      sudo_user:有必要的情况下切换到特权级用户来

    tasks:任务列表

      模块,模块参数;

      格式:

        (1)action:module arguments

        (2)module:arguments

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

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

      (2)任务可以通过”tags“打标签,而后在ansible-playbook命令上使用-t指定进行调用。就是说只执行指定标签的任务。
运行playbook的方式:

  (1)测试:
    ansible-playbook --check
      只检测可能会发生的改变,但不真正执行操作;
    ansible-playbook --list-hosts
      列出运行任务的主机
  (2)运行
handlers:
  任务,在特定条件下触发;
  接收到其它任务的通知时被触发;
  notify: HANDLER TASK NAME
variables:向脚本传递参数法。
   (1)facts:可直接调用;
    注意:可使用setup模块直接获取目标主机的facters;
      常用命令格式:ansible IP -m setup | less
  (2)用户ansible-playbook命令的命令行中的自定义变量:
      (a)ansible-playbook命令的命令行中的
        -e VARS, --extra-vars=VARS
      变量引用:{{ vairable }}
      
      (b)在playbook中定义变量的方法:
        vars:
        - var1: value1
        - var2: value2
  (3)通过roles传递变量
  (4)Host Inventory
    (a)用户自定义变量
      (i)向不同的主机传递不同的变量;(比如下面的给httpd添加端口的例子)
        IP /HOSTNAME variable=value var2=value2
      (ii)向组中的主机传递相同的变量;
        [groupname:vars]
        variable=value
    (b)inventory参数
      用于定义ansible远程连接目标主机时使用的参数,而非传递给playbook的变量;
        ansible_ssh_host
        ansible_ssh_port
        ansible_ssh_user
        ansible_ssh_pass
        ansible_sudo_pass
  安装多个包的写法:
    
ansible提供的模板:python-jinja2  
    是一个模板引擎。文本文件,嵌套有脚本(使用模板编程语言编写)
    jinja2:

        

    条件测试

      when语句:在task中使用,jinja2的语法格式,示例:

          

             ansible会去判断符合条件的才会去运行。

    循环或迭代:需要重复执行的任务;

          对迭代项的引用,固定变量名为”item“

         而后,要在task中使用with_items给定要迭代的元素列表;
            列表方法:
              字符串
              字典
      比如:

        或者是一个字典:

          

角色(roles):
角色集合:
  roles/
  mysql/
  httpd/
  nginx/
  memcached/ 每个角色,以特定的层级目录结构进行组织:
  mysql/
    files/ :存放由copy或script模块等调用的文件;
     templates/:template模块查找所需要模板文件的目录;
     tasks/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含;
     handlers/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含;
     vars/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含;
     meta/:至少应该包含一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要在此文件中通过include进行包含;
     default/:设定默认变量时使用此目录中的main.yml文件; 在playbook调用角色方法1:
  - hosts: websrvs
     remote_user: root
     roles:
    - mysql
     - memcached
     - nginx 在playbook调用角色方法2:传递变量给角色
- hosts:
  remote_user:
  roles:
  - { role: nginx, username: nginx }
  键role用于指定角色名称;后续的k/v用于传递变量给角色; 还可以基于条件测试实现角色调用;
roles:
  - { role: nginx, when: "ansible_distribution_major_version == '7' " }

ansible的配置文件两个需要注意的:

1、forks

  表示同时并发多少台主机执行任务,一般会修改的比此值要大一些。使其能够对更多的主机执行任务。

2、default_module

  ansible的默认运行模块是  command,即-m command

一、案例演示:

  1、首先是编一个YAML文件,将要执行的操作写在里面

- hosts: all
remote_user: root
tasks:
- name: install redis
yum: name=redis state=latest- name: start redis
service: name=redis state=started

  说明:一个tasks里面定义多个执行的任务列表,执行顺序是从上向下执行。”notify“表示一旦修改了配置文件,就触发动作重启redis。可以看出来notify一般和handlers联合使用。

  2、先检查一下语法看看:

    

  3、运行一下试试

    

    看到最后的状态就表示我们执行成功了。

  4、到节点上查看一下端口

    

    6379端口确实已经起来了。

  5、针对诸多的redis服务,如果我们想配置一下redis,那么一台台的查看是很麻烦的,因此我们可以将redis的配置文件放在中控机上,然后修改完成后再上传至节点上并进行修改。

    但是这里有个需要注意的是,redis修改完配置文件后需要重启服务才会生效,因此我们需要定义一个触发器,当新的配置文件上传至节点时,自动触发重启redis的操作。

  6、先从远程节点复制一份配置文件到中控机,以便进行修改

  7、我们随便修改一下redis.conf的某个参数的值。然后需要修改YAML文件的内容,主要是配置修改redis.conf文件自动触发重启redis操作。

- hosts: all
remote_user: root
tasks:
- name: install redis
yum: name=redis state=latest
- name: copy config file
copy: src=/root/ansible-playbook/redis.conf dest=/etc/redis.conf owner=redis
notify: restart redis
- name: start redis
service: name=redis state=started
handlers:
- name: restart redis
service: name=redis state=restarted

  8、检查一下语法

    

  9、执行以下:

  看的出来我们的执行没有任何问题。

  10、-t参数指定,主要是用来指定标签的用的。比如:

    

    在对应的任务下添加一个标签。可以做到只执行这一个任务就可以了。

  11、执行以下带有标签的哪个任务。

    

    在上面的例子中,表示只执行了第二个name下的操作(复制文件并重启redis),其他的操作,比如install redis不会再执行。

二、案例演示之---------------ansible-playbook传递参数来灵活的执行程序。

  使用-e参数可指定向yaml文件传递参数

  1、编辑yaml文件

- hosts: all
remote_user: root
tasks:
- name: install package {{ pkgname }}
yum: name={{ pkgname }} state=latest

  2、执行以下,主要演示传递参数(我们以干跑为例)

  

  3、下次我们就可以方便的换个程序包来安装,非常灵活

  

三、案例演示之------inventory参数。

  1、首先提前备好环境,也就是在节点上创建好用户chaofeng,编写好ansible-playbook脚本文件

- hosts: all
remote_user: root
tasks:
- name: add user
user: name=chaofeng system=no state=present
- name: set passwd
shell: echo chaofeng | passwd --stdin chaofeng

  2、执行一下:

  

  表示在两个节点上创建用户chaofeng成功了。

  3、修改/etc/ansible/hosts文件。

    

  4、测试一下:

    

    向Inventory传递参数后,ansible则以指定的用户运行程序。不过第一个用户是root,这是因为在dbservers的执行顺序是最后,因此172.16.0.53被重新使用root用户来执行。所以同一台主机之间会因主机组而受影响。

四、案例演示之-----使用模板自定义每个远程节点的配置(远程节点配置不相同)

  1、我们想在redis.conf配置文件中配置每个bind监听为自己的IP,那么要依照不同的节点IP来修改对应的bind值才行。 首先我们要使用setup模块

[root@ELK-chaofeng01 ~]#ansible 172.16.0.52 -m setup | less

   找到如下所示的IP地址是如何获取的。

   

  2、接下来我们在redis的配置文件中取出ipv4的变量。此配置文件我又重新命名为redis.conf.j2

  

  3、接下来编写YAML文件

- hosts: all
remote_user: root
tasks:
- name: install config file
template: src=/root/ansible-playbook/redis.conf.j2 dest=/tmp/redis.conf

  注意:这里我的目的是把redis.conf.j2的内容复制到远程节点的/tmp/redis.conf文件里面,最终的效果在这里面看到。

  4、执行以下此脚本

  

  5、我们到远程节点查看一下/tmp/redis.conf文件。随便一个远程节点即可。

  

  换一个远程节点

  

  成功了,我们在远程主机上配置了模板,然后让其按照不同节点的不同环境来进行配置。这就是模板的用处。

五、再来看一个案例------安装httpd并添加其监听端口。

  1、现在/etc/ansible/hosts文件里面添加变量

    

    两个节点的默认监听端口都有80端口,不过现在想一个节点添加端口8080,另外一个节点添加端口10080,在这里定义要取用的变量

  2、定义YAML脚本文件

- hosts: all
remote_user: root
tasks:
- name: install httpd
yum: name=httpd state=installed
- name: httpd config file
template: src=/root/httpd_port.conf dest=/etc/httpd/conf.d/addport.conf
- name: start httpd
service: name=httpd state=started

  3、在中控机上添加httpd获取变量值的配置文件,这个脚本最终是复制到节点上的/etc/httpd/conf.d目录下,因此要以.conf结尾才行。

   

  4、执行playbook脚本。

[root@ELK-chaofeng01 ~]#ansible-playbook fifth.yaml 

PLAY [all] ************************************************************************************************

TASK [Gathering Facts] ************************************************************************************
ok: [172.16.0.53]
ok: [172.16.0.52] TASK [install httpd] **************************************************************************************
changed: [172.16.0.53]
changed: [172.16.0.52] TASK [httpd config file] **********************************************************************************
changed: [172.16.0.53]
changed: [172.16.0.52] TASK [start httpd] ****************************************************************************************
changed: [172.16.0.52]
changed: [172.16.0.53] PLAY RECAP ************************************************************************************************
172.16.0.52 : ok=4 changed=3 unreachable=0 failed=0
172.16.0.53 : ok=4 changed=3 unreachable=0 failed=0

  5、去两个节点上查看下状况:

    第一个节点:

    第二个节点:

  成功,符合我们的需求。

六、Ansible-playbook之角色roles案例演示

  1、首先是创建角色需要的环境目录

[root@ELK-chaofeng01 ~]#mkdir -pv /etc/ansible/roles
[root@ELK-chaofeng01 roles]#mkdir -pv nginx1/{files,templates,tasks,vars,handlers,meta,default}
mkdir: created directory ‘nginx1’
mkdir: created directory ‘nginx1/files’
mkdir: created directory ‘nginx1/templates’
mkdir: created directory ‘nginx1/tasks’
mkdir: created directory ‘nginx1/vars’
mkdir: created directory ‘nginx1/handlers’
mkdir: created directory ‘nginx1/meta’
mkdir: created directory ‘nginx1/default’

  2、接下来需要创建基本的nginx.yml文件,这个是负责调用roles文件的

    

  3、接下来我们就开始准备环境配置文件了。首先是

  4、接下来依次创建好各个需要的目录和文件。先来创建基于模板虚拟主机配置文件

  5、既然修改了配置文件后需要重启,那么我们需要定义触发器操作

  6、接下来是创建站点目录

  因为我们已经在主任务tasks文件中有创建站点目录的操作了,因此我们这里只需要定义创建什么目录即可。

  7、复制html文件至站点

  

  要复制的普通文本文件则是放在files目录下。

  8、部署完成后,我们就可以执行了。

[root@ELK-chaofeng01 ~]#ansible-playbook nginx1.yaml

PLAY [all] ****************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************
ok: [172.16.0.53]
ok: [172.16.0.52] TASK [nginx1 : install nginx] *********************************************************************************
changed: [172.16.0.53]
changed: [172.16.0.52] TASK [nginx1 : config vhost1] *********************************************************************************
ok: [172.16.0.52]
changed: [172.16.0.53] TASK [nginx1 : install site directory] ************************************************************************
ok: [172.16.0.53]
ok: [172.16.0.52] TASK [nginx1 : install index html] ****************************************************************************
ok: [172.16.0.53]
ok: [172.16.0.52] TASK [nginx1 : start nginx] ***********************************************************************************
changed: [172.16.0.52]
changed: [172.16.0.53] RUNNING HANDLER [nginx1 : restart nginx] **********************************************************************
ok: [172.16.0.53] PLAY RECAP ****************************************************************************************************
172.16.0.52 : ok=6 changed=2 unreachable=0 failed=0
172.16.0.53 : ok=7 changed=3 unreachable=0 failed=0

  这样子就完成了。

总结:一个roles角色就是就是在/etc/ansible/roles目录下创建一个主任务即可,比如我们这里的主任务是nginx1,也就是要安装nginx服务器。那么在nginx1目录下我们需要定义tasks、files、vars、handlers等环境依赖需要的目录。所以说一个roles就是把一个大的任务通过分层来实现安装并配置。在上面的例子中,我们还需要定义tags功能,可能有时候只是需要执行某一个步骤即可。

七、基于ansible的LNMT环境搭建。

  我们这里是使用172.16.0.51作为ansible的中控机,172.16.0.52作为nginx的反向代理服务器同时还是负载均衡器,172.16.0.53是运行tomcat程序作为web服务器提供服务。不过只有一台web服务器,我们依然使用负载均衡器来演示效果。

  1、首先是分配几个角色,分别是nginx(反向代理)、tomcat(jsp执行器)、jdk(java运行环境),那么需要我们依次在/etc/ansible/roles目录下创建这几个juese目录。

[root@ELK-chaofeng01 roles]#mkdir -pv nginx/{files,templates,tasks,vars,handlers,meta,default}
[root@ELK-chaofeng01 roles]#mkdir -pv tomcat/{files,templates,tasks,vars,handlers,meta,default}
[root@ELK-chaofeng01 roles]#mkdir -pv jdk/{files,templates,tasks,vars,handlers,meta,default}

  2、接下来写nginx的YAML文件

  

  3、配置nginx负载均衡文件

  

  4、准备handlers自动触发文件

  

  5、nginx服务器配置完成了,那么现在我们需要配置tomcat的主任务tasks文件

  

  6、tomcat配置完成后,开始配置jdk

  

  7、env文件也是需要配置的,设置一下

  

  8、配置tomcat需要的version

  

  9、最后我们需要编辑playbook文件

  

    在/etc/ansible/hosts看看我们是如何定义主机组的

      

      我们就是在这里针对不同的主机进行哪些操作。

  10、执行以下看看效果

[root@ELK-chaofeng01 ~]#ansible-playbook  nginx.2.yml 

PLAY [lb] ****************************************************************************************************

TASK [Gathering Facts] ***************************************************************************************
ok: [172.16.0.52] TASK [nginx : install nginx] *********************************************************************************
ok: [172.16.0.52] TASK [nginx : install conf] **********************************************************************************
ok: [172.16.0.52] TASK [nginx : start nginx] ***********************************************************************************
changed: [172.16.0.52] PLAY [tcsrv] ************************************************************************************************* TASK [Gathering Facts] ***************************************************************************************
ok: [172.16.0.53] TASK [jdk : install openjdk] *********************************************************************************
changed: [172.16.0.53] TASK [jdk : install env file] ********************************************************************************
changed: [172.16.0.53] TASK [tomcat : install package] *****************************************************************************
changed: [172.16.0.53] TASK [tomcat : start tomcat] *********************************************************************************
changed: [172.16.0.53] PLAY RECAP ***************************************************************************************************
172.16.0.52 : ok=4 changed=1 unreachable=0 failed=0
172.16.0.53 : ok=5 changed=4 unreachable=0 failed=0

  完美运行成功。

  11、最后我们在windows上运行一下,不过运行之前记得在172.16.0.52这个nginx反向代理主机上添加映射,如下所示:

    

    还有在windows的hosts文件中定义:

    

    最后在windows系统上的浏览器打开看一下。

        

    完美运行成功。

ansible学习(二)的更多相关文章

  1. ansible 学习与实践

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

  2. ansible学习笔记一

    ansible学习笔记一 参考博客: ansible学习 - 51CTO博客 一.安装 1 .下载epel源 wget -O /etc/yum.repos.d/epel.repo http://mir ...

  3. Ansible学习记录一:Linux下部署

    0.Ansible介绍 Ansible 是一个简单的自动化运维管理工具,可以用来自动化部署应用.配置.编排 task(持续交付.无宕机更新等),采用 paramiko 协议库(fabric 也使用这个 ...

  4. Ansible学习分享(基本)

    背景:Teamleader提到一款好用的自动化配置管理工具,于是前去学习实践,有了下面分享. 纲要 一.Ansible简介 二.Ansible准备 2.1 Ansible安装 2.2 设置SSH公钥验 ...

  5. emberjs学习二(ember-data和localstorage_adapter)

    emberjs学习二(ember-data和localstorage_adapter) 准备工作 首先我们加入ember-data和ember-localstorage-adapter两个依赖项,使用 ...

  6. ReactJS入门学习二

    ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...

  7. TweenMax动画库学习(二)

    目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            Tw ...

  8. Hbase深入学习(二) 安装hbase

    Hbase深入学习(二) 安装hbase This guidedescribes setup of a standalone hbase instance that uses the local fi ...

  9. Struts2框架学习(二) Action

    Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器 ...

  10. Python学习二:词典基础详解

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...

随机推荐

  1. 利用U盘安装win2008r2系统的步骤

    我们在公司或者家里,经常要安装各种系统,最近公司需要重新安装win2008r2系统.折腾了一天的时间,终于把系统装好了.将安装的步骤记录下来,方便大家查看,自己也做个记录. 1 准备win2008r2 ...

  2. Centos 7 .Net core后台守护进程Supervisor配置

    环境: Centos 7 已安装.Net core 2.0.0  .Net core 1.1.2 1.Supervisor安装 yum 安装 yum install supervisor (阿里云验证 ...

  3. redis 系列22 复制Replication (下)

    一. 复制环境准备 1.1 主库环境(172.168.18.201) 环境 说明 操作系统版本 CentOS  7.4.1708  IP地址 172.168.18.201 网关Gateway 172. ...

  4. 2016年,总结篇 续 如何从 JQ 转到 VueJS 开发(一)

    接着 2016 年的总结,我们来看看 2016年 国内最火且没有之一的前端MVVM 框架 VueJs 虽然 到写文章的这个时间点,VueJs已经发布了 2.1.x 了, 但是对于很多 Vuejs 的初 ...

  5. cmake安装配置及入门指南

    前言 今天,从github下载代码学习,让我用cmake编译,纳尼?make我知道,cmake是啥鬼?天啊,无知很可怕!赶紧mark一波,虽然很耽误学习进度,但感觉还是要get一波! 一.安装准备 感 ...

  6. Python:正则表达式 re 模块

    正则是处理字符串最常用的方法,我们编码中到处可见正则的身影. 正则大同小异,python 中的正则跟其他语言相比略有差异: 1.替换字符串时,替换的字符串可以是一个函数 2.split 函数可以指定分 ...

  7. leetcode — convert-sorted-list-to-binary-search-tree

    import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Source : https://o ...

  8. python常用脚本以及问题跟踪

    1.时间操作//获取当前时间 格式是%Y-%m-%d %H:%M:%ScurrTime = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time. ...

  9. PHP中private、public、protected的区别详解

    先简单粗俗的描述下:public 表示全局,类内部外部子类都可以访问:private表示私有的,只有本类内部可以使用:protected表示受保护的,只有本类或子类或父类中可以访问: 再啰嗦的解释下: ...

  10. 30.C++复习篇

    本章学习内容: 1.const 2.指针const 3.inline内联函数 4.函数重载 5.extern “C” 6.new/delete声明与释放 7.namespace命名空间 8.C++中的 ...