Ansible Jinja2 模板


1.jinja2渲染NginxProxy配置文件

jinja2
    房屋建築設計固定的?

jinja2模板與Ansible關系
Ansible如何使用jinja2模板
    template模塊     拷貝文件?
    template copy  區別?  
        template會解析配置文件中的變量
        copy  不會解析任何的變量,只會拷貝文件

Ansible允許jinja2模板中使用判斷  循環,但是jinja判斷循環語法不允許在playbook中使用。

注意: 不是每個管理員都需要這個特性,但是有些時候jinja2模板能大大提高效率。

1.jinja模板基本語法

1)要想在配置文件中使用jinj2,playbook中的tasks 必須使用template模塊

2)模板配置文件里面使用變量,比如 {{ PORT }} 或使用 {{ facts 變量 }}

2.jinja模板邏輯關系

{% for i in EXPR %}...{% endfor%} 作為循環表達式*

*{% if EXPR %}...{% elif EXPR %}...{% endif%} 作為條件判斷*

*{# COMMENT #} 表示注釋
-------------------------------------------------------------------------

{% for i in range(1,10)%}
        server 172.16.1.{{i}};
{% endfor %}


#判斷
{% if ansible_fqdn == "web01" %}
        echo 123
{% elif ansible_fqdn == "web02" %}
        echo 456
{% else %}
        echo 789
{% endif %}

nginxproxy配置文件

[root@manager jinja2]# cat j_nginx.yml 
- hosts: lbservers
  tasks:

        #安裝nginx
    - name: Installed nginx Server
      yum: 
        name: nginx
        state: present

        #配置nginx vhosts
    - name: Configure nginx Server
      template:
        src: ./file/proxy_kod.oldxu.com.conf.j2
        dest: /etc/nginx/conf.d/proxy_kod.oldxu.com.conf
      notify: Restart Nginx Server


        #啟動Nginx
    - name: Systemd Nginx Server
      systemd:
        name: nginx
        state: started
        enabled: yes 


  handlers:
    - name: Restart Nginx Server
      systemd: 
        name: nginx
        state: restarted
        
        
# nginx組變量   
[root@manager jinja2]# cat group_vars/all 
kod_http_port: 80
kod_server_name: kod.oldxu.com
kod_web_site: /code/kod

 

#nginx proxy配置文件渲染
[root@manager jinja2]# cat file/proxy_kod.oldxu.com.conf.j2 
upstream {{ kod_server_name }} {
    {% for host in groups['webservers'] %}
	server {{host}}:{{kod_http_port}};
    {% endfor %}
}

server {
	listen {{ kod_http_port }};
	server_name  {{ kod_server_name }};

	location / {
		proxy_pass http://{{ kod_server_name }};
		proxy_set_header Host $http_hosts;
	}
}

[root@manager jinja2]# cat ../hosts
[webservers]
172.16.1.7
172.16.1.8

2.Keepalived配置文件 master slave

​###2.1:准備多個配置文件 master backup

[root@manager jinja2]# cat j_keepalived.yml 
- hosts: lbservers
  tasks:
    - name: Installed Keepalived Server
      yum:
        name: keepalived
        state: present

    - name: Configure Keepalived Master
      copy:
        src: ./file/keepalived-master.conf.j2
        dest: /etc/keepalived/keepalived.conf
      when: ( ansible_hostname == "lb01" )
      notify: Restart Keepalived Server

    - name: Configure Keepalived Backup
      copy:
        src: ./file/keepalived-backup.conf.j2
        dest: /etc/keepalived/keepalived.conf
      when: ( ansible_hostname == "lb02" )
      notify: Restart Keepalived Server

    - name: Systemd Keepalived Server
      systemd:
        name: keepalived
        state: started
        enabled: yes

  handlers:
    - name: Restart Keepalived Server
      systemd:
        name: keepalived
        state: restarted

2.2:設定host_vars變量 5和6設定相同的變量,不同的值

#1.准備一份keepalived配置文件
#2.需要在keepalived配置文件中使用變量方式  ---> jinja

[root@manager jinja2]# cat ./file/keepalived-vars.conf.j2 
global_defs {     
    router_id {{ ansible_hostname }}
}

vrrp_instance VI_1 {
    state  {{ state }}
    priority {{ priority }}

    interface eth0
    virtual_router_id 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
}
    virtual_ipaddress {
        10.0.0.3
    }
}



[root@manager jinja2]# cat host_vars/172.16.1.5
state: MASTER
priority: 200
[root@manager jinja2]# cat host_vars/172.16.1.6
state: BACKUP
priority: 99

