Ansible:将逗号或空格分隔的sting转换为字典

Ansible:将逗号或空格分隔的sting转换为字典,ansible,Ansible,Ansible v2.9 我想创建一个具有可选名称选项的CSR文件,所以我从 但是,我希望/需要以逗号或空格分隔的字符串形式传入dns\u服务器字典,我将从Jenkins文本框中获取该字符串。因此命令行看起来像 $ ansible-playbook ... -e alt_servers="my.example.com, us.example.com" 所以我基本上想要/需要,在伪代码中 dns_servers: "{{ alt_server }}".sp

Ansible v2.9

我想创建一个具有可选名称选项的CSR文件,所以我从

但是,我希望/需要以逗号或空格分隔的字符串形式传入
dns\u服务器
字典,我将从Jenkins文本框中获取该字符串。因此命令行看起来像

$ ansible-playbook ... -e alt_servers="my.example.com, us.example.com"
所以我基本上想要/需要,在伪代码中

dns_servers: "{{ alt_server }}".split(",")
然后呢

# Create a CSR using above private key
- name: Generate an OpenSSL CSR with subjectAltName extension with dynamic list
  openssl_csr:
    path: "{{ csr_path }}"
    privatekey_path: "{{ key_path }}"
    common_name: "{{ common_name }}"
    subject_alt_name: "{{ item.value | map('regex_replace', '^', 'DNS:') | list }}"
  with_dict: "{{ dns_servers }}"
两个问题:

  • 如何将传入的字符串转换为字典
  • 如何将字典与
    和\u dict
    选项一起使用?我说的对吗

  • 如果我理解您的要求,您希望创建一个具有多个SubjectAlternativeName的CSR。我可能会这样做:

    ---
    - hosts: localhost
      gather_facts: false
    
      vars:
        csr_path: example.csr
        key_path: example.key
        common_name: example.com
        dns_servers:
          - my.example.com
          - us.example.com
    
      tasks:
        - name: Generate an OpenSSL CSR with subjectAltName extension with dynamic list
          openssl_csr:
            path: "{{ csr_path }}"
            privatekey_path: "{{ key_path }}"
            common_name: "{{ common_name }}"
            subject_alt_name: "{{ (dns_servers | map('regex_replace', '^', 'DNS:')) | join(',') }}"
    
    在这里,
    dns\u服务器
    只是另一个变量,如
    csr\u路径
    common\u名称
    。它是一个列表,因此很容易使用
    map
    进行筛选,然后使用
    join
    创建一个公共分隔字符串

    我已经在剧本中包含了这些变量作为示例,但实际上我可能会在
    组变量中包含这些变量


    如果要将
    dns\u服务器的值作为从其他地方传入的字符串获取,只需使用
    split
    方法将其转换为列表。将上面
    vars
    部分中的
    dns\u服务器
    替换为:

        dns_servers: "{{ alt_servers.split(',') }}"
    
    现在,您可以使用
    -e alt_servers=my.example.com、us.example.com
    调用此剧本


    回复:您最近的评论;这正是剧本:

    ---
    - hosts: localhost
      gather_facts: false
    
      vars:
        csr_path: example.csr
        key_path: example.key
        common_name: example.com
        dns_servers: "{{ alt_servers.replace(' ', '').split(',') }}"
    
      tasks:
        - name: Generate an OpenSSL CSR with subjectAltName extension with dynamic list
          openssl_csr:
            path: "{{ csr_path }}"
            privatekey_path: "{{ key_path }}"
            common_name: "{{ common_name }}"
            subject_alt_name: "{{ (dns_servers | map('regex_replace', '^', 'DNS:')) | join(',') }}"
    
    使用此命令行时,不会出现错误:

    ansible-playbook playbook.yml  -e alt_servers="'us.example.com, my.example.com'"
    
    而CSR看起来是正确的:

    $ openssl req -in example.csr -noout -text
    [...]
            Requested Extensions:
                X509v3 Subject Alternative Name:
                    DNS:us.example.com, DNS:my.example.com
    [...]
    

    我不明白你为什么想要一本字典。为什么不列一份清单呢?@larsks,就像我说的,我只是在效仿。如果你能发布一个带有列表的答案,并且它有效,我会接受它。谢谢是的,但是如果你仔细阅读我的OP,
    dns\u server
    是一个动态变量,它的值由Jenkins用户通过在文本框中填写URL来设置。你在硬编码。你回答了我的问题,很好!它起作用了。但是,如果我可以通过传递
    -e alt_servers=“my.example.com,us.example.com”
    来打破它,也就是说,我会在逗号后面加一个空格。我尝试了
    dns_服务器:{(alt_服务器| replace('''').split('',')}}
    ,但没有任何效果。嗯,我想逗号后面有一个空格是无效的语法?如果你想在命令行的值中包含一个空格,你需要双引号:
    -e alt_服务器='“my.example.com,us.example.com”
    。这是Ansible如何解析值的一个工件。根据我之前的评论,这正是我所做的,在参数周围加了一个“”,但仍然失败。
    $ openssl req -in example.csr -noout -text
    [...]
            Requested Extensions:
                X509v3 Subject Alternative Name:
                    DNS:us.example.com, DNS:my.example.com
    [...]