如何在 Ansible 剧本中创建这样的列表:
['user1', 'user2', 'user3', '...', 'user20']
Run Code Online (Sandbox Code Playgroud)
并将其保存到同一个剧本中的变量中?
我尝试 在 Ansible 中一起使用 set_facts 和 with_items并稍微修改了 @serge 的答案。
我的代码如下所示:
- name: preparation for list
set_fact:
userItem: userItem= "{{ item }}"
with_sequence: start=1 end=20 format=user%d
register: userResult
- name: make a list
set_fact: users= "{{ userResult.results | map(attribute= 'ansible_facts.userItem) | list }}"
- name resulted list
debug: var=users
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
Run Code Online (Sandbox Code Playgroud)TASK [make a list] ***************************************************************** fatal: [10.0.2.11]: FAILED! => {"msg": "template error while templating string: unexpected end of template, expected ',' .. String: \"{{ userResult.results | map(attribute"}
我想在任务中使用该列表,在该任务中更改配置文件中的一行,如下所示:
TASK [make a list] *****************************************************************
fatal: [10.0.2.11]: FAILED! => {"msg": "template error while templating string: unexpected end of template, expected ',' .. String: \"{{ userResult.results | map(attribute"}
Run Code Online (Sandbox Code Playgroud)
其中{{ users }}应替换为所需的列表。
有没有办法可以将所需的列表保存在某种变量(而不是文件)中,以便我可以在其他任务中使用它?
您可以立即创建列表set_fact,无需任何中间任务:
- set_fact:
users: "{{ users | default([]) + ['user%s' | format(item)] }}"
loop: "{{ range(1, 21) | list }}"
Run Code Online (Sandbox Code Playgroud)
这使
{
"users": [
"user1",
"user2",
"user3",
"user4",
"user5",
"user6",
"user7",
"user8",
"user9",
"user10",
"user11",
"user12",
"user13",
"user14",
"user15",
"user16",
"user17",
"user18",
"user19",
"user20"
]
}
Run Code Online (Sandbox Code Playgroud)
这实际上非常接近文档中的示例:https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html#with-sequence
这表示您将无法将列表放入lineinfile模块中,因为您确实需要一个字符串。
所以你可以立即创建一个字符串:
- set_fact:
users: "{{ users | default('') + ' user%s' | format(item) }}"
loop: "{{ range(1, 21) | list }}"
- lineinfile:
path: /etc/ssh/shd_config
regexp: '^AllowUsers '
line: 'AllowUsers ansible {{ users }}'
notify: "restart ssh"
Run Code Online (Sandbox Code Playgroud)
因此,我们不是创建一个列表,而是创建一个字符串:
{
"users": " user1 user2 user3 user4 user5 user6 user7 user8 user9 user10 user11 user12 user13 user14 user15 user16 user17 user18 user19 user20"
}
Run Code Online (Sandbox Code Playgroud)
join或者在使用列表时使用过滤器users:
- set_fact:
users: "{{ users | default([]) + ['user%s' | format(item)] }}"
loop: "{{ range(1, 21) | list }}"
- lineinfile:
path: /etc/ssh/shd_config
regexp: '^AllowUsers '
line: 'AllowUsers ansible {{ users | join(' ') }}'
notify: "restart ssh"
Run Code Online (Sandbox Code Playgroud)