Ansible regex_replace не распознает переменную - PullRequest
0 голосов
/ 24 июня 2019

Я пытаюсь заменить строку с помощью regex_replace, но у меня возникла проблема с параметрами.

vars:
    **mongoURI**: "mongodb://shard1:27017,shard2:27017,shard3:27017/?ssl=true&authSource=admin&replicaSet=TestCluster-shard-0"

- name: Create Mongo connection string    
      set_fact:        
        **readinput**: "mongodb://{{ (userinfo_json.Users | first).username }}:{{ (userinfo_json.Users | first).password }}@" 
        readconnstring: "{{ mongoURI | regex_replace('mongodb://', '{{ readinput }}') | regex_replace('\\?ssl', 'test?ssl') + ('&retryWrites=true') }}"

Вышеописанное работает нормально, и я получаю желаемый результат, если я инициализирую переменную mongoURI с помощью URI.Вот вывод:

mongodb: // testuser: пароль @ shard1: 27017, shard1: 27017, shard1: 27017 /? Ssl = true & authSource = admin & replicaSet = TestCluster-shard-0

ОднакоМне нужно прочитать значение mongoURI из ввода JSON.Когда я это делаю, первое regex_replace не распознает переменную (readinput).

- name: Fetch Mongo URI
      set_fact:
        mongoURI: "{{ (cluster_status_check.content | from_json).mongoURIWithOptions }}"
      when: cluster_status_check.status == 200

В этом сценарии два последних regex_replaces работают нормально, но первый заменяется именем переменной, как показано ниже.

* {{readinput}} * shard1: 27017, shard1: 27017, shard1: 27017 /? Ssl = true & authSource = admin & replicaSet = TestCluster-shard-0

Я пытался использовать urlsplit ('hostname'), но 'mongodb: //' не распознается как имя хоста.

Я также попытался удалить одинарные кавычки вокруг переменной readinput readconnstring: "{{mongoURI | regex_replace ('mongodb: //', {{readinput}})) и удаление {{}} для переменной readconnstring: "{{mongoURI |regex_replace ('mongodb: //', readinput))

но оба дают синтаксические ошибки.

Поскольку from_json преобразует вывод в dict, я попытался использовать with_items, но безуспешно.

- name: Create Mongo connection string    
      set_fact:        
        readinput: "mongodb://{{ (userinfo_json.Users | first).username }}:{{ (userinfo_json.Users | first).password }}@" 
        readconnstring: "{{ item | regex_replace('mongodb://', '{{ readinput }}') | regex_replace('\\?ssl', 'test?ssl') + ('&retryWrites=true') }}"
  with_items:
        - "{{ mongoURI }}"
---
- hosts: localhost
  gather_facts: no
  vars:
    mongoURI: ""

- name: Check whether cluster already exists
      uri:
        url: https://cloud.mongodb.com/api/atlas/v1.0/groups/{{ groupid }}/clusters/{{ clustername }}
        return_content: yes
        method: GET
        user: "{{ user }}"
        password: "{{ apikey }}"
        status_code: 404, 200
      register: cluster_status_check
- name: Fetch Mongo URI
      set_fact:
        mongoURI: "{{ (cluster_status_check.content | from_json).mongoURIWithOptions }}"
      when: cluster_status_check.status == 200

- name: Create Mongo connection string    
      set_fact:        
        readinput: "mongodb://{{ (userinfo_json.Users | first).username }}:{{ (userinfo_json.Users | first).password }}@" 
        readconnstring: "{{ mongoURI | regex_replace('mongodb://', '{{ readinput }}') | regex_replace('\\?ssl', 'test?ssl') + ('&retryWrites=true') }}"

Вместо того, чтобы заменять mongodb: // значением readinput, оно заменяется на {{readinput}}

Желаемый вывод:

mongodb: // testuser: пароль @ shard1: 27017, shard1: 27017, shard1: 27017 /? ssl = true & authSource = admin & replicaSet = TestCluster-shard-0

Фактический вывод:

{{readinput}} shard1: 27017, shard1: 27017, shard1: 27017 / = SSL верно & = админы авторизация источник и replicaSet = TestCluster-осколок-0

Ответы [ 2 ]

0 голосов
/ 25 июня 2019

Я нашел проблему и исправил.Проблема заключается в установке переменной и немедленном ее использовании в задаче.

- name: initialize variables
      set_fact:                
        readinput: "mongodb://{{ (userinfo_json.Users | first).username }}:{{ (userinfo_json.Users | first).password }}@"

- name: Create Mongo connection string    
      set_fact:        
        readconnstring: "{{ mongoURI | regex_replace('mongodb://', readinput) | regex_replace('\\?ssl', 'test?ssl') + ('&retryWrites=true') }}"

Согласно документации, переменные, установленные с помощью set_fact, доступны для последующих воспроизведений.Когда я переместил инициализацию readinput в другую задачу, код работал.Мне также не нужно оборачивать переменную внутри {{}}.

Я потратил много времени.Не уверен, почему существует такое ограничение для set_fact.

0 голосов
/ 24 июня 2019

Вам не нужно '{{ readinput }}', достаточно readinput.

Что-то подобное должно работать:

- name: Create Mongo connection string    
  set_fact:        
    readinput: "mongodb://{{ (userinfo_json.Users | first).username }}:{{ (userinfo_json.Users | first).password }}@" 
    readconnstring: "{{ mongoURI | regex_replace('mongodb://', readinput) | regex_replace('\\?ssl', 'test?ssl') }}&retryWrites=true"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...