[root@manager jinja2]# cat var_keepalived.yml 
- hosts: lbservers
  tasks:

    - name: Installed Keepalived Server
      yum:
        name: keepalived
        state: present


    - name: Configure Keepalived Master
      template:
        src: ./file/keepalived-vars.conf.j2
        dest: /etc/keepalived/keepalived.conf
      notify: Restart Keepalived Server

    - name: Systemd Keepalived Server
      systemd:
        name: keepalived
        state: started
        enabled: yes

  handlers:
    - name: Restart Keepalived Server
      systemd:
        name: keepalived
        state: restarted


#為不同的主機設定相同的變量,  只不過值不一樣.

3.jinja2判斷方式

[root@manager jinja2]# cat jinja_keepalived.yml 
- hosts: lbservers
  tasks:

    - name: Installed Keepalived Server
      yum:
        name: keepalived
        state: present


    - name: Configure Keepalived Master
      template:
        src: ./file/keepalived.conf.j2
        dest: /etc/keepalived/keepalived.conf
      notify: Restart Keepalived Server

    - name: Systemd Keepalived Server
      systemd:
        name: keepalived
        state: started
        enabled: yes

  handlers:
    - name: Restart Keepalived Server
      systemd:
        name: keepalived
        state: restarted


[root@manager jinja2]# cat file/keepalived.conf.j2 
global_defs {     
    router_id {{ ansible_hostname }}
}

vrrp_instance VI_1 {
{% if ansible_hostname == "lb01" %}
    state  MASTER
    priority 150
{% elif ansible_hostname == "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
    }
}

Ansible Roles角色

Roles小技巧:*

1.創建roles目錄結構,手動或使用ansible-galaxy init test roles

2.編寫roles的功能,也就是tasks。  nginx  rsyncd memcached

3.最后playbook引用roles編寫好的tasks


mkdir /root/roles/nginx/{tasks,templates,handlers}

##tasks
[root@manager ~]# cat /root/roles/nginx/tasks/main.yml 
- name: Install Nginx Server
  yum:
    name: nginx
    state: present

- name: Configure Nginx Server
  template:
    src: nginx.conf.j2
    dest: /etc/nginx/nginx.conf
  notify: Restart Nginx Server


- name: Systemd Nginx Server
  systemd:
    name: nginx
    state: started
    enabled: yes

##template
[root@manager roles]# cat /root/roles/nginx/templates/nginx.conf.j2 
user www;
worker_processes  {{ ansible_processor_vcpus }};

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
    worker_connections  {{ ansible_processor_vcpus * 1024 }};
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
	access_log /var/log/nginx/access.log main;

    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;
    #gzip  on;
    include /etc/nginx/conf.d/*.conf;
}

###handlers
[root@manager ~]# cat /root/roles/nginx/handlers/main.yml 
- name: Restart Nginx Server
  systemd:
    name: nginx
    state: restarted
    
    
    
#調用playbook
[root@manager roles]# cat /root/roles/site.yml 
- hosts: webservers
  roles:
    - nginx

##hosts ansible.cfg  自備

memcached roles

#安裝
#配置
#啟動

#1.創建roles的目錄結構
[root@manager roles]# mkdir memcached/{tasks,templates,handlers} -p

#2.編寫對應的tasks  (1.安裝  2配置(templates)  3.啟動  4.重啟(handlers) )
[root@manager roles]# cat memcached/tasks/main.yml 
- name: Installed Memecached Server
  yum:
    name: memcached
    state: present

- name: Configure Memcached Server
  template:
    src: memcached.j2
    dest: /etc/sysconfig/memcached
  notify: Restart Memcached Server


- name: System Memcached Server
  systemd:
    name: memcached
    state: started
    enabled: yes

[root@manager roles]# cat memcached/templates/memcached.j2 
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="{{ ansible_memtotal_mb //2 }}"
OPTIONS=""

[root@manager roles]# cat memcached/handlers/main.yml 
- name: Restart Memcached Server
  systemd:
    name: memcached
    state: restarted


#3.playbook調用roles
[root@manager roles]# cat site.yml 
- hosts: webservers
  roles:
    - { role: nginx, tags: web }
    - { role: memcached, tags: cache }

NFS服務

#1.創建項目目錄結構   ---> 
[root@manager roles]# mkdir nfs/{tasks,templates,handlers} -p

#2.編寫task任務

#3.playbook調用roles項目

roles:
    1.nginxProxy+keepalived  10.0.0.5  10.0.0.6      10.0.0.3
    2.nginx靜態網站                             172.16.1.7 172.16.1.8


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM