ansible笔记第四章(jinj2的使用与role的使用)

  一、jinj2概述

    1.jinja2模板与Ansible有什么关系
        Ansible通常会使用Jlinja2模板来修改被管理主机的配置文件。例如给10台远程主机都装上httpd服务,但是要求每个服务器的端口不一样,如何解决?

    2.Ansible如何使用inja2模板

      使用ansible的jinja2模板,也就是template模块。该模块和copy模块一样,都是将文件复制到远端主机上去,但是区别在于template模块可以获取要复制的文件中变量的值,而copy则是原封不动的把文件内容复制过去。比如:针对不同的主机定义不同的变量,template会在将配置文件分发出去前读取变量到jinja2模板,然后分发到不同的被管理主机上。
    Ansible使用inja注意事项
    Ansible允许jinja2模板中使用条件判断和循环,但是jinja判断循环语法不允许在playbook中使用。注意:不是每个管理员都需要这个特性,但是有些时慎inja2模板能大大提高效率。

 

 

  二、基本使用

   1.循环与判断

          {% if EXPR %}...{% elif EXPR %}...{% endif%} 作为条件判断

        --------------------------------------判断语句
          {% if ansible_fqdn == "web01" %}
            echo "123"
          {% elif ansible_fqdn == "web02" %}
            echo "456"
          {% else %}
            echo "789"
          {% endif %}

        --------------------------------------循环语句
          {% for i in EXPR %}...{% endfor%} 作为循环表达式
          {% for i in range(1,10) %}
            server 172.16.1.{{i}};
          {% endfor %}

        {# COMMENT #} 表示注释

   2.jinja2 渲染 nginx_proxy配置文件   keepalived配置文件

      -------------------nginx_proxy配置文件

 

        [root@m01 project1]# cat kod_proxy.conf.j2
          upstream {{ server_name }} {
            {% for i in range(1,10) %}
              server 172.16.1.{{i}}:{{http_port}} weight=2;
            {% endfor %}
              }

 

          server {
            listen {{ http_port }};
            server_name {{ server_name }};
            location / {
              proxy_pass http://{{ server_name }};
              include proxy_params;
              }
            }

 

      -------------------keepalived配置文件

        [root@m01 project1]# cat keepalived.conf.j2
          global_defs {
            router_id {{ ansible_fqdn }}
          }

 

          vrrp_instance VI_1 {
          {% if ansible_fqdn == "lb01" %}
            state MASTER
            priority 150
          {% elif ansible_fqdn == "lb02" %}
            state BACKUP
            priority 100
          {% endif %}
        ###------------------相同点
          interface eth0
          virtual_router_id 50
          advert_int 1
          authentication {
            auth_type PASS
            auth_pass 1111
          }
          virtual_ipaddress {
            10.0.0.3
          }
        }

 

      ------------------------------判断变量是否有值
        - hosts: webservers
        gather_facts: no
        vars:
          PORT: 13306
        tasks:
          - name: Copy MySQL Configure
          template: src=./my.cnf.j2 dest=/tmp/my.cnf
    ---------------------------------------------
      [root@m01 project1]# cat my.cnf.j2
        {% if PORT %}
          bind-address=0.0.0.0:{{ PORT }}
        {% else %}
          bind-address=0.0.0.0:3306
        {% endif %}

 

 三、role的基本使用

    1.Ansible Roles目录结构       

       2.Ansible Roles依赖关系    

        

        3.roles的基本操作
        Roles基于一个已知的文件结构 tasks handlers templates .....

        Roles小技巧:
          1.创建roles目录结构,手动或使用ansible-galaxy init test roles
          2.编写roles的功能,也就是tasks。
          3.最后playbook引用roles编写好的tasks。

          [root@m01 project2]# mkdir memcached/{tasks,handlers,templates,vars,files} -pv

          [root@m01 project2]# mkdir {nginx,php-fpm}/{tasks,handlers,templates} -p


        galaxy(默认下载目录,相当与github)
          /root/.ansible/roles

        

 

posted on 2022-09-01 22:24  leiyunfeng  阅读(130)  评论(0编辑  收藏  举报