Я хотел бы настроить несколько открытых ключей ssh для пользователей, сегодня у меня есть кое-что, что уже может настроить только один ключ:
users:
user1:
comment: "User 1"
sshkey: "ssh-rsa ******** user1"
state: present
user2:
comment: "User 2"
sshkey: "ssh-rsa ******** user2"
state: present
user3:
comment: "User 3"
sshkey: "ssh-rsa ******** user3"
state: present
и моя игра:
- name: set authorized_keys
ansible.posix.authorized_key:
user: "{{ item.key }}"
state: "{{ item.value.state }}"
key: "{{ item.value.sshkey }}"
with_dict: "{{ users }}"
when: item.value.state == "present" and item.value.sshkey is defined
Я хотел бы иметь возможность в своем users
var передавать несколько ключей для одного пользователя, что-то вроде:
users:
user1:
comment: "User 1"
sshkeys:
- ssh-rsa ******** user1.key
state: present
user2:
comment: "User 2"
sshkeys:
- ssh-rsa ******** user2.key-a
- ssh-rsa ******** user2.key-b
state: present
user3:
comment: "User 3"
sshkeys:
- ssh-rsa ******** user2.key-a
- ssh-rsa ******** user2.key-b
- ssh-rsa ******** user3.key-c
state: present
Но я понятия не имею, как мне перебирать этот sshkeys
список.
Решение проблемы
В примере вы проверяете наличие атрибута sshkeys. Я предполагаю, что это связано с тем, что этот атрибут может отсутствовать в словаре. Удалим этот атрибут из user3 для тестирования
users:
user1:
comment: User 1
sshkeys:
- ssh-rsa ******** user1.key
state: present
user2:
comment: User 2
sshkeys:
- ssh-rsa ******** user2.key-a
- ssh-rsa ******** user2.key-b
state: present
user3:
comment: User 3
state: present
В: «Как мне перебрать этот список sshkeys? »
A1: Нет необходимости повторять список sshkeys. Можно настроить их все за один шаг. Цитата из эксклюзива:
В одном строковом значении ключа можно указать несколько ключей, разделив их символами новой строки.
Например
- debug:
msg: |-
user: {{ item.key }}
state: {{ item.value.state }}
key: {{ item.value.sshkeys|join('\n') }}
loop: "{{ users|dict2items }}"
when:
- item.value.state == 'present'
- item.value.sshkeys|d([])|length > 0
дает (сокращенно)
msg: |-
user: user1
state: present
key: ssh-rsa ******** user1.key
msg: |-
user: user2
state: present
key: ssh-rsa ******** user2.key-a\nssh-rsa ******** user2.key-b
Если вы хотите повторить ключи, перейдите к следующему варианту.
A2: В качестве первого шага добавьте атрибут sshkeys, если он отсутствует.
- set_fact:
users: "{{ dict(_keys|zip(_vals_update)) }}"
vars:
_keys: "{{ users.keys()|list }}"
_vals: "{{ users.values()|list }}"
_vals_update: "{{ [{'sshkeys': []}]|
product(_vals)|
map('combine')|list }}"
дает
users:
user1:
comment: User 1
sshkeys:
- ssh-rsa ******** user1.key
state: present
user2:
comment: User 2
sshkeys:
- ssh-rsa ******** user2.key-a
- ssh-rsa ******** user2.key-b
state: present
user3:
comment: User 3
sshkeys: []
state: present
Теперь повторите словарь с подэлементами
- debug:
msg: >-
user: {{ item.0.key }}
state: {{ item.0.value.state }}
key: {{ item.1 }}
with_subelements:
- "{{ users|dict2items }}"
- value.sshkeys
when: item.0.value.state == 'present'
дает (сокращенно)
msg: 'user: user1 state: present key: ssh-rsa ******** user1.key'
msg: 'user: user2 state: present key: ssh-rsa ******** user2.key-a'
msg: 'user: user2 state: present key: ssh-rsa ******** user2.key-b'
Комментариев нет:
Отправить комментарий