Saltstack Official Linux Formula
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

267 lines
7.8KB

  1. {%- from "linux/map.jinja" import system with context %}
  2. {%- if system.enabled %}
  3. linux_repo_prereq_pkgs:
  4. pkg.installed:
  5. - pkgs: {{ system.pkgs }}
  6. # global proxy setup
  7. {%- if system.proxy.get('pkg', {}).get('enabled', False) %}
  8. {%- if grains.os_family == 'Debian' %}
  9. /etc/apt/apt.conf.d/99proxies-salt:
  10. file.managed:
  11. - template: jinja
  12. - source: salt://linux/files/apt.conf.d_proxies
  13. - defaults:
  14. external_host: False
  15. https: {{ system.proxy.get('pkg', {}).get('https', None) | default(system.proxy.get('https', None), true) }}
  16. http: {{ system.proxy.get('pkg', {}).get('http', None) | default(system.proxy.get('http', None), true) }}
  17. ftp: {{ system.proxy.get('pkg', {}).get('ftp', None) | default(system.proxy.get('ftp', None), true) }}
  18. {%- else %}
  19. /etc/apt/apt.conf.d/99proxies-salt:
  20. file.absent
  21. {%- endif %}
  22. {%- endif %}
  23. {% set default_repos = {} %}
  24. {%- if system.purge_repos|default(False) %}
  25. purge_sources_list_d_repos:
  26. file.directory:
  27. - name: /etc/apt/sources.list.d/
  28. - clean: True
  29. {%- endif %}
  30. {%- for name, repo in system.repo.items() %}
  31. {%- set name=repo.get('name', name) %}
  32. {%- if grains.os_family == 'Debian' %}
  33. # per repository proxy setup
  34. {%- if repo.get('proxy', {}).get('enabled', False) %}
  35. {%- set external_host = repo.proxy.get('host', None) or repo.source.split('/')[2] %}
  36. /etc/apt/apt.conf.d/99proxies-salt-{{ name }}:
  37. file.managed:
  38. - template: jinja
  39. - source: salt://linux/files/apt.conf.d_proxies
  40. - defaults:
  41. external_host: {{ external_host }}
  42. https: {{ repo.proxy.get('https', None) or system.proxy.get('pkg', {}).get('https', None) | default(system.proxy.get('https', None), True) }}
  43. http: {{ repo.proxy.get('http', None) or system.proxy.get('pkg', {}).get('http', None) | default(system.proxy.get('http', None), True) }}
  44. ftp: {{ repo.proxy.get('ftp', None) or system.proxy.get('pkg', {}).get('ftp', None) | default(system.proxy.get('ftp', None), True) }}
  45. {%- else %}
  46. /etc/apt/apt.conf.d/99proxies-salt-{{ name }}:
  47. file.absent
  48. {%- endif %}
  49. {%- if repo.pin is defined %}
  50. linux_repo_{{ name }}_pin:
  51. file.managed:
  52. - name: /etc/apt/preferences.d/{{ name }}
  53. - source: salt://linux/files/preferences_repo
  54. - template: jinja
  55. - defaults:
  56. repo_name: {{ name }}
  57. {%- else %}
  58. linux_repo_{{ name }}_pin:
  59. file.absent:
  60. - name: /etc/apt/preferences.d/{{ name }}
  61. {%- endif %}
  62. {%- if repo.get('key') %} {# 2 #}
  63. linux_repo_{{ name }}_key:
  64. {% if grains['saltversioninfo'] < [2017, 7] %}
  65. cmd.run:
  66. - name: |
  67. echo "{{ repo.key | indent(12) }}" | apt-key add -
  68. {%- if not grains.get('kitchen-test') %}
  69. {# omitted from tests, as behaves inconsistently across CI/platforms #}
  70. - unless: |
  71. apt-key finger --with-colons | grep -qF $(echo "{{ repo.key| indent(12) }}" | gpg --with-fingerprint --with-colons | grep -E '^fpr')
  72. {%- endif %}
  73. {%- else %}
  74. module.run:
  75. - name: pkg.add_repo_key
  76. - text: |
  77. {{ repo.key | indent(10) }}
  78. {%- endif %}
  79. - require_in:
  80. {%- if repo.get('default', False) %}
  81. - file: default_repo_list
  82. {% else %}
  83. - pkgrepo: linux_repo_{{ name }}
  84. {% endif %}
  85. {# key_url fetch by curl when salt <2017.7, higher version of salt has fixed bug for using a proxy_host/port specified at minion.conf #}
  86. {#
  87. NOTE: curl/cmd.run usage to fetch gpg key has limited functionality behind proxy. Environments with salt >= 2017.7 should use
  88. key_url specified at pkgrepo.manage state (which uses properly configured http_host at minion.conf). Older versions of
  89. salt require to have proxy set at ENV and curl way to fetch gpg key here can have a sense for backward compatibility.
  90. Be aware that as of salt 2018.3 no_proxy option is not implemented at all.
  91. #}
  92. {%- elif repo.key_url|default(False) and grains['saltversioninfo'] < [2017, 7] and not repo.key_url.startswith('salt://') %}
  93. linux_repo_{{ name }}_key:
  94. cmd.run:
  95. - name: "curl -sL {{ repo.key_url }} | apt-key add -"
  96. {%- if not grains.get('kitchen-test') %}
  97. {# omitted from tests, as behaves inconsistently across CI/platforms #}
  98. - unless: "apt-key finger --with-colons | grep -qF $(curl -sL {{ repo.key_url }} | gpg --with-fingerprint --with-colons | grep -E '^fpr')"
  99. {%- endif %}
  100. - require_in:
  101. {%- if repo.get('default', False) %}
  102. - file: default_repo_list
  103. {% else %}
  104. - pkgrepo: linux_repo_{{ name }}
  105. {% endif %}
  106. {%- endif %} {# 2 #}
  107. {%- if repo.get('default', False) %} {# 1 #}
  108. {%- do default_repos.update({name: repo}) %} {# for 'default' repos #}
  109. {%- else %} {# for all others repos #}
  110. {%- if repo.get('enabled', True) %}
  111. linux_repo_{{ name }}:
  112. pkgrepo.managed:
  113. {%- if repo.ppa is defined %}
  114. - ppa: {{ repo.ppa }}
  115. {%- else %}
  116. - humanname: {{ name }}
  117. - name: {{ repo.source }}
  118. {%- if repo.architectures is defined %}
  119. - architectures: {{ repo.architectures }}
  120. {%- endif %}
  121. - file: /etc/apt/sources.list.d/{{ name }}.list
  122. - clean_file: {{ repo.clean|default(True) }}
  123. {%- if repo.key_id is defined %}
  124. - keyid: {{ repo.key_id }}
  125. {%- endif %}
  126. {%- if repo.key_server is defined %}
  127. - keyserver: {{ repo.key_server }}
  128. {%- endif %}
  129. {%- if repo.key_url is defined and (grains['saltversioninfo'] >= [2017, 7] or repo.key_url.startswith('salt://')) %}
  130. - key_url: {{ repo.key_url }}
  131. {%- endif %}
  132. - consolidate: {{ repo.get('consolidate', False) }}
  133. - clean_file: {{ repo.get('clean_file', False) }}
  134. - refresh_db: {{ repo.get('refresh_db', True) }}
  135. - require:
  136. - pkg: linux_repo_prereq_pkgs
  137. {%- if repo.get('proxy', {}).get('enabled', False) %}
  138. - file: /etc/apt/apt.conf.d/99proxies-salt-{{ name }}
  139. {%- endif %}
  140. {%- if system.proxy.get('pkg', {}).get('enabled', False) %}
  141. - file: /etc/apt/apt.conf.d/99proxies-salt
  142. {%- endif %}
  143. {%- if system.purge_repos|default(False) %}
  144. - file: purge_sources_list_d_repos
  145. {%- endif %}
  146. {%- endif %}
  147. {%- else %}
  148. linux_repo_{{ name }}_absent:
  149. pkgrepo.absent:
  150. {%- if repo.ppa is defined %}
  151. - ppa: {{ repo.ppa }}
  152. {%- if repo.key_id is defined %}
  153. - keyid_ppa: {{ repo.keyid_ppa }}
  154. {%- endif %}
  155. {%- else %}
  156. - file: /etc/apt/sources.list.d/{{ name }}.list
  157. {%- if repo.key_id is defined %}
  158. - keyid: {{ repo.key_id }}
  159. {%- endif %}
  160. {%- endif %}
  161. file.absent:
  162. - name: /etc/apt/sources.list.d/{{ name }}.list
  163. {%- endif %}
  164. {%- endif %} {# 1 #}
  165. {#- os_family Debian #}
  166. {%- endif %}
  167. {%- if grains.os_family == "RedHat" %}
  168. {%- if repo.get('enabled', True) %}
  169. {%- if repo.get('proxy', {}).get('enabled', False) %}
  170. # PLACEHOLDER
  171. # TODO, implement per proxy configuration for Yum
  172. {%- endif %}
  173. {%- if not repo.get('default', False) %}
  174. linux_repo_{{ name }}:
  175. pkgrepo.managed:
  176. - name: {{ name }}
  177. - humanname: {{ repo.get('humanname', name) }}
  178. {%- if repo.mirrorlist is defined %}
  179. - mirrorlist: {{ repo.mirrorlist }}
  180. {%- else %}
  181. - baseurl: {{ repo.source }}
  182. {%- endif %}
  183. - gpgcheck: {% if repo.get('gpgcheck', False) %}1{% else %}0{% endif %}
  184. {%- if repo.gpgkey is defined %}
  185. - gpgkey: {{ repo.gpgkey }}
  186. {%- endif %}
  187. - require:
  188. - pkg: linux_repo_prereq_pkgs
  189. {%- endif %}
  190. {#- repo.enabled is false #}
  191. {%- else %}
  192. pkgrepo.absent:
  193. - name: {{ repo.source }}
  194. {%- endif %}
  195. {#- os_family Redhat #}
  196. {%- endif %}
  197. {#- repo.items() loop #}
  198. {%- endfor %}
  199. {%- if default_repos|length > 0 and grains.os_family == 'Debian' %}
  200. default_repo_list:
  201. file.managed:
  202. - name: /etc/apt/sources.list
  203. - source: salt://linux/files/sources.list
  204. - template: jinja
  205. - user: root
  206. - group: root
  207. - mode: 0644
  208. {%- if system.purge_repos|default(False) %}
  209. - replace: True
  210. {%- endif %}
  211. - defaults:
  212. default_repos: {{ default_repos }}
  213. - require:
  214. - pkg: linux_repo_prereq_pkgs
  215. refresh_default_repo:
  216. module.wait:
  217. - name: pkg.refresh_db
  218. - watch:
  219. - file: default_repo_list
  220. {%- endif %}
  221. {%- endif %}