Jinja: ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 7 Π΄Π΅ΠΊ. 2016  Β·  7ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: pallets/jinja

Π― просматривал Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΎΠ½Π»Π°ΠΉΠ½-ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΈ, ΠΏΠΎΡ…ΠΎΠΆΠ΅, Π½Π΅ нашСл упоминания ΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, поэтому я ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽ запрос Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ принСсти ΠΏΠΎΠ»ΡŒΠ·Ρƒ ΠΌΠ½ΠΎΠ³ΠΈΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌ, позволяя Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ слоТныС ΠΈ автоматичСскиС Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ….

ΠΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊ:

{{ variable }}

Π‘Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ использованиС динамичСской ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ для заполнСния ΠΈΠΌΠ΅Π½ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

{{ variable{{ generated_var }} }}

Мой Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ использования - с Ansible. Π― Π±Π΅Ρ€Ρƒ список устройств сСтСвого интСрфСйса ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ (ansible_interfaces). Π—Π°Ρ‚Π΅ΠΌ я ΠΌΠΎΠ³Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ это для ссылки Π½Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ansible_eth0). Π’ΠΎΡ‚ базовая схСма Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ пытаСмся Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ.

{% for interface in ansible_interfaces %}
IPADDR{{ loop.index }}={{ ansible_{{ interface }}.ipv4.address }}
NETMASK{{ loop.index }}={{ ansible_{{ interface }}.ipv4.netmask }}
{% endfor %}

Jinja2 Π½Π΅ Π»ΡŽΠ±ΠΈΡ‚ это ΠΏΡ€ΠΈ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ ТалуСтся Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… скобок. Π§Ρ‚ΠΎ касаСтся Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ это Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ, я Π΄ΡƒΠΌΠ°Π» Π² руслС ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· этих Π΄Π²ΡƒΡ… Ρ€Π°Π·Π½Ρ‹Ρ… ΠΈΠ΄Π΅ΠΉ.

(1) Π Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. Π­Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ я ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π» Ρ€Π°Π½Π΅Π΅; позволяя Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈΠ·Π½ΡƒΡ‚Ρ€ΠΈ.

(2) Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ для прСобразования строки Π² имя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

{% for interface in ansible_interfaces %}
{% set interface_string="ansible_%s.ipv4.address"|format(interface) %}
IPADDR{{ loop.index }}={{ interface_string|variable }}
NETMASK{{ loop.index }}={{ interface_string|variable }}
{% endfor %}

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½Ρ‹ΠΉ (Π½Π΅Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ) ΠΊΠΎΠ΄, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π²Ρ‚ΠΎΡ€ΡƒΡŽ идСю.

# vim jinja2/jinja2/filters.py
<strong i="21">@environmentfilter</strong>
def do_variable(environment, s):
    string_to_variable = "{{ %s }}" % s
    return environment.from_string(string_to_variable).render()

Π’ ΠΈΠ΄Π΅Π°Π»Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ 1 Π±Ρ‹Π» Π±Ρ‹ ΠΌΠ΅Π½Π΅Π΅ слоТным с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния использования ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ. Π‘ΠΎΠΎΠ±Ρ‰ΠΈΡ‚Π΅ ΠΌΠ½Π΅ свои мысли ΠΏΠΎ этому ΠΏΠΎΠ²ΠΎΠ΄Ρƒ. Π― Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ ΠΈΠ·ΡƒΡ‡Π°ΡŽ ΠΊΠΎΠ΄ Jinja2, Π½ΠΎ я Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ внСсти свой Π²ΠΊΠ»Π°Π΄, Ссли с ΠΊΠΎΠ΄ΠΎΠΌ потрСбуСтся какая-Π»ΠΈΠ±ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒ.

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

http://serverfault.com/questions/762079/how-to-loop-through-interface-facts

ΠŸΠΎΡ…ΠΎΠΆΠ΅, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ:

{{ hostvars[inventory_hostname]['ansible_%s' | format(interface)].ipv4.address }}

Π― ΠΎΡ‡Π΅Π½ΡŒ силСн: -1: ΠΏΠΎ ΠΈΠΌΠ΅Π½Π°ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ это ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ ΠΏΠ»ΠΎΡ…ΠΎΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹, Ссли ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ прСдоставляСт ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ / список Π΄Π°Π½Π½Ρ‹Ρ…, Ссли Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊ Π½Π΅ΠΌΡƒ доступ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ динамичСского ΠΊΠ»ΡŽΡ‡Π° ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Π±Ρ€Π°Ρ‚ΡŒ Π΅Π³ΠΎ. FWIW, я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ этот hostvars dict нСсколько ΡƒΡ€ΠΎΠ΄Π»ΠΈΠ² ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ сопоставлСниСм ΠΈΠΌΠ΅Π½ интСрфСйсов dict с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ интСрфСйса. Π― Π±Ρ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Π» вопрос с Ansible, прСдлагая ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ этот список Π½Π° dict. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ итСрация ΠΏΠΎ dict Π΄Π°Π΅Ρ‚ Π²Π°ΠΌ Π΅Π³ΠΎ ΠΊΠ»ΡŽΡ‡ΠΈ, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π°ΠΆΠ΅ Π½Π΅ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ нСсовмСстимым, Ссли ΠΎΠ½ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈ Π΅Π³ΠΎ Π½Π° dict ...

