我正在尝试使用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') }}"
上面的方法工作正常,如果我使用URI初始化mongoURI变量,则可以获得所需的输出。这是输出。
mongodb:// testuser:password @ shard1:27017,shard1:27017,shard1:27017 /?ssl = true&authSource = admin&replicaSet = TestCluster-shard-0
但是我需要从JSON输入读取mongoURI值。当我这样做时,第一个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将输出转换为字典,因此我尝试使用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:password @ shard1:27017,shard1:27017,shard1:27017 /?ssl = true&authSource = admin&replicaSet = TestCluster-shard-0
实际输出:
{{readinput}} shard1:27017,shard1:27017,shard1:27017 /?ssl = true&authSource = admin&replicaSet = TestCluster-shard-0
答案 0 :(得分:0)
您不需要'{{ 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"
答案 1 :(得分:0)
我找到了问题并解决。问题在于设置变量并立即在任务中使用它。
- 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有这样的限制。