Я пытаюсь заменить строку с помощью 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