Ansible:将逗号或空格分隔的sting转换为字典
Ansible v2.9 我想创建一个具有可选名称选项的CSR文件,所以我从 但是,我希望/需要以逗号或空格分隔的字符串形式传入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
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
[...]