LINUX.ORG.RU

Создание аккаунтов сценарием Ansible

 ,


0

1

Привет!

https://github.com/greydjin/publicansible

Вот таким сценарием пользуюсь для создания списка аккаунтов с публичными ключами, на своим машинах. Стало подбешивать что для того чтобы создать группу юзеров с правами support на Некоторых хостах - нужно каждый хост прописывать, не получается сделать так чтобы сценарий понимал когда я указываю группу из файла инвенторя, кто-нибудь знает как поправить?

- name: create users
  user:
    name: '{{ item.key }}'
    state: present
    shell: /bin/bash
    groups: "{{ item.value['all'] | default('') or item.value[inventory_hostname] | default('') }}"
  with_dict: "{{ avon_users.permissions }}"
  when:
- item.value['all'] is defined or item.value[inventory_hostname] is defined

Переменная inventory_hostname успешно ищется и возвращает правильный результат, а переменная groups или groups_name не работает.

Вот в папке vars есть файл avon_users.yml и там я пишу какие пользователи к каким группа относятся и какие группы пользователей нужно создать на каждом хосте

roles:
    admin: &admin {
      "all":                  "avon-admin",
    }
    support: &support {
      "dev":                 "avon-support",
    }
    audit: &audit {
      "frontend":            "avon-admin",
    }

  permissions:
    # Global admins
    Vasu:
      <<: *admin
    Gila:
      <<: *admin
    Patu:
      <<: *support
    Fira:
      <<: *audit

Вот у меня тут пользователи Vasu и Gile - в группе admin, а пользователи из группы admin - создаются на всех хостах all
дальше сложнее, пользователь Patu из группы support, а группа support, а пользователи из этой группы должны создаваться на группе хостов. Группа хостов называется dev, я ее сюда написал, но пользователи не создаются. Потому что

- name: create users
  user:
    name: '{{ item.key }}'
    state: present
    shell: /bin/bash
    groups: "{{ item.value['all'] | default('') or item.value[inventory_hostname] | default('') }}"
  with_dict: "{{ avon_users.permissions }}"
  when:
- item.value['all'] is defined or item.value[inventory_hostname] is defined
Тут нет поиска по существующим Группам хостов из файла hosts.ini

GreyDjin
() автор топика
Ответ на: комментарий от GreyDjin

Тут нет поиска по существующим Группам хостов из файла hosts.ini

Не очень понял, в чем проблема. groups же обычный словарь, и к нему можно обращаться groups[group_name], получая список хостов из группы

Если есть inventory из нескольких групп хостов, можно, например, в цикле пройтись по хостам из любой группы

[group1]
host2
host3

[group2]
host2
host5
host6

[group3]
host1
host2

---
- hosts: localhost
  vars:
    test_group: "group2"
  tasks:
    - debug:
        msg: "find {{ item }}"
      with_items: "{{ groups[test_group] }}"
TASK [debug] 
ok: [localhost] => (item=host2) => {
    "msg": "find host2"
}
ok: [localhost] => (item=host5) => {
    "msg": "find host5"
}
ok: [localhost] => (item=host6) => {
    "msg": "find host6"
}

Или вопрос в другом?

CaHbl4
()
Ответ на: комментарий от CaHbl4

если я правильно понял, можно переписать часть roles как-то так

roles:
    admin: &admin {
      group: "all", role: "avon-admin"
    }
    support: &support {
      group: "dev", role: "avon-support"
    }
    audit: &audit {
      group: "frontend", role: "avon-admin"
    }

И изменения в плейбуке

- name: create users
  user:
    name: '{{ item.key }}'
    state: present
    shell: /bin/bash
    groups: "{{ item.value.role | default('') or item.value[inventory_hostname] | default('') }}"
  with_dict: "{{ avon_users.permissions }}"
  when: item.value.group in group_names and inventory_hostname in groups[item.value.group]

соотвественно идет проверка, что текущая группа существует в инвентори, а текущий хост находится в группе

CaHbl4
()
Ответ на: комментарий от CaHbl4

Да, идея верная в том - что именно это мне и нужно получить. Я попробовал записать ваш вариант, сценарий валится с ошибкой

 new create users 
****fatal: [db-dev-avon1]: FAILED! => {"msg": "The conditional check 'item.value.group in group_names 
and inventory_hostname in groups[item.value.group]' failed. The error was: error while 
evaluating conditional (item.value.group in group_names and inventory_hostname in 
groups[item.value.group]): 'dict object' has no attribute 'group'

То есть, вот по этой ссылке видно https://github.com/greydjin/publicansible что у меня плейбук единственный db-dev-avon1.yml в нем указан единственный хост db-dev-avon1 и роль для хоста - сделать юзеров. В файле hosts.ini видно что этот хост является частью группы dev.
В файле переменных для роли var/avon_users.yml указано

 support: &support {
      "dev":                 "avon-support",
То есть я подразумеваю что для хостов входящих в группу dev будут созданы все юзеры из группы support c правами avon-support.

Поменял как в вашем примере

support: &support {
      group: "dev", role: "avon-support"
    }
И вот эта ошибка. «Объект не имеет атрибута group»

GreyDjin
() автор топика
Ответ на: комментарий от GreyDjin

Такс, я понял почему. Я сделал так на самом деле

roles:
    admin: &admin {
      group: "all", role: "avon-admin"
    }
    support: &support {
      group: "dev", role: "avon-support"
    }
    audit: &audit {
      "frontend":            "avon-admin",
    }

На это он и ругался сильно, что у какого-то объекта нет характеристики group. Но получается, если сделать как вы советуете - у меня пропадает возможность указывать хост в ролях, только группу могу указать, потому что если группы нет - сценарий падает. Подумаю как это обойти

GreyDjin
() автор топика
Ответ на: комментарий от GreyDjin

Оказывается эта штука тоже не работает.

group: "all", role: "avon-admin"

Потому что group_names раскрывается только в то что записано в [] в файле инвенторя. https://stackoverflow.com/questions/46741642/group-names-variable-in-ansible

Пока что делаю сделать так

roles:
    admin: &admin {
      "all",  "avon-admin"
    }
    support: &support {
      group: "dev", role: "avon-support"
    }
    audit: &audit {
      "frontend", "avon-admin"
    }
и
- name: create users
  user:
    name: '{{ item.key }}'
    state: present
    shell: /bin/bash
    groups: "{{ item.value['all'] | default('') or item.value[inventory_hostname] | default('') }}"
  with_dict: "{{ avon_users.permissions }}"
  when:
    - item.value['all'] is defined or item.value[inventory_hostname] is defined or or (item.value.group in group_names and inventory_hostname in groups[item.value.group])
Таким образом у меня создаются на любом хосте пользователи группы admin, плюс к ним на хостах из хостгруппы dev создаются пользователи группы support, а если это хост frontend то там создастся пользователи из группы audit, но не создадутся пользователи группы support, как и задумано.

Осталось решить проблему когда проверяется соответствие хоста и role для этого хоста было

- name: unlock passwordless users
  shell: "/usr/sbin/usermod -p '*' {{ item.key }}"
  with_dict: '{{ avon_users.permissions }}'
  when:
    - (item.value[inventory_hostname] is defined and item.value[inventory_hostname] is match('.*avon-(admin|deployer|support|automation).*')) or
      (item.value['all'] is defined and item.value['all'] is match('.*avon-(admin|deployer|support|automation).*'))
Теперь мне надо добавить дополнительную проверку when и чет не выходит.
- (item.value[inventory_hostname] is defined and item.value[inventory_hostname] is match('.*avon-(admin|deployer|support|automation).*')) or
      (item.value['all'] is defined and item.value['all'] is match('.*avon-(admin|deployer|support|automation).*')) or
      (item.value.group is defined and item.value.group is match('.*avon-(admin|deployer|support|automation).*'))

GreyDjin
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.