zoukankan      html  css  js  c++  java
  • 26 playbooke(二)

    template模板

    模板是一个文本文件,可以做为生成文件的模版,并且模板文件中还可嵌套jinja语法。

    jinja2语言

    官方网站:

    http://jinja.pocoo.org/

    https://jinja.palletsprojects.com/en/2.11.x/

    img

    数据类型

    jinja2 语言支持多种数据类型和操作:

    • 字符串:使用单引号或双引号,
    • 数字:整数,浮点数
    • 列表:[item1, item2, ...]
    • 元组:(item1, item2, ...)
    • 字典:{key1:value1, key2:value2, ...}
    • 布尔型:true/false
    • 算术运算:+, -, *, /, //, %, **
    • 比较操作:==, !=, >, >=, <, <=
    • 逻辑运算:and,or,not
    • 流表达式:For,If,When

    template

    template功能:可以根据和参考模块文件,动态生成相类似的配置文件,template文件必须存放于templates目录下,且命名为 .j2 结尾,yaml/yml 文件需和templates目录平级,目录结构如下示例:

     ./
    ├── temnginx.yml
    └── templates
        └── nginx.conf.j2Copy to clipboardErrorCopied
    

    范例:利用template 同步nginx配置文件

    #准备templates/nginx.conf.j2文件
    [root@ansible ~]#vim temnginx.yml
    ---
    - hosts: web
      remote_user: root
      tasks:
        - name: template config to remote hosts
         template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
     [root@ansible ~]#ansible-playbook temnginx.ymlCopy to clipboardErrorCopied
    

    template变更替换

    #修改文件nginx.conf.j2 
    [root@ansible ~]#mkdir templates
    [root@ansible ~]#vim templates/nginx.conf.j2
    ......
    worker_processes {{ ansible_processor_vcpus }};
    ......
    [root@ansible ~]#vim temnginx2.yml
    ---
    - hosts: web
      remote_user: root
      
      tasks:
        - name: install nginx
          yum: name=nginx
        - name: template config to remote hosts
          template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf 
        - name: start service
          service: name=nginx state=started enabled=yes
           
    [root@ansible ~]#ansible-playbook temnginx2.ymlCopy to clipboardErrorCopied
    

    常用的系统参数

    ansible_all_ipv4_addresses:仅显示ipv4的信息
    ansible_devices:仅显示磁盘设备信息
    ansible_distribution:显示是什么系统,例:centos,suse等
    ansible_distribution_version:仅显示系统版本
    ansible_distribution_major_version:显示系统版本号(7)
    ansible_machine:显示系统类型,例:32位,还是64位
    ansible_eth0:仅显示eth0的信息
    ansible_hostname:仅显示主机名
    ansible_kernel:仅显示内核版本
    ansible_lvm:显示lvm相关信息
    ansible_memtotal_mb:显示系统总内存
    ansible_memfree_mb:显示可用系统内存
    ansible_memory_mb:详细显示内存情况
    ansible_swaptotal_mb:显示总的swap内存
    ansible_swapfree_mb:显示swap内存的可用内存
    ansible_mounts:显示系统磁盘挂载情况
    ansible_processor:显示cpu个数(具体显示每个cpu的型号)
    ansible_processor_vcpus:显示cpu个数(只显示总的个数)
    ansible_python_version:显示python版本
    

    template算术运算

    [root@ansible ansible]#vim templates/nginx.conf.j2
    worker_processes {{ ansible_processor_vcpus**3 }};
    [root@ansible ansible]#cat templnginx.yml
    ---
    - hosts: websrvs
      remote_user: root
      tasks:
        - name: install nginx
          yum: name=nginx
        - name: template config to remote hosts
          template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
          notify: restart nginx
        - name: start service
          service: name=nginx state=started enabled=yes
     handlers:
        - name: restart nginx
          service: name=nginx state=restarted
    [root@ansible ~]#-playbook templnginx.yml --limit 10.0.0.8Copy to clipboardErrorCopied
    

    template中使用流程控制for和if

    template中也可以使用流程控制 for 循环和 if 条件判断,实现动态生成文件功能

    #temlnginx2.yml
    ---
    - hosts: websrvs
     remote_user: root
     vars:
       nginx_vhosts:
         - 81
         - 82
         - 83
     tasks:
       - name: template config
         template: src=nginx.conf2.j2 dest=/data/nginx.conf
    #templates/nginx.conf2.j2
    {% for vhost in nginx_vhosts %}
    server {
       listen {{ vhost }}
    }
    {% endfor %}
    ansible-playbook -C templnginx2.yml --limit 192.168.15.8
    #生成的结果:
    server {
       listen 81   
    }
    server {
       listen 82   
    }
    server {
       listen 83   
    }
    
    
    
    
    #templnginx4.yml
    - hosts: websrvs
     remote_user: root
     vars:
       nginx_vhosts:
         - listen: 8080
           server_name: "web1.oldboy.com"
           root: "/var/www/nginx/web1/"
         - listen: 8081
           server_name: "web2.oldboy.com"
           root: "/var/www/nginx/web2/"
         - {listen: 8082, server_name: "web3.oldboy.com", root: 
    "/var/www/nginx/web3/"}
     tasks:
       - name: template config 
         template: src=nginx.conf4.j2 dest=/data/nginx4.conf
          
       
    # templates/nginx.conf4.j2
    {% for vhost in nginx_vhosts %}
    server {
       listen {{ vhost.listen }}
       server_name {{ vhost.server_name }}
       root {{ vhost.root }}  
    }{% endfor %} 
    
    [root@ansible ~]#ansible-playbook templnginx4.yml --limit 10.0.0.8
    #生成结果:
    server {
       listen 8080
       server_name web1.oldboy.com
       root /var/www/nginx/web1/  
    }
    server {
       listen 8081
       server_name web2.oldboy.com
       root /var/www/nginx/web2/  
    }
    server {
       listen 8082
       server_name web3.oldboy.com
       root /var/www/nginx/web3/  
    }Copy to clipboardErrorCopied
    

    playbook使用when

    when语句,可以实现条件测试。如果需要根据变量、facts或此前任务的执行结果来做为某task执行与否的前提时要用到条件测试,通过在task后添加when子句即可使用条件测试,jinja2的语法格式。

    tasks:
      - name: "shut down CentOS 6 and Debian 7 systems"
       command: /sbin/shutdown -t now
       when: (ansible_facts['distribution'] == "CentOS" and ansible_facts['distribution_major_version'] == "6") or (ansible_facts['distribution'] == "Debian" and ansible_facts['distribution_major_version'] == "7")Copy to clipboardErrorCopied
    

    playbook使用迭代with_items(loop)

    迭代:当有需要重复性执行的任务时,可以使用迭代机制对迭代项的引用,固定内置变量名为"item",要在task中使用with_items给定要迭代的元素列表

    注意: ansible2.5版本后,可以用loop代替with_items

    ---
    - hosts: websrvs
     remote_user: root
      
     tasks:
        - name: add several users
         user: name={{ item }} state=present groups=wheel
         with_items:
            - testuser1
            - testuser2
            - testuser3
            
    #上面语句的功能等同于下面的语句
        - name: add several users
          user: name=testuser1 state=present groups=wheel
        - name: add several users
          user: name=testuser2 state=present groups=wheel
        - name: add several users
          user: name=testuser3 state=present groups=wheel
    
    
    
    ---
    #remove mariadb server
    - hosts: 172.16.1.7
      remote_user: root
      tasks:
        - name: stop service
          shell: /etc/init.d/mysqld stop
        - name: delete files and dir
          file: path={{item}} state=absent
          with_items:
            - /usr/local/mysql
            - /usr/local/mariadb-10.2.27-linux-x86_64
            - /etc/init.d/mysqld
            - /etc/profile.d/mysql.sh
            - /etc/my.cnf
            - /data/mysql
        - name: delete user
          user: name=mysql state=absent remove=yesCopy to clipboardErrorCopied
    

    迭代嵌套子变量:在迭代中,还可以嵌套子变量,关联多个变量在一起使用

    ---
    - hosts: websrvs
      remote_user: root
      
      tasks:
        - name: add some groups
          group: name={{ item }} state=present
          with_items:
            - nginx
            - mysql
            - apache
        - name: add some users
          user: name={{ item.name }} group={{ item.group }} state=present
          with_items:
            - { name: 'nginx', group: 'nginx' }
            - { name: 'mysql', group: 'mysql' }
            - { name: 'apache', group: 'apache' }Copy to clipboardErrorCopied
    

    管理节点过多导致的超时问题解决方法

    默认情况下,Ansible将尝试并行管理playbook中所有的机器。对于滚动更新用例,可以使用serial关键字定义Ansible一次应管理多少主机,还可以将serial关键字指定为百分比,表示每次并行执行的主机数占总数的比例

    #vim test_serial.yml
    ---
    - hosts: all
      serial: 2  #每次只同时处理2个主机,将所有task执行完成后,再选下2个主机再执行所有task,直至所有主机
      gather_facts: False
      tasks:
        - name: task one
      comand: hostname
        - name: task two
          command: hostname
    
    
    # 案例2:
    - name: test serail
      hosts: all
      serial: "20%"   #每次只同时处理20%的主机
    
  • 相关阅读:
    App集成支付宝
    关于Objective-c和Java下DES加密保持一致的方式
    Android开发规范
    android 屏幕适配问题
    Android AES加密算法及其实现
    linux文件系统调用(1)---mount
    Java(Android)解析KML文件
    【Akka】在并发程序中使用Future
    函数指针问题,求解答
    android旋转动画的两种实现方式
  • 原文地址:https://www.cnblogs.com/zhaokunhao/p/14856438.html
Copyright © 2011-2022 走看看