Я новый пользователь ansible, перехожу с коллекции сценариев оболочки на доступные playbooks. Моя текущая система управления пользователями позволяет добавлять пользователя в систему только в том случае, если этому пользователю предоставлен доступ к этому классу сервера, местоположению и среде (или если для любого из них задан подстановочный знак / любой).
Класс сервера, местоположение и среда хранятся локально на самом клиентском сервере в виде (корневого, доступного только для чтения / записи) файла, который выглядит следующим образом:
LD_CLASS="app"
LD_LOC="dfw"
LD_ENV="prod"
Я нашел несколько примеров, которые, на мой взгляд, похожи на то, что я хочу, я все еще не уверен, как получить переменные из доступного клиента, а также как убедиться, что все 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
С записью пользовательского модуля, которая выглядит примерно так на основе переменных, собранных из настраиваемого мною доступного клиента (обратите внимание на псевдокод, потому что я не уверен, как бы я на самом деле это сделал):
- 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:
Измените файл "свойств", чтобы он выглядел следующим образом, сохраните его в /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') }}"