Я новый пользователь 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') }}"