Hai, saya baru menggunakan jinja2 dan mencoba menggunakan ekspresi reguler seperti yang ditunjukkan di bawah ini
{% if ansible_hostname == 'uat' %}
{% set server = 'thinkingmonster.com' %}
{% else %}
{% set server = 'define yourself' %}
{% endif %}
{% if {{ server }} match('*thinking*') %}
{% set ssl_certificate = 'akash' %}
{% elif {{ server }} match( '*sleeping*')%}
{% set ssl_certificate = 'akashthakur' %}
{% endif %}
berdasarkan nilai "server" saya ingin mengevaluasi sertifikat mana yang akan digunakan. yaitu jika domain mengandung kata kunci "thinking" maka gunakan sertifikat ini dan jika mengandung kata kunci "sleeping" maka gunakan sertifikat itu.
Tapi saya tidak menemukan filter jinja2 yang mendukung hal ini. Saya menemukan beberapa kode python dan saya yakin itu bisa bekerja tetapi bagaimana cara menggunakan python di template jinja2?
Jinja2 dapat dengan mudah melakukan pemeriksaan substr dengan perbandingan 'in ' yang sederhana, misalnya
{% set server = 'www.thinkingmonster.com' %}
{% if 'thinking' in server %}
do something...
{% endif %}
Jadi, filter regex substring Anda tidak diperlukan. Namun jika Anda menginginkan pencocokan regex yang lebih canggih, maka sebenarnya ada filter yang tersedia di ansible - lihat filter regex di http://docs.ansible.com/playbooks_filters.html#other-useful-filters - lucunya, sintaks pencocokan Anda di atas hampir tepat.
+1 untuk jawaban Bereal, ini memberikan alternatif yang bagus dalam bentuk peta.
Jadi, setelah mencari di Google dalam waktu yang lama dan dengan bantuan beberapa blogger, inilah solusi akhir untuk masalah saya:-
1. Jinja2 tidak memiliki filter untuk menemukan sub-string atau regexp, jadi satu-satunya solusi adalah membuat filter khusus. Saya mengikuti langkah-langkah di bawah ini untuk memperbaiki masalah saya.
2. Di dalam direktori root playbook saya, saya membuat direktori "filter_plugins" dan menulis sebuah modul khusus dalam python dan menempatkan file di dalam direktori ini. Nama file python bisa apa saja. Kode python saya terlihat sebagai berikut:
__author__ = 'akthakur'
class FilterModule(object):
''' Custom filters are loaded by FilterModule objects '''
def filters(self):
''' Filter Module objects return a dict mapping filter names to filter functions. '''
return {
'substr': self.substr,
}
''' def substr(self, check,checkin):
return value1+value2'''
def substr(self,check,checkin):
if check in checkin:
return True
else:
return False
3. Setelah file ini dibuat, filter baru kita "substr" siap digunakan dan dapat digunakan di dalam templat seperti yang ditunjukkan di bawah ini:
{% if 5==5 %}
{% set server = 'www.thinkingmonster.com' %}
{% endif %}
{% if 'thinking' | substr(server) %}
{% set ssl_cert = 'abc.crt'%}
{% endif %}
Sepengetahuan saya, tidak ada filter bawaan untuk itu di Jinja2 dan juga di antara [filter tambahan] Ansible (https://docs.ansible.com/playbooks_filters.html), tetapi tidak masalah untuk membuatnya sendiri:
certs = {'.*thinking.*': 'akash', '.*sleeping.*': 'akashthakur'}
def map_regex(value, mapping=certs):
for k, v in mapping.items():
if re.match(k, value):
return v
Kemudian Anda harus menambahkan plugin filter ke Ansible, sehingga akan menggunakan fungsi di atas dalam templat (seperti {{server|ssl_cert}}}
jika Anda menamai filter ssl_cert
).
Meskipun demikian, fungsi biasa atau kamus biasa yang diteruskan ke templat dan digunakan di sana secara eksplisit mungkin lebih cocok untuk pekerjaan ini.