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 } }