• ansible学习(二)


    什么是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系统上的浏览器打开看一下。

            

        完美运行成功。

  • 相关阅读:
    POJ 2528 Mayor's posters 线段树+离散化
    Leveldb之version与version_set详细对比
    rocksdb编译测试的正确姿势
    ycsb使用方法
    memalign vs malloc
    四种监听器(自身类,外部类,内部类,匿名类)
    数据库基础
    哈希索引和Btree索引
    哈希表hashtable
    抽象类和接口
  • 原文地址:https://www.cnblogs.com/FengGeBlog/p/10601799.html
Copyright © 2020-2023  润新知