Saltstack Official Users Formula
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

377 lines
11KB

  1. # vim: sts=2 ts=2 sw=2 et ai
  2. {% from "users/map.jinja" import users with context %}
  3. {% set used_sudo = [] %}
  4. {% set used_googleauth = [] %}
  5. {%- for name, user in pillar.get('users', {}).items()
  6. if user.absent is not defined or not user.absent %}
  7. {%- if user == None -%}
  8. {%- set user = {} -%}
  9. {%- endif -%}
  10. {%- if 'sudouser' in user and user['sudouser'] %}
  11. {%- do used_sudo.append(1) %}
  12. {%- endif %}
  13. {%- if 'google_auth' in user %}
  14. {%- do used_googleauth.append(1) %}
  15. {%- endif %}
  16. {%- endfor %}
  17. {%- if used_sudo or used_googleauth %}
  18. include:
  19. {%- if used_sudo %}
  20. - users.sudo
  21. {%- endif %}
  22. {%- if used_googleauth %}
  23. - users.googleauth
  24. {%- endif %}
  25. {%- endif %}
  26. {% for name, user in pillar.get('users', {}).items()
  27. if user.absent is not defined or not user.absent %}
  28. {%- if user == None -%}
  29. {%- set user = {} -%}
  30. {%- endif -%}
  31. {%- set home = user.get('home', "/home/%s" % name) -%}
  32. {%- if 'prime_group' in user and 'name' in user['prime_group'] %}
  33. {%- set user_group = user.prime_group.name -%}
  34. {%- else -%}
  35. {%- set user_group = name -%}
  36. {%- endif %}
  37. {% for group in user.get('groups', []) %}
  38. users_{{ name }}_{{ group }}_group:
  39. group:
  40. - name: {{ group }}
  41. - present
  42. {% endfor %}
  43. users_{{ name }}_user:
  44. {% if user.get('createhome', True) %}
  45. file.directory:
  46. - name: {{ home }}
  47. - user: {{ name }}
  48. - group: {{ user_group }}
  49. - mode: {{ user.get('user_dir_mode', '0750') }}
  50. - require:
  51. - user: users_{{ name }}_user
  52. - group: {{ user_group }}
  53. {%- endif %}
  54. group.present:
  55. - name: {{ user_group }}
  56. {%- if 'prime_group' in user and 'gid' in user['prime_group'] %}
  57. - gid: {{ user['prime_group']['gid'] }}
  58. {%- elif 'uid' in user %}
  59. - gid: {{ user['uid'] }}
  60. {%- endif %}
  61. user.present:
  62. - name: {{ name }}
  63. - home: {{ home }}
  64. - shell: {{ user.get('shell', users.get('shell', '/bin/bash')) }}
  65. {% if 'uid' in user -%}
  66. - uid: {{ user['uid'] }}
  67. {% endif -%}
  68. {% if 'password' in user -%}
  69. - password: '{{ user['password'] }}'
  70. {% endif -%}
  71. {% if 'enforce_password' in user -%}
  72. - enforce_password: {{ user['enforce_password'] }}
  73. {% endif -%}
  74. {% if user.get('system', False) -%}
  75. - system: True
  76. {% endif -%}
  77. {% if 'prime_group' in user and 'gid' in user['prime_group'] -%}
  78. - gid: {{ user['prime_group']['gid'] }}
  79. {% else -%}
  80. - gid_from_name: True
  81. {% endif -%}
  82. {% if 'fullname' in user %}
  83. - fullname: {{ user['fullname'] }}
  84. {% endif -%}
  85. {% if not user.get('createhome', True) %}
  86. - createhome: False
  87. {% endif %}
  88. {% if 'expire' in user -%}
  89. - expire: {{ user['expire'] }}
  90. {% endif -%}
  91. - remove_groups: {{ user.get('remove_groups', 'False') }}
  92. - groups:
  93. - {{ user_group }}
  94. {% for group in user.get('groups', []) -%}
  95. - {{ group }}
  96. {% endfor %}
  97. - require:
  98. - group: {{ user_group }}
  99. {% for group in user.get('groups', []) -%}
  100. - group: {{ group }}
  101. {% endfor %}
  102. {% if 'ssh_keys' in user or
  103. 'ssh_auth' in user or
  104. 'ssh_auth_file' in user or
  105. 'ssh_auth.absent' in user or
  106. 'ssh_config' in user %}
  107. user_keydir_{{ name }}:
  108. file.directory:
  109. - name: {{ user.get('home', '/home/{0}'.format(name)) }}/.ssh
  110. - user: {{ name }}
  111. - group: {{ user_group }}
  112. - makedirs: True
  113. - mode: 700
  114. - require:
  115. - user: {{ name }}
  116. - group: {{ user_group }}
  117. {%- for group in user.get('groups', []) %}
  118. - group: {{ group }}
  119. {%- endfor %}
  120. {% endif %}
  121. {% if 'ssh_keys' in user %}
  122. {% set key_type = 'id_' + user.get('ssh_key_type', 'rsa') %}
  123. users_user_{{ name }}_private_key:
  124. file.managed:
  125. - name: {{ user.get('home',
  126. '/home/{0}'.format(name)) }}/.ssh/{{ key_type }}
  127. - user: {{ name }}
  128. - group: {{ user_group }}
  129. - mode: 600
  130. - show_diff: False
  131. - contents_pillar: users:{{ name }}:ssh_keys:privkey
  132. - require:
  133. - user: users_{{ name }}_user
  134. {% for group in user.get('groups', []) %}
  135. - group: users_{{ name }}_{{ group }}_group
  136. {% endfor %}
  137. users_user_{{ name }}_public_key:
  138. file.managed:
  139. - name: {{ user.get('home',
  140. '/home/{0}'.format(name)) }}/.ssh/{{ key_type }}.pub
  141. - user: {{ name }}
  142. - group: {{ user_group }}
  143. - mode: 644
  144. - show_diff: False
  145. - contents_pillar: users:{{ name }}:ssh_keys:pubkey
  146. - require:
  147. - user: users_{{ name }}_user
  148. {% for group in user.get('groups', []) %}
  149. - group: users_{{ name }}_{{ group }}_group
  150. {% endfor %}
  151. {% endif %}
  152. {% if 'ssh_auth_file' in user %}
  153. users_authorized_keys_{{ name }}:
  154. file.managed:
  155. - name: {{ home }}/.ssh/authorized_keys
  156. - user: {{ name }}
  157. - group: {{ name }}
  158. - mode: 600
  159. - contents: |
  160. {% for auth in user.ssh_auth_file -%}
  161. {{ auth }}
  162. {% endfor -%}
  163. {% endif %}
  164. {% if 'ssh_auth' in user %}
  165. {% for auth in user['ssh_auth'] %}
  166. users_ssh_auth_{{ name }}_{{ loop.index0 }}:
  167. ssh_auth.present:
  168. - user: {{ name }}
  169. - name: {{ auth }}
  170. - require:
  171. - file: users_{{ name }}_user
  172. - user: users_{{ name }}_user
  173. {% endfor %}
  174. {% endif %}
  175. {% if 'ssh_keys_pillar' in user %}
  176. {% for key_name, pillar_name in user['ssh_keys_pillar'].items() %}
  177. user_ssh_keys_files_{{ name }}_{{ key_name }}_private_key:
  178. file.managed:
  179. - name: {{ user.get('home',
  180. '/home/{0}'.format(name)) }}/.ssh/{{ key_name }}
  181. - user: {{ name }}
  182. - group: {{ user_group }}
  183. - mode: 600
  184. - show_diff: False
  185. - contents_pillar: {{ pillar_name }}:{{ key_name }}:privkey
  186. - require:
  187. - user: users_{{ name }}_user
  188. {% for group in user.get('groups', []) %}
  189. - group: users_{{ name }}_{{ group }}_group
  190. {% endfor %}
  191. user_ssh_keys_files_{{ name }}_{{ key_name }}_public_key:
  192. file.managed:
  193. - name: {{ user.get('home',
  194. '/home/{0}'.format(name)) }}/.ssh/{{ key_name }}.pub
  195. - user: {{ name }}
  196. - group: {{ user_group }}
  197. - mode: 644
  198. - show_diff: False
  199. - contents_pillar: {{ pillar_name }}:{{ key_name }}:pubkey
  200. - require:
  201. - user: users_{{ name }}_user
  202. {% for group in user.get('groups', []) %}
  203. - group: users_{{ name }}_{{ group }}_group
  204. {% endfor %}
  205. {% endfor %}
  206. {% endif %}
  207. {% if 'ssh_auth_sources' in user %}
  208. {% for pubkey_file in user['ssh_auth_sources'] %}
  209. users_ssh_auth_source_{{ name }}_{{ loop.index0 }}:
  210. ssh_auth.present:
  211. - user: {{ name }}
  212. - source: {{ pubkey_file }}
  213. - require:
  214. - file: users_{{ name }}_user
  215. - user: users_{{ name }}_user
  216. {% endfor %}
  217. {% endif %}
  218. {% if 'ssh_auth.absent' in user %}
  219. {% for auth in user['ssh_auth.absent'] %}
  220. users_ssh_auth_delete_{{ name }}_{{ loop.index0 }}:
  221. ssh_auth.absent:
  222. - user: {{ name }}
  223. - name: {{ auth }}
  224. - require:
  225. - file: users_{{ name }}_user
  226. - user: users_{{ name }}_user
  227. {% endfor %}
  228. {% endif %}
  229. {% if 'ssh_config' in user %}
  230. users_ssh_config_{{ name }}:
  231. file.managed:
  232. - name: {{ home }}/.ssh/config
  233. - user: {{ name }}
  234. - group: {{ user_group }}
  235. - mode: 640
  236. - contents: |
  237. # Managed by Saltstack
  238. # Do Not Edit
  239. {% for label, setting in user.ssh_config.items() %}
  240. # {{ label }}
  241. Host {{ setting.get('hostname') }}
  242. {%- for opts in setting.get('options') %}
  243. {{ opts }}
  244. {%- endfor %}
  245. {% endfor -%}
  246. {% endif %}
  247. {% if 'sudouser' in user and user['sudouser'] %}
  248. users_sudoer-{{ name }}:
  249. file.managed:
  250. - name: {{ users.sudoers_dir }}/{{ name }}
  251. - user: root
  252. - group: {{ users.root_group }}
  253. - mode: '0440'
  254. {% if 'sudo_rules' in user or 'sudo_defaults' in user %}
  255. {% if 'sudo_rules' in user %}
  256. {% for rule in user['sudo_rules'] %}
  257. "validate {{ name }} sudo rule {{ loop.index0 }} {{ name }} {{ rule }}":
  258. cmd.run:
  259. - name: 'visudo -cf - <<<"$rule" | { read output; if [[ $output != "stdin: parsed OK" ]] ; then echo $output ; fi }'
  260. - stateful: True
  261. - shell: {{ users.visudo_shell }}
  262. - env:
  263. # Specify the rule via an env var to avoid shell quoting issues.
  264. - rule: "{{ name }} {{ rule }}"
  265. - require_in:
  266. - file: users_{{ users.sudoers_dir }}/{{ name }}
  267. {% endfor %}
  268. {% endif %}
  269. {% if 'sudo_defaults' in user %}
  270. {% for entry in user['sudo_defaults'] %}
  271. "validate {{ name }} sudo Defaults {{ loop.index0 }} {{ name }} {{ entry }}":
  272. cmd.run:
  273. - name: 'visudo -cf - <<<"$rule" | { read output; if [[ $output != "stdin: parsed OK" ]] ; then echo $output ; fi }'
  274. - stateful: True
  275. - shell: {{ users.visudo_shell }}
  276. - env:
  277. # Specify the rule via an env var to avoid shell quoting issues.
  278. - rule: "Defaults:{{ name }} {{ entry }}"
  279. - require_in:
  280. - file: users_{{ users.sudoers_dir }}/{{ name }}
  281. {% endfor %}
  282. {% endif %}
  283. users_{{ users.sudoers_dir }}/{{ name }}:
  284. file.managed:
  285. - name: {{ users.sudoers_dir }}/{{ name }}
  286. - contents: |
  287. {%- if 'sudo_defaults' in user %}
  288. {%- for entry in user['sudo_defaults'] %}
  289. Defaults:{{ name }} {{ entry }}
  290. {%- endfor %}
  291. {%- endif %}
  292. {%- if 'sudo_rules' in user %}
  293. {%- for rule in user['sudo_rules'] %}
  294. {{ name }} {{ rule }}
  295. {%- endfor %}
  296. {%- endif %}
  297. - require:
  298. - file: users_sudoer-defaults
  299. - file: users_sudoer-{{ name }}
  300. {% endif %}
  301. {% else %}
  302. users_{{ users.sudoers_dir }}/{{ name }}:
  303. file.absent:
  304. - name: {{ users.sudoers_dir }}/{{ name }}
  305. {% endif %}
  306. {%- if 'google_auth' in user %}
  307. {%- for svc in user['google_auth'] %}
  308. users_googleauth-{{ svc }}-{{ name }}:
  309. file.managed:
  310. - replace: false
  311. - name: {{ users.googleauth_dir }}/{{ name }}_{{ svc }}
  312. - contents_pillar: 'users:{{ name }}:google_auth:{{ svc }}'
  313. - user: root
  314. - group: {{ users.root_group }}
  315. - mode: 400
  316. - require:
  317. - pkg: users_googleauth-package
  318. {%- endfor %}
  319. {%- endif %}
  320. {% endfor %}
  321. {% for name, user in pillar.get('users', {}).items()
  322. if user.absent is defined and user.absent %}
  323. users_absent_user_{{ name }}:
  324. {% if 'purge' in user or 'force' in user %}
  325. user.absent:
  326. - name: {{ name }}
  327. {% if 'purge' in user %}
  328. - purge: {{ user['purge'] }}
  329. {% endif %}
  330. {% if 'force' in user %}
  331. - force: {{ user['force'] }}
  332. {% endif %}
  333. {% else %}
  334. user.absent:
  335. - name: {{ name }}
  336. {% endif -%}
  337. users_{{ users.sudoers_dir }}/{{ name }}:
  338. file.absent:
  339. - name: {{ users.sudoers_dir }}/{{ name }}
  340. {% endfor %}
  341. {% for user in pillar.get('absent_users', []) %}
  342. users_absent_user_2_{{ user }}:
  343. user.absent
  344. users_2_{{ users.sudoers_dir }}/{{ user }}:
  345. file.absent:
  346. - name: {{ users.sudoers_dir }}/{{ user }}
  347. {% endfor %}
  348. {% for group in pillar.get('absent_groups', []) %}
  349. users_absent_group_{{ group }}:
  350. group.absent:
  351. - name: {{ group }}
  352. {% endfor %}