ВсС 7 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

http://serverfault.com/questions/762079/how-to-loop-through-interface-facts

ΠŸΠΎΡ…ΠΎΠΆΠ΅, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ:

{{ hostvars[inventory_hostname]['ansible_%s' | format(interface)].ipv4.address }}

Π― ΠΎΡ‡Π΅Π½ΡŒ силСн: -1: ΠΏΠΎ ΠΈΠΌΠ΅Π½Π°ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ это ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ ΠΏΠ»ΠΎΡ…ΠΎΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹, Ссли ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ прСдоставляСт ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ / список Π΄Π°Π½Π½Ρ‹Ρ…, Ссли Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊ Π½Π΅ΠΌΡƒ доступ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ динамичСского ΠΊΠ»ΡŽΡ‡Π° ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Π±Ρ€Π°Ρ‚ΡŒ Π΅Π³ΠΎ. FWIW, я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ этот hostvars dict нСсколько ΡƒΡ€ΠΎΠ΄Π»ΠΈΠ² ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ сопоставлСниСм ΠΈΠΌΠ΅Π½ интСрфСйсов dict с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ интСрфСйса. Π― Π±Ρ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Π» вопрос с Ansible, прСдлагая ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ этот список Π½Π° dict. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ итСрация ΠΏΠΎ dict Π΄Π°Π΅Ρ‚ Π²Π°ΠΌ Π΅Π³ΠΎ ΠΊΠ»ΡŽΡ‡ΠΈ, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π°ΠΆΠ΅ Π½Π΅ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ нСсовмСстимым, Ссли ΠΎΠ½ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈ Π΅Π³ΠΎ Π½Π° dict ...

Π― Π½Π° 100% согласСн с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³ Π½Π°ΠΈΠ·Π½Π°Π½ΠΊΡƒ для получСния ΠΈΠΌΠ΅Π½ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… * N - ΠŸΠ›ΠžΠ₯АЯ идСя.

Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, я ΠΏΡ€ΠΈΡˆΠ΅Π» сюда Π² поисках Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ для влоТСния Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π° снаруТи Π²Π½ΡƒΡ‚Ρ€ΡŒ ΠΈ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ ΠΈΠ·ΡƒΡ‡ΠΈΠ» это Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ сам. Π•ΡΡ‚ΡŒ Π»ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° для Ρ‚Π°ΠΊΠΎΠΉ ΡˆΡ‚ΡƒΠΊΠΈ? Π‘ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° nested_render ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ ΠΈΠ»ΠΈ Π²Ρ€Π΅Π΄Π½Ρ‹ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ±ΠΈΡ‚ΡŒ с Ρ‚ΠΎΠ»ΠΊΡƒ людСй?

Π’Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ€Π΅ΡˆΠ°Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ с WTForms, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ такая конструкция, ΠΊΠ°ΠΊ
{{ form.playername(value="{{ currentname }}") }}
Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ яснСС, Ρ‡Π΅ΠΌ любоС Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ я нашСл.

{{ form.playername(value=currentname) }} Π΄Π΅Π»Π°Π΅Ρ‚ это. Π½ΠΎ, ΠΊ соТалСнию, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ Π² конструктор Ρ„ΠΎΡ€ΠΌΡ‹ ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ ΠΎΠ± этом Π² ΡˆΠ°Π±Π»ΠΎΠ½Π°Ρ…

Ах, это Ρ‚Π°ΠΊ просто! Π’ ΠΈΡ‚ΠΎΠ³Π΅ я использовал Javascript для установки значСния ΠΈΠ· ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ currentname. Когда я ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ Ρ„ΠΎΡ€ΠΌΡ‹ Π² ΠΊΠΎΠ΄Π΅ Python, ΠΎΠ½ΠΎ Π½Π΅ обновляСтся.

ΠŸΡ€ΠΎΠΉΠ΄ΠΈΡ‚Π΅ ΠΌΠΈΠΌΠΎ #pocoo Π² IRC ΠΈ ΠΏΠΈΠ½Π³ΡƒΠΉΡ‚Π΅ мСня Ρ‚ΡƒΠ΄Π° (здСсь ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡ„Ρ„Ρ‚ΠΎΠΏΠ°), ΠΈ я ΠΌΠΎΠ³Ρƒ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ Π²Π°ΠΌ, ΠΊΠ°ΠΊ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ.

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