Как я могу найти идентификатор пользователя с помощью ansible и использовать его в шаблоне jinja2? - PullRequest
0 голосов
/ 26 февраля 2020

Я должен создать количество пользователей, используя ansible. Я передаю пользователей в виде списка в моей игре ansible в разделе vars:

  vars:
    users: ['user1', 'user2']

Затем мне нужно создать скрипт, который использует идентификатор этого пользователя в качестве аргумента. Команда внутри скрипта выглядит примерно так:

blobfuse $1 --tmp-path=/mnt/resource/{{ item }}/ -o attr_timeout=240 -o entry_timeout=240 -o negative_timeout=120 -o uid=$USER_ID -o allow_other --container-name={{ item }} --file-cache-timeout-in-seconds=120 --config-file=/root/connection-{{ item }}.cfg

Все отлично работает, за исключением uid = Я пробовал с плагином канала поиска, но это не дает мне правильный UID:

{{ lookup('pipe', 'grep -w {{ item }} /etc/passwd | cut -d : -f3') }}

Моя конечная цель - получить UID каждого из созданных пользователей и передать его команде blobfuse выше.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2020

Q: "Получить UID каждого из созданных пользователей."

A: Модуль getent служит именно для этой цели. Например,

- hosts: localhost
  vars:
    my_users: ['root', 'admin']
  tasks:
    - getent:
        database: passwd
    - debug:
        msg:
          - "{{ item }} uid: {{ getent_passwd[item].1 }}"
          - "{{ item }} gid: {{ getent_passwd[item].2 }}"
          - "{{ item }} home: {{ getent_passwd[item].4 }}"
          - "{{ item }} shell: {{ getent_passwd[item].5 }}"
      loop: "{{ my_users }}"

дает

ok: [localhost] => (item=root) => {
    "msg": [
        "root uid: 0", 
        "root gid: 0", 
        "root home: /root", 
        "root shell: /bin/bash"
    ]
}
ok: [localhost] => (item=admin) => {
    "msg": [
        "admin uid: 1002", 
        "admin gid: 1002", 
        "admin home: /home/admin", 
        "admin shell: /bin/bash"
    ]
}

Модуль getent автоматически создал словарь getent_passwd, который можно использовать в шаблоне. Например шаблон

shell> cat template.j2
{% for user in my_users %}
{{ user }} {{ getent_passwd[user].1 }}
{% endfor %}
    - template:
        src: template.j2
        dest: my_users.txt

дает

shell> cat my_users.txt 
root 0
admin 1002
0 голосов
/ 26 февраля 2020

Как насчет использования id команды и подоболочки? Затем вы можете сделать что-то вроде

blobfuse $1 --tmp-path=/mnt/resource/{{ item }}/ -o attr_timeout=240 -o entry_timeout=240 -o negative_timeout=120 -o uid="$(id {{ item }})" -o allow_other --container-name={{ item }} --file-cache-timeout-in-seconds=120 --config-file=/root/connection-{{ item }}.cfg

Если вы используете командный модуль - вам придется заменить его на оболочку.

Редактировать: Если вы используете шаблоны и хотите использовать поисковый плагин, который выглядит чище, вы можете сделать что-то вроде этого (это было проверено на локальной linux машине):

template.yaml

{% for item in users %}
{{ item }} {{ lookup('pipe', "id -u " + item) }}
{% endfor %}

ansible команда

ansible -m template -i localhost, all -c local -a "src=template.yaml dest=result.txt" -e "{ users: [nobody,root]}"

result.txt

nobody 65534
root 0

В вашем случае ошибка заключалась в использовании {{item}} при поиске, вы должны использовать только имена переменных и конкатенацию внутри блока {{}}

...