Ansible - Создание пользователя при соблюдении критериев класса сервера

Ansible - Создание пользователя при соблюдении критериев класса сервера

Я новый пользователь ansible, перехожу с коллекции скриптов оболочки на ansible playbooks. Моя текущая система управления пользователями позволяет добавлять пользователя в систему только в том случае, если этому пользователю предоставлен доступ к этому классу сервера, местоположению и среде (или если любой из них установлен как wildcard/any).

Класс сервера, местоположение и среда хранятся локально на самом клиентском сервере в виде файла (доступного только для чтения/записи), который выглядит следующим образом:

LD_CLASS="app"
LD_LOC="dfw"
LD_ENV="prod"

Я нашел несколько примеров, которые, как мне кажется, похожи на то, что я хочу, я все еще не уверен, как получить переменные из ansible-клиента, а также как убедиться, что все 3 требования класса, местоположения и среды выполнены перед добавлением пользователя. Я представляю себе файл переменных следующим образом:

users:
 -name: user1
  uid: 60001
  gid: 60001
  class: app
  location: any
  env: dev
 -name: user2
  uid: 60002
  gid: 60002
  class: app
  location: dfw
  env: prod 

С записью пользовательского модуля, которая выглядит примерно так на основе переменных, собранных из настраиваемого мной клиента Ansible (обратите внимание на псевдокод, потому что я не уверен, как на самом деле это сделать):

- user:
    name: '{{ item.name }}'
    state: '{ (If $LD_LOC matches location variable, or is set to any) & ($LD_ENV matches env variable, or is set to any) & ($LD_CLASS matches class variable, or is set to any) } present{% else %}absent{% endif %}'
    uid: '{{ item.uid }}'
   with_items: users

Я бы предпочел не полагаться на роли ansible, а вместо этого получать данные о классе, местоположении и среде из самого клиента ansible, по крайней мере частично, потому что это система, которая у нас есть в настоящее время, и она помогает нам легко перейти на ansible, сохраняя некоторые существующие и знакомые инструменты. Возможно ли то, что я ищу?

решение1

Есть такая функция, называетсяместные фактыв Ansible:

  • Измените файл «свойств» так, чтобы он выглядел следующим образом, сохраните его в /etc/ansible/facts.d/server_meta.fact, и примените необходимые разрешения:

    [settings]
    ld_class=app
    ld_loc=dfw
    ld_env=prod
    
  • Затем запустите свой сценарий и укажите эти факты в stateпараметре:

    state: "{{ (ansible_local.server_meta.settings.ld_loc == 'dfw' and ansible_local.server_meta.settings.ld_class == 'app' and ansible_local.server_meta.settings.ld_env == 'prod' ) | ternary('present', 'absent') }}"
    

Связанный контент