
Sou totalmente iniciante em Ansible e Python. Eu tenho uma lista:
my_items:
- name: item1
unix_user: unixuser1
homedir: /home/unixuser2
- name: item2
unix_user: unixuser2
homedir: /home/unixuser2
Gostaria de criar um usuário virtual pureftpd para cada um dos "my_items".
A função aguarda uma variável como esta:
my_items:
- name: item1
unix_user: unixuser1
homedir: /home/unixuser2
uid: 1001
guid: 1001
- name: item2
unix_user: unixuser2
homedir: /home/unixuser2
uid: 1002
guid: 1002
Eu sei como recuperar o uid/guid (usando getent). Consigo adicionar as novas chaves/valores a cada item:
- name: "Populate UID and GID in my_items"
set_fact:
item: "{{ item | combine( { 'uid': getent_passwd[item.unix_user][1], 'gid': getent_passwd[item.unix_user][2] }) }}"
with_items: "{{ my_items }}"
Mas é claro que a variável "global" my_items não é atualizada.
Tentei criar um novo "dicionário", mas não consigo entender tantos conceitos ao mesmo tempo.
Qualquer ajuda seria apreciada!
Responder1
Finalmente consegui fazer funcionar.
- name: "getent variables"
getent:
database: passwd
- name: Create Dictionary for FTP accounts
set_fact:
ftp_accounts: >
{{ ftp_accounts | default([]) + [{
'name': item.unix_user,
'password': item.ftp_password,
'homedir': item.path,
'uid': getent_passwd[item.unix_user][1],
'guid': getent_passwd[item.unix_user][2]
} ] }}
with_items:
"{{ my_items }}"
Então, posso enviar meu novo ditado para minha função:
- name: gcoop-libre.pure-ftpd
vars:
pureftpd_virtual_users: "{{ ftp_accounts }}"
Tenha cuidado, eu estava trabalhando no localhost, mas os usuários Unix são (obviamente) criados apenas no controle remoto, então getent_passwd[item.unix_user] estava indefinido, levando a uma mensagem de erro enigmática (coagindo para Unicode: precisa de string ou buffer, lista encontrada ).