как использовать переменные, созданные в with_elements и используемые в цикле with_subelement - PullRequest
0 голосов
/ 14 января 2020

Я хочу включить задачи и создать пользователей с помощью элемента var, созданного функцией with_items

Это часть большого кода. Я не могу опубликовать здесь весь код, но мне нужно создать пользователя разными способами.

в моем create.yml я делаю разные тесты, чтобы выбрать подходящий файл для включения. В этом примере это потому, что тип пользователя «простой», поэтому я включаю файл create_simple.yml

Например:

file create.yml:

- name: 'Create'
  include_tasks: create_simple.yml user='{{ item }}'
  with_items: 
    - '{{ userslist }}'
  when: item.simple

Вот пример списка пользователей:

userslist:
  - name: 'user1'
    simple: False
    uid: '1002'
    password: 'test'
    shell: '/bin/bash'
    comment: 'comment user1'
    primary: 'groupe1'
    gid: '30002'
    groups:
      - gname: 'secondary'
        gid: 30000
    remote_groups:
       - gname: 'remote'
    expires: 1580472000
    generate_ssh_key: true
    ssh_key_type: 'rsa'
  - name: 'test'
    simple: True
    uid: '1002'
    password: 'test'
    shell: '/bin/bash'
    comment: 'test'
    gid: '30003'
    groups:
      - gname: 'test'
        gid: 30000
    expires: 1580472000
    generate_ssh_key: true
    ssh_key_type: 'rsa'

в файле create_simple.yml У меня есть это:

- name: 'test'
  debug: msg='{{ resultat.1.gname }}'
  with_subelements:
    - "{{ lookup('dict', user) }}"
    - groups
  loop_control:
    loop_var: resultat

Но у меня есть это сообщение:

FAILED! => {"msg": "An unhandled exception occurred while running the lookup plugin 'dict'. Error was a <class 'ansible.errors.AnsibleError'>, original message: with_dict expects a dict"}

пользовательская переменная var в элементе with_items файла create.yml выглядит как диктат, который я тестировал для преобразования пользовательской переменной var в текст, но он не работает.

1 Ответ

1 голос
/ 21 января 2020

with_subelements требуется список хэшей (т.е. словарей) и ключ для поиска в каждом элементе этого списка, но список хэшей, возвращаемый lookup('dict', user), будет возвращать что-то вроде:

[ 
  {
    "key": "comment", 
    "value": "comment user1"
  }, 
  {
    "key": "shell", 
    "value": "/bin/bash"
  }, 
  {
    "key": "name", 
    "value": "user1"
  }
  ...
]

И with_subelements попытается найти ключ groups в каждом из словарей в этом списке, что не получается.

  with_subelements:
    - "{{ lookup('dict', user) }}" # Wrong: items in this list of dict does not have 'groups' keys
    - groups # OK: this a field name to lookup

В включенной create_simple.yml переменная user будет словарь, такой как:

name: 'user1'
simple: False
groups:
  - gname: 'secondary'
    gid: 30000
...

Если вы хотите перечислить groups каждый раз, когда create_simple.yml включен, вы можете сделать в create_simple.yml:

- name: 'test'
  debug: 
    msg: '{{ resultat.gname }}'
  with_items: "{{ user.groups }}"
  loop_control:
    loop_var: resultat

Или даже проще, если вам нужна только одна задача в create_simple.yml, вы можете напрямую использовать with_subelements вместо include_tasks в create.yml:

# this will lookup field 'groups' in each element of the 'userslist' variable
- name: 'Create'
  debug:
    msg: "Group for user {{ resultat.0.name }}: {{ resultat.1.gname }}"
  with_subelements:
    - "{{ userslist }}"
    - groups  
  loop_control:
    loop_var: resultat
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...