Jinja: 쀑첩 λ³€μˆ˜ 지원

에 λ§Œλ“  2016λ…„ 12μ›” 07일  Β·  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둜 λ³€κ²½ν•˜λ©΄ 이전 버전과 ν˜Έν™˜λ˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” λ³€μˆ˜*N λ³€μˆ˜ 이름을 μ–»κΈ° μœ„ν•œ λ‚΄λΆ€ λ Œλ”λ§μ΄ λ‚˜μœ μƒκ°μ΄λΌλŠ” 데 100% λ™μ˜ν•©λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ λ‚˜λŠ” μ™ΈλΆ€μ—μ„œ λ‚΄λΆ€ λ Œλ”λ§ 쀑첩 을 μœ„ν•œ μ†”λ£¨μ…˜μ„ μ°Ύλ‹€κ°€ μ—¬κΈ°κΉŒμ§€ μ™”κ³  κ²°κ΅­ 슀슀둜 μ†”λ£¨μ…˜μ„ νƒμƒ‰ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 그런 것에 λŒ€ν•œ 지원이 μžˆμŠ΅λ‹ˆκΉŒ? nested_render ν•„ν„°λ₯Ό μΆ”κ°€ν•˜λ©΄ μ‚¬λžŒλ“€μ—κ²Œ ν˜Όλž€μ„ 쀄 수 μžˆλ‹€λŠ” μ μ—μ„œ μ΄λ‘­κ±°λ‚˜ ν•΄λ‘œμšΈ 수 μžˆμŠ΅λ‹ˆκΉŒ?

쀑첩 λ³€μˆ˜λŠ” λ‹€μŒκ³Ό 같은 ꡬ성이 μžˆλŠ” WTForms의 문제λ₯Ό ν•΄κ²°ν•©λ‹ˆλ‹€.
{{ form.playername(value="{{ currentname }}") }}
λ‚΄κ°€ 찾은 λ‹€λ₯Έ μ†”λ£¨μ…˜λ³΄λ‹€ 훨씬 λͺ…ν™•ν•©λ‹ˆλ‹€.

{{ form.playername(value=currentname) }} ν•˜λ©΄ λ©λ‹ˆλ‹€. ν•˜μ§€λ§Œ fyi, ν˜„μž¬ 데이터λ₯Ό 양식 μƒμ„±μžμ— μ „λ‹¬ν•˜κ³  ν…œν”Œλ¦Ώμ—μ„œ μ „ν˜€ 신경쓰지 μ•Šμ•„μ•Ό ν•©λ‹ˆλ‹€.

μ•„, κ°„λ‹¨ν•©λ‹ˆλ‹€! λ‚˜λŠ” κ²°κ΅­ μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό μ‚¬μš©ν•˜μ—¬ currentname λ³€μˆ˜μ˜ 값을 μ„€μ •ν–ˆμŠ΅λ‹ˆλ‹€. Python μ½”λ“œμ—μ„œ 양식 개체의 기본값을 μ„€μ •ν•˜λ©΄ μ—…λ°μ΄νŠΈλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

IRCμ—μ„œ #pocoo λ₯Ό μž…λ ₯ν•˜κ³  거기에 ping을 보내면(μ—¬κΈ°μ„œλŠ” μ£Όμ œμ™€ 맀우 λ‹€λ¦…λ‹ˆλ‹€) μ˜¬λ°”λ₯΄κ²Œ μˆ˜ν–‰ν•˜λŠ” 방법을 μ•Œλ €λ“œλ¦΄ 수 μžˆμŠ΅λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