Ansible Jinja2 使用及示例

anyux發表於2024-08-21

目錄
  • Jinja2
    • Jinja2 For迴圈
    • Jinja2 If 條件
    • Jinja多值合併

Jinja2

掌握了Jinja才是深入Ansible-playbook的開始

Jinja2 For迴圈

變數的提取使用 {{variable}}
{%statement execution%} 括起來的內容為Jinja2命令執行語句

{% for item in all_items %}
    {{ item }}
    {% endfor %}
#匯入模組
from jinja2 import Template

#設定模板內容
template_content = ''' 
{% for id in range(201,211) %} 
192.168.37.{{ id }} web{{ "%02d"|format(id-200) }}.magedu
{% endfor %} 
''' 
# 建立模板物件 
template = Template(template_content)

# 渲染模板 
output = template.render()

# 列印模板
print(output)

Jinja2 If 條件

{% if my_conditional %}
       ...
    {% endif %}

編排目錄結構

mysqlconf.yaml
roles/mysqlconf/
        ├── templates
        │ └── mycnf.j2
mkdir -p roles/mysqlconf/templates

只定義了Templates而沒有定義Tasks,Ansible也支援這樣的方式,只是mysqlconf這個role的功能不全而已,但不影響其正常使用

我們本次的Tasks排程配置在mysqlconf.yaml檔案中

mysqlconf.yaml

- name : Mysql conf template
  hosts : ubuntu
  vars:
    PORT: 1331
  tasks:
   - template: 
      src: roles/mysqlconf/templates/mycnf.j2 
      dest: /etc/mycnf.conf.yaml

roles/mysqlconf/templates/mycnf.j2

{% if PORT %}
    bind-address=0.0.0.0:{{ PORT }}
{% else %}
    bind-address=0.0.0.0:3306
{% endif %}
ansible-playbook mysqlconf.yaml 

PLAY [Mysql conf template] ******

TASK [Gathering Facts] ******
ok: [192.168.255.110]

TASK [template] ******
changed: [192.168.255.110]

PLAY RECAP ******
192.168.255.110            : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Jinja多值合併

{% for node in groups["db"] %}
    {{ node | join("") }}:5672
    {% if not loop.last %}
    {% endif %}
{% endfor %}

相關文章