web-dev-qa-db-ja.com

リテラルを「regex_replace」Ansibleフィルターと一致させる

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フィルターのリテラルを一致させるにはどうすればよいですか?

6
luqo33

二重のバックラッシュでリテラルをエスケープすることは実際に可能です:

- name: Create database name and username
  set_fact:
    db_name: "{{ vhost | regex_replace('([^\\.]*)\\.(.+)$', '\\1') }}_stg"

上記の正規表現は正しく機能します。最初のキャプチャグループは、最初のドット、正規表現全体がURL全体をキャプチャするまで、URLの最初の部分を抽出します。 test.staging.domain.co mを渡すと、testが生成されます。

8
luqo33

私は同じことをやろうとしていましたが、次のようにしてしまいました:

- 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] }}
4
gaddman

文字をエスケープすることについて何か奇妙なことがあるかもしれませんが、リテラルドットをコーディングするためのエスケープなしの方法があります:

[.]

だからあなたの正規表現は書くことができます

(.+[.])(.+)$

ほとんどの文字は、文字クラスの場合は特別な意味を失い、ドットもその1つです。

2
Bohemian