2016-09-17 4 views
1

Anabilitiesのregex_replaceフィルタでは、リテラル(ドット)を見つけることができません。ここでのタスクは次のとおりです。リテラルと 'regex_replace'をマッチさせる可能性のあるフィルタ

- name: Display database name 
    debug: 
    msg: "{{ vhost | regex_replace('(.+\.)(.+)$', \\1) }}" 
    tags: [debug] 

私の意図が一致し、その最初の部分(例ではテスト)でtest.staging.domain.comのような全体のURLを交換することです。私はAnsible regexp_replaceフィルタでリテラルを一致させることができますどのように

debug: 
    msg: "{{ vhost | regex_replace('(.+\.)(.+)$', \\1) }}" 
            ^here 

We could be wrong, but this one looks like it might be an issue with missing quotes. Always quote template expression brackets when they start a value.

Ansibleは、次のエラーを報告しますか?

答えて

1

文字のエスケープについて奇抜な何かがあるかもしれませんが、文字通りのドットをコーディングするエスケープレス方法があります:

[.] 

だからあなたの正規表現は

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

ほとんどの文字が自分を失うを書くことができます文字クラスでは特別な意味を持ち、ドットはそれらの1つです。

2

それは二重のバックラッシュでリテラルを逃れるために、実際に可能です:

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

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

私はこのようにそれをやってしまった、同じことをやろうとした
1

- name: Set hostname (minus the domain) 
    debug: msg={{ inventory_hostname.split('.')[0] }} 
:よりよい方法を見つけ、

- name: Set hostname (minus the domain) 
    debug: msg={{ inventory_hostname | regex_replace('^([^.]*).*', '\\1') }} 

*編集

関連する問題