2016-09-17 3 views
1

Anabilities의 regex_replace 필터에서 리터럴 (점)을 찾을 수 없습니다. 다음 작업은 다음과 같습니다'regex_replace'로 리터럴 일치 가능 필터

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

내 의도는 일치의 첫 번째 부분 (예에서 테스트)와 test.staging.domain.com 같은 전체 URL을 대체하는 것입니다.

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 regexp_replace 필터의 리터럴을 일치시킬 수 있습니다 :

Ansible 다음과 같은 오류를보고 할 것인가?

답변

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') }} 

* 편집, 더 좋은 방법을 발견

관련 문제