Ansible regex_replace无法识别变量

时间:2019-06-24 19:40:36

标签: regex mongodb ansible

我正在尝试使用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

2 个答案:

答案 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有这样的限制。