Ansibleのregex_replaceフィルターで多くのリテラル(ドット)を作成する方法が見つかりません。タスクは次のとおりです。
- name: Display database name
debug:
msg: "{{ vhost | regex_replace('(.+\.)(.+)$', \\1) }}"
tags: [debug]
私の意図は、test.staging.domain.comのようなURL全体を最初の部分(例ではtest)に一致させて置き換えることです。
Ansibleは次のエラーを報告します:
debug:
msg: "{{ vhost | regex_replace('(.+\.)(.+)$', \\1) }}"
^ here
私たちは間違っている可能性がありますが、これは引用符の欠落の問題である可能性があるようです。テンプレート式の括弧は、値を開始するときに必ず引用してください。
Ansible regexp_replace
フィルターのリテラルを一致させるにはどうすればよいですか?
二重のバックラッシュでリテラルをエスケープすることは実際に可能です:
- name: Create database name and username
set_fact:
db_name: "{{ vhost | regex_replace('([^\\.]*)\\.(.+)$', '\\1') }}_stg"
上記の正規表現は正しく機能します。最初のキャプチャグループは、最初のドット、正規表現全体がURL全体をキャプチャするまで、URLの最初の部分を抽出します。 test.staging.domain.co mを渡すと、testが生成されます。
私は同じことをやろうとしていましたが、次のようにしてしまいました:
- name: Set hostname (minus the domain)
debug: msg={{ inventory_hostname | regex_replace('^([^.]*).*', '\\1') }}
*編集、より良い方法を見つけました:
- name: Set hostname (minus the domain)
debug: msg={{ inventory_hostname.split('.')[0] }}
文字をエスケープすることについて何か奇妙なことがあるかもしれませんが、リテラルドットをコーディングするためのエスケープなしの方法があります:
[.]
だからあなたの正規表現は書くことができます
(.+[.])(.+)$
ほとんどの文字は、文字クラスの場合は特別な意味を失い、ドットもその1つです。