Saltstack Official Users Formula
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

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