zoukankan      html  css  js  c++  java
  • Ansible

    1,templates 使用规则

    • 文本文件,嵌套有脚本(使用模板编程语言编写)
    • Jinja2 语言,使用字面量,有下面形式
      • 字符串:使用单引号或双引号
      • 数字:整数,浮点数
      • 列表:[item1,item2,...]
      • 元组:(item1,item2,....)
      • 字典:{key1:value1,key2:value2,...}
      • 布尔型:true/false
    • 算术运算:+ , - , * , / , // , % , **
    • 比较操作:==, != , > , >= , <
    • 逻辑运算:and, or, not
    • 流表达式:For if When

    2, when

    • 条件测试:如果需要根据变量、facts 或此前任务的执行结果来做为某 task 执行与否的前提时要用到条件测试,通过 when 语句实现,在 task 中使用,jinja2 的语法格式
    • when 语句
    • 在 task 后添加 when 子句即可使用条件测试;when 语句支持 jinja2 表达式语法
    • 示例
    - name: "shutdown RedHat flavored systems"
      command: /sbin/shutdown -h now
      when: ansible_os_family == "RedHat"
    
    • 示例2:如果操作系统版本为 centos7 或 6,copy 对应文件
    ---
    - hosts: websrvs
      remote_user: root
    
      tasks:
        - name: add user nginx
          user: name=nginx state=present group=nginx
        - name: Install Nginx
          yum: name=nginx state=present
        - name: copy conf file to centos7
          template: src=nginx.conf.c7.j2 dest=/etc/nginx/nginx.conf
          when: ansible_distribution_major_version == "7"
        - name: copy conf file to centos6
          template: src=nginx.conf.c6.j2 dest=/etc/nginx/nginx.conf
          when: ansible_distribution_major_version == "6"
        - name: start  Nginx
          service: name=nginx state=started enabled=ture
    

    3, 迭代:with_items

    • 迭代:当有需要重复执行的任务时,可以使用迭代机制

      • 对迭代项的引用,固定变量名为 item
      • 要在 task 中使用 with_items 给定要迭代的元素列表
      • 列表格式:
        • 字符串
        • 字典
    • 示例

    ---
    - hosts: websrvs
      remote_user: root
    
      tasks:
        - name: create some files
          file: name=/tmp/{{ item }}  state=touch
          with_items:
            - file1
            - file2
            - file3
    
    • 迭代嵌套子变量
    ---
    - hosts: websrvs
      remote_user: root
      tasks:
        - name: add some groups
          group: name={{ item }} state=present
          with_items:
            - group1
            - group2
            - group3
        - name: add some users
          user: name={{ item.name }} group={{ item.group }} state=present
          with_items:
            - { name: 'user1', group: 'group1' }  
            - { name: 'user2', group: 'group2' }  
            - { name: 'user3', group: 'group3' }  
    

    4,Playbook 中 template for if

    {% for vhost in nginx_vhosts %}
    server{
        listen {{ vhost.listen | default('80 default_server') }};
    
        {% if vhost.server_name is defined %}
        server_name {{ vhost.server_name }};
        {% endif %};
    
        {% if vhost.root is defined %}
        root {{ vhost.root }};
        {% endif %}
    }
    {% endfor %}
    

    4.1 for 示例

    • 列表方式
    // testfor1.yml
    ---
    - hosts: websrvs
      remote_user: root
      vars:
        ports:
          - 81
          - 82
      tasks:
        - name: copy conf
          template: src=for1.conf.j2 dest=/tmp/for1.conf
    
    // templates/for1.conf.j2
    {% for port in ports %}
    server {
    	listen {{ port }}
    }
    {% endfor %}
    
    // 执行结果
    server {
    	listen 81
    }
    server {
    	listen 82
    }
    
    • 字典方式
    // testfor2.yml
    ---
    - hosts: websrvs
      remote_user: root
      vars:
        ports:
          - listen_port: 83
          - listen_port: 84
    
      tasks:
        - name: copy conf
          template: src=for1.conf.j2 dest=/tmp/for2.conf
    
    // templates/for2.conf.j2
    {% for port in ports %}
    server {
    	listen {{ port.listen_port }}
    }
    {% endfor %}
    
    // 执行结果
    server {
    	listen 83
    }
    server {
    	listen 84
    }
    
    • 多个键值对
    // testfor3.yml
    ---
    - hosts: websrvs
      remote_user: root
      vars:
        ports:
          - web1:
            port: 85
            name: web1.test.com
            rootdir: /data/website1
          - web2:
            port: 86
            name: web2.test.com
            rootdir: /data/website2
    
      tasks:
        - name: copy conf
          template: src=for3.conf.j2 dest=/tmp/for3.conf
    
    // templates/for3.conf.j2
    {% for i in ports %}
    server {
    	listen {{ i.port }}
    	servername: {{ i.name }}
    	documentroot: {{ i.rootdir }}
    }
    {% endfor %}
    
    // 执行结果
    server {
    	listen 85
    	servername: web1.test.com
    	documentroot: /data/website1
    }
    server {
    	listen 86
    	servername: web2.test.com
    	documentroot: /data/website2
    }
    

    4.1 if 示例

    • for 嵌套 if
    // testfor4.yml
    ---
    - hosts: websrvs
      remote_user: root
      vars:
        ports:
          - web1:
            port: 85
            name: web1.test.com
            rootdir: /data/website1
          - web2:
            port: 86
           # name: web2.test.com
            rootdir: /data/website2
    
      tasks:
        - name: copy conf
          template: src=for4.conf.j2 dest=/tmp/for4.conf
    
    // templates/for4.conf.j2
    {% for i in ports %}
    server {
            listen {{ i.port }}
            {% if i.name is defined %}
            servername: {{ i.name }}
            {% endif %}
            documentroot: {{ i.rootdir }}
    }
    {% endfor %}
    
    // 执行结果
    server {
    	listen 85
    		servername: web1.test.com
    		documentroot: /data/website1
    }
    server {
    	listen 86
    		documentroot: /data/website2
    }
    
  • 相关阅读:
    C语言保留字
    N的阶乘末尾有多少个零?
    控制台初级玩法
    数据结构笔记#二分法查找
    数据结构应用实例#栈&单链表#简易计算器
    数据结构应用实例#栈#迷宫寻路
    数据结构笔记#栈
    #2028 Lowest Common Multiple Plus
    数据结构笔记#单链表
    #2018 母牛的故事
  • 原文地址:https://www.cnblogs.com/xiaoqshuo/p/10482223.html
Copyright © 2011-2022 走看看