如何生成一个带有范围的列表并将其保存在剧本的 var 中?

L.G*_*shi 4 ansible

如何在 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)

但我收到以下错误:

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)

我想在任务中使用该列表,在该任务中更改配置文件中的一行,如下所示:

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 }}应替换为所需的列表。

有没有办法可以将所需的列表保存在某种变量(而不是文件)中,以便我可以在其他任务中使用它?

β.ε*_*.βε 6

您可以立即创建列表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)