Ansible Jinja2

1、jinja2基础介绍

1.1、什么是jinja2

Jinja2 是 Python 的全功能模板引擎
Ansible 需要使用 Jinja2 模板来修改被管理主机的配置文件。
场景1:给10台主机装上Nginx服务,但是要求每台主机的端口都不一样,如何解决?

1.2、Ansible如何使用jinja2

ansible 使用 jinja2 模板需要借助 template 模块实现,那 template 模块是用来做什么的?
template 模块和 copy 模块完全一样,都是拷贝文件至远程主机,
区别在于template 模块会解析要拷贝的文件中变量的值,而 copy 则是原封不动的将文件拷贝至被控端。

1.3、jinja模板基本语法

1、要想在配置文件中使用 jinj2 , playbook 中的 tasks 必须使用 template 模块
2、配置文件里面使用变量,比如 {{ PORT }} 或使用 {{ facts 变量 }}

1.4、jinja模板逻辑关系

1.4.1、循环表达式

{% for i in EXPR %}...{% endfor %}

1.4.2、判断表达式

{% if EXPR %}...{% elif EXPR %}...{% endif %}

1.4.3、注释

{# COMMENT #}

2、示例1-jinja模板入门

2.1、使用 Playbook 推送文件

cat <<'CAT_END'>jinja_first.yaml
- hosts: httpd
  tasks:
    - name: copy template file /tmp/motd
      template: src=./motd.j2 dest=/tmp/motd
CAT_END

2.2、准备 motd.j2 文件

cat <<'CAT_END'>motd.j2
主机名:{{ansible_hostname}} MB
总内存:{{ansible_memtotal_mb}} MB
空闲内存:{{ansible_memfree_mb}} MB
CAT_END

2.3、执行 playbook

ansible-playbook jinja_first.yaml 

2.4、检查执行后的状态

http1 ~]# cat /tmp/motd 
主机名:http1 MB
总内存:1795 MB
空闲内存:788 MB

2.5、总结

此例子展示了如何使用 facts 变量,当 playbook 被执行后,ansible_hostname 和 ansible_memtotal_mb 将会被替换成被管理主机上搜集的facts 变量的值

3、示例2-Jinja2管理Nginx

3.1、需求

ansible 使用 jinja2 的 for 循环表达式渲染出 nginx 负载均衡的配置文件

3.2、使用 Playbook 推送文件

cat <<'CAT_END'>proxy.yaml
- hosts: httpd
  vars:
    http_port: 80
    proxy_port: 80
    server_name: www.example.com
  tasks:
    - name: copy template nginx configure
      template:
        src: ./blog.conf.j2
        dest: /etc/nginx/conf.d/blog.example.com.conf
      notify: reload nginx server
  handlers:
    - name: reload nginx server
      systemd: name=nginx state=reloaded
CAT_END

3.3、准备 blog.conf.j2 配置文件

cat << 'CAT_END' >blog.conf.j2
upstream ansible_php {
{% for i in groups['httpd'] %}
  server {{i}}:{{proxy_port}};
{% endfor %}
}
server {
  listen {{http_port}};
  server_name: {{server_name}};
  location / {
    proxy_pass http://ansible_php;
    proxy_set_header Host $http_hosts;
  }
}
CAT_END

3.4、 执行 playbook

]# ansible-playbook proxy.yaml 

PLAY [httpd] *************************************************************************************************************************************************

TASK [Gathering Facts] ***************************************************************************************************************************************
ok: [192.168.10.18]
ok: [192.168.10.17]

TASK [copy template nginx configure] *************************************************************************************************************************
ok: [192.168.10.17]
ok: [192.168.10.18]

PLAY RECAP ***************************************************************************************************************************************************
192.168.10.17              : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.10.18              : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  

3.5、检查 jinja 模板渲染出来的配置文件

]# cat /etc/nginx/conf.d/blog.example.com.conf 
upstream ansible_php {
  server 192.168.10.17:80;
  server 192.168.10.18:80;
}
server {
  listen 80;
  server_name: www.example.com;
  location / {
    proxy_pass http://ansible_php;
    proxy_set_header Host $http_hosts;
  }
}

4、示例2-Jinja2管理Keepalived

4.1、需求

ansible使用jinja2的if判断表达式渲染出keepalived的Master和Slave的配置文件。并推送至lb组,实现方案如下:
1、设定 Inventory 中 host_vars 然后根据不同主机设定不同的变量
2、在 Playbook 中使用 when 判断主机名称,然后分发不同的配置文件。
3、使用 jinja2 的方式渲染出不同的配置文件。

 

4.2、编写 playbook【推送 keeplaived 配置文件】

cat << 'CAT_END' >keepalived.yaml
- hosts: httpd
  tasks:
    - name: copy template keepalived configure
      template:
        src: ./keepalived.conf.j2
        dest: /etc/keepalived/keepalived.conf
      notify: restart keepalived server
  handlers:
    - name: restart keepalived server
      systemd: name=keepalived state=restarted
CAT_END

4.3、准备 keepalived.conf.j2 配置文件

cat << 'CAT_END' > keepalived.conf.j2
global_defs {
  router_id {{ ansible_fqdn }}
}
vrrp_instance VI_1 {
  {% if ansible_fqdn == 'http1' %}
    state MASTER
    priority 150
  {% elif ansible_fqdn == 'http2' %}
    state Backup
    priority 100
  {% endif %}
  interface ens33
  virtual_router_id 51
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 1111
  }
  virtual_ipaddress {
    192.168.10.200
  }
}
CAT_END

4.4、执行 playbook

]# ansible-playbook keepalived.yaml 

PLAY [httpd] *************************************************************************************************************************************************

TASK [Gathering Facts] ***************************************************************************************************************************************
ok: [192.168.10.18]
ok: [192.168.10.17]

TASK [copy template keepalived configure] ********************************************************************************************************************
changed: [192.168.10.18]
changed: [192.168.10.17]

RUNNING HANDLER [restart keepalived server] ******************************************************************************************************************
changed: [192.168.10.17]
changed: [192.168.10.18]

PLAY RECAP ***************************************************************************************************************************************************
192.168.10.17              : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.10.18              : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

4.5、检查keepalived配置文件

4.5.1、http1

http1 ~]# cat /etc/keepalived/keepalived.conf 
global_defs {
  router_id http1
}
vrrp_instance VI_1 {
      state MASTER
    priority 150
    interface ens33
  virtual_router_id 51
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 1111
  }
  virtual_ipaddress {
    192.168.10.200
  }
}

4.5.2、http2

http2 ~]# cat /etc/keepalived/keepalived.conf 
global_defs {
  router_id http2
}
vrrp_instance VI_1 {
      state Backup
    priority 100
    interface ens33
  virtual_router_id 51
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 1111
  }
  virtual_ipaddress {
    192.168.10.200
  }
}

 

posted @ 2023-05-14 11:41  小粉优化大师  阅读(191)  评论(0编辑  收藏  举报