Saltstack Official Linux Formula
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

418 行
11KB

  1. {%- from "linux/map.jinja" import network with context %}
  2. {%- from "linux/map.jinja" import system with context %}
  3. {%- if network.enabled %}
  4. {%- if network.get('dpdk', {}).get('enabled', False) %}
  5. include:
  6. - linux.network.dpdk
  7. {%- endif %}
  8. {%- macro set_param(param_name, param_dict) -%}
  9. {%- if param_dict.get(param_name, False) -%}
  10. - {{ param_name }}: {{ param_dict[param_name] }}
  11. {%- endif -%}
  12. {%- endmacro -%}
  13. {%- if network.bridge != 'none' %}
  14. linux_network_bridge_pkgs:
  15. pkg.installed:
  16. {%- if network.bridge == 'openvswitch' %}
  17. - pkgs: {{ network.ovs_pkgs }}
  18. {%- else %}
  19. - pkgs: {{ network.bridge_pkgs }}
  20. {%- endif %}
  21. {%- endif %}
  22. {%- for f in network.get('concat_iface_files', []) %}
  23. {%- if salt['file.file_exists'](f.src) %}
  24. append_{{ f.src }}_{{ f.dst }}:
  25. file.append:
  26. - name: {{ f.dst }}
  27. - source: {{ f.src }}
  28. remove_appended_{{ f.src }}:
  29. file.absent:
  30. - name: {{ f.src }}
  31. {%- endif %}
  32. {%- endfor %}
  33. {%- for f in network.get('remove_iface_files', []) %}
  34. remove_iface_file_{{ f }}:
  35. file.absent:
  36. - name: {{ f }}
  37. {%- endfor %}
  38. {%- if network.interface is defined %}
  39. remove_cloud_init_file:
  40. file.absent:
  41. - name: /etc/network/interfaces.d/50-cloud-init.cfg
  42. {%- endif %}
  43. {%- for interface_name, interface in network.interface.items() %}
  44. {%- set interface_name = interface.get('name', interface_name) %}
  45. {# it is not used for any interface with type preffix dpdk,eg. dpdk_ovs_port #}
  46. {%- if interface.get('managed', True) and not 'dpdk' in interface.type %}
  47. {%- if grains.os_family in ['RedHat', 'Debian'] %}
  48. {%- if interface.type == 'ovs_bridge' %}
  49. ovs_bridge_{{ interface_name }}:
  50. openvswitch_bridge.present:
  51. - name: {{ interface_name }}
  52. {# add linux network interface into OVS bridge #}
  53. {%- for int_name, int in network.interface.items() %}
  54. {%- set int_name = int.get('name', int_name) %}
  55. {%- if int.ovs_bridge is defined and interface_name == int.ovs_bridge %}
  56. add_int_{{ int_name }}_to_ovs_bridge_{{ interface_name }}:
  57. cmd.run:
  58. - unless: ovs-vsctl show | grep {{ int_name }}
  59. - name: ovs-vsctl add-port {{ interface_name }} {{ int_name }}
  60. {%- endif %}
  61. {%- endfor %}
  62. {%- elif interface.type == 'ovs_port' %}
  63. {%- if interface.get('port_type','internal') == 'patch' %}
  64. ovs_port_{{ interface_name }}:
  65. openvswitch_port.present:
  66. - name: {{ interface_name }}
  67. - bridge: {{ interface.bridge }}
  68. - require:
  69. {%- if network.interface.get(interface.bridge, {}).get('type', 'ovs_bridge') == 'dpdk_ovs_bridge' %}
  70. - cmd: linux_network_dpdk_bridge_interface_{{ interface.bridge }}
  71. {%- else %}
  72. - openvswitch_bridge: ovs_bridge_{{ interface.bridge }}
  73. {%- endif %}
  74. ovs_port_set_type_{{ interface_name }}:
  75. cmd.run:
  76. - name: ovs-vsctl set interface {{ interface_name }} type=patch
  77. - unless: ovs-vsctl show | grep -A 1 'Interface {{ interface_name }}' | grep patch
  78. ovs_port_set_peer_{{ interface_name }}:
  79. cmd.run:
  80. - name: ovs-vsctl set interface {{ interface_name }} options:peer={{ interface.peer }}
  81. - unless: ovs-vsctl show | grep -A 2 'Interface {{ interface_name }}' | grep {{ interface.peer }}
  82. {%- else %}
  83. linux_interfaces_include_{{ interface_name }}:
  84. file.prepend:
  85. - name: /etc/network/interfaces
  86. - text: |
  87. source /etc/network/interfaces.d/*
  88. # Workaround for Upstream-Bug: https://github.com/saltstack/salt/issues/40262
  89. source /etc/network/interfaces.u/*
  90. ovs_port_{{ interface_name }}:
  91. file.managed:
  92. - name: /etc/network/interfaces.u/ifcfg-{{ interface_name }}
  93. - makedirs: True
  94. - source: salt://linux/files/ovs_port
  95. - defaults:
  96. port: {{ interface|yaml }}
  97. port_name: {{ interface_name }}
  98. - template: jinja
  99. ovs_port_{{ interface_name }}_line1:
  100. file.replace:
  101. - name: /etc/network/interfaces
  102. - pattern: auto {{ interface_name }}$
  103. - repl: ""
  104. ovs_port_{{ interface_name }}_line2:
  105. file.replace:
  106. - name: /etc/network/interfaces
  107. - pattern: 'iface {{ interface_name }} inet .*'
  108. - repl: ""
  109. ovs_port_up_{{ interface_name }}:
  110. cmd.run:
  111. - name: ifup {{ interface_name }}
  112. - require:
  113. - file: ovs_port_{{ interface_name }}
  114. - file: ovs_port_{{ interface_name }}_line1
  115. - file: ovs_port_{{ interface_name }}_line2
  116. - openvswitch_bridge: ovs_bridge_{{ interface.bridge }}
  117. - file: linux_interfaces_final_include
  118. {%- endif %}
  119. {%- else %}
  120. linux_interface_{{ interface_name }}:
  121. network.managed:
  122. - enabled: {{ interface.enabled }}
  123. - name: {{ interface_name }}
  124. - type: {{ interface.type }}
  125. {%- if interface.address is defined %}
  126. {%- if grains.os_family == 'Debian' %}
  127. - proto: {{ interface.get('proto', 'static') }}
  128. {% endif %}
  129. {%- if grains.os_family == 'RedHat' %}
  130. {%- if interface.get('proto', 'none') == 'manual' %}
  131. - proto: 'none'
  132. {%- else %}
  133. - proto: {{ interface.get('proto', 'none') }}
  134. {%- endif %}
  135. {% endif %}
  136. - ipaddr: {{ interface.address }}
  137. - netmask: {{ interface.netmask }}
  138. {%- else %}
  139. - proto: {{ interface.get('proto', 'dhcp') }}
  140. {%- endif %}
  141. {%- if interface.type == 'slave' %}
  142. - master: {{ interface.master }}
  143. {%- endif %}
  144. {%- if interface.name_servers is defined %}
  145. - dns: {{ interface.name_servers }}
  146. {%- endif %}
  147. {%- if interface.wireless is defined and grains.os_family == 'Debian' %}
  148. {%- if interface.wireless.security == "wpa" %}
  149. - wpa-ssid: {{ interface.wireless.essid }}
  150. - wpa-psk: {{ interface.wireless.key }}
  151. {%- else %}
  152. - wireless-ssid: {{ interface.wireless.essid }}
  153. - wireless-psk: {{ interface.wireless.key }}
  154. {%- endif %}
  155. {%- endif %}
  156. {%- for param in network.interface_params %}
  157. {{ set_param(param, interface) }}
  158. {%- endfor %}
  159. {%- if interface.require_interfaces is defined %}
  160. - require:
  161. {%- for netif in interface.get('require_interfaces', []) %}
  162. - network: linux_interface_{{ netif }}
  163. {%- endfor %}
  164. {%- for network in interface.get('use_ovs_ports', []) %}
  165. - cmd: ovs_port_up_{{ network }}
  166. {%- endfor %}
  167. {%- endif %}
  168. {%- if interface.type == 'bridge' %}
  169. - bridge: {{ interface_name }}
  170. - delay: 0
  171. - bypassfirewall: True
  172. - use:
  173. {%- for network in interface.use_interfaces %}
  174. - network: linux_interface_{{ network }}
  175. {%- endfor %}
  176. - ports: {% for network in interface.get('use_interfaces', []) %}{{ network }} {% endfor %}{% for network in interface.get('use_ovs_ports', []) %}{{ network }} {% endfor %}
  177. - require:
  178. {%- for network in interface.get('use_interfaces', []) %}
  179. - network: linux_interface_{{ network }}
  180. {%- endfor %}
  181. {%- for network in interface.get('use_ovs_ports', []) %}
  182. - cmd: ovs_port_up_{{ network }}
  183. {%- endfor %}
  184. {%- endif %}
  185. {%- if interface.type == 'bond' %}
  186. - slaves: {{ interface.slaves }}
  187. - mode: {{ interface.mode }}
  188. {%- endif %}
  189. {%- if interface.get('ipflush_onchange', False) %}
  190. linux_interface_ipflush_onchange_{{ interface_name }}:
  191. cmd.run:
  192. - name: "/sbin/ip address flush dev {{ interface_name }}"
  193. - onchanges:
  194. - network: linux_interface_{{ interface_name }}
  195. {%- if interface.get('restart_on_ipflush', False) %}
  196. linux_interface_restart_on_ipflush_{{ interface_name }}:
  197. cmd.run:
  198. - name: "ifdown {{ interface_name }}; ifup {{ interface_name }};"
  199. - onchanges:
  200. - cmd: linux_interface_ipflush_onchange_{{ interface_name }}
  201. {%- endif %}
  202. {%- endif %}
  203. {%- if salt['grains.get']('saltversion') < '2017.7' %}
  204. # TODO(ddmitriev): Remove this 'if .. endif' block completely when
  205. # switched to salt version 2017.7 that has the same functionality.
  206. {%- if interface.type == 'bond' and interface.enabled == True %}
  207. linux_bond_interface_{{ interface_name }}:
  208. cmd.run:
  209. - name: ifenslave {{ interface_name }} {{ interface.slaves }}
  210. - require:
  211. - network: linux_interface_{{ interface_name }}
  212. - onchanges:
  213. - network: linux_interface_{{ interface_name }}
  214. {%- for network in interface.slaves.split() %}
  215. - network: linux_interface_{{ network }}
  216. {%- endfor %}
  217. {%- endif %}
  218. {%- endif %}
  219. {%- for network in interface.get('use_ovs_ports', []) %}
  220. remove_interface_{{ network }}_line1:
  221. file.replace:
  222. - name: /etc/network/interfaces
  223. - pattern: auto {{ network }}$
  224. - repl: ""
  225. remove_interface_{{ network }}_line2:
  226. file.replace:
  227. - name: /etc/network/interfaces
  228. - pattern: iface {{ network }} inet manual
  229. - repl: ""
  230. {%- endfor %}
  231. {%- if interface.gateway is defined %}
  232. linux_system_network:
  233. network.system:
  234. - enabled: {{ interface.enabled }}
  235. - hostname: {{ network.fqdn }}
  236. {%- if interface.gateway is defined %}
  237. - gateway: {{ interface.gateway }}
  238. - gatewaydev: {{ interface_name }}
  239. {%- endif %}
  240. - nozeroconf: True
  241. - nisdomain: {{ system.domain }}
  242. - require_reboot: True
  243. {%- endif %}
  244. {%- endif %}
  245. {%- endif %}
  246. {%- if interface.wireless is defined %}
  247. {%- if grains.os_family == 'Arch' %}
  248. linux_network_packages:
  249. pkg.installed:
  250. - pkgs: {{ network.pkgs }}
  251. /etc/netctl/network_{{ interface.wireless.essid }}:
  252. file.managed:
  253. - source: salt://linux/files/wireless
  254. - mode: 755
  255. - template: jinja
  256. - require:
  257. - pkg: linux_network_packages
  258. - defaults:
  259. interface_name: {{ interface_name }}
  260. switch_profile_{{ interface.wireless.essid }}:
  261. cmd.run:
  262. - name: netctl switch-to network_{{ interface.wireless.essid }}
  263. - cwd: /root
  264. - unless: "iwconfig {{ interface_name }} | grep -e 'ESSID:\"{{ interface.wireless.essid }}\"'"
  265. - require:
  266. - file: /etc/netctl/network_{{ interface.wireless.essid }}
  267. enable_profile_{{ interface.wireless.essid }}:
  268. cmd.run:
  269. - name: netctl enable network_{{ interface.wireless.essid }}
  270. - cwd: /root
  271. - unless: test -e /etc/systemd/system/multi-user.target.wants/netctl@network_{{ interface.wireless.essid }}.service
  272. - require:
  273. - file: /etc/netctl/network_{{ interface.wireless.essid }}
  274. {%- endif %}
  275. {%- endif %}
  276. {%- endif %}
  277. {%- if interface.route is defined %}
  278. linux_network_{{ interface_name }}_routes:
  279. network.routes:
  280. - name: {{ interface_name }}
  281. - routes:
  282. {%- for route_name, route in interface.route.items() %}
  283. - name: {{ route_name }}
  284. ipaddr: {{ route.address }}
  285. netmask: {{ route.netmask }}
  286. {%- if route.gateway is defined %}
  287. gateway: {{ route.gateway }}
  288. {%- endif %}
  289. {%- endfor %}
  290. {%- endif %}
  291. {%- endfor %}
  292. {%- if network.bridge != 'none' %}
  293. linux_interfaces_final_include:
  294. file.prepend:
  295. - name: /etc/network/interfaces
  296. - text: |
  297. source /etc/network/interfaces.d/*
  298. # Workaround for Upstream-Bug: https://github.com/saltstack/salt/issues/40262
  299. source /etc/network/interfaces.u/*
  300. linux_interfaces_final_include_no_requisite:
  301. file.prepend:
  302. - name: /etc/network/interfaces
  303. - text: |
  304. source /etc/network/interfaces.d/*
  305. # Workaround for Upstream-Bug: https://github.com/saltstack/salt/issues/40262
  306. source /etc/network/interfaces.u/*
  307. {%- endif %}
  308. {%- endif %}
  309. {%- if network.network_manager.disable is defined and network.network_manager.disable == True %}
  310. NetworkManager:
  311. service.dead:
  312. - enable: false
  313. {%- endif %}
  314. {%- if network.tap_custom_txqueuelen is defined %}
  315. /etc/udev/rules.d/60-net-txqueue.rules:
  316. file.managed:
  317. - source: salt://linux/files/60-net-txqueue.rules
  318. - mode: 755
  319. - template: jinja
  320. - defaults:
  321. tap_custom_txqueuelen: {{ network.tap_custom_txqueuelen }}
  322. udev_reload_rules:
  323. cmd.run:
  324. - name: "/bin/udevadm control --reload-rules"
  325. - onchanges:
  326. - file: /etc/udev/rules.d/60-net-txqueue.rules
  327. udev_retrigger:
  328. cmd.run:
  329. - name: "/bin/udevadm trigger --attr-match=subsystem=net"
  330. - onchanges:
  331. - udev_reload_rules
  332. {%- endif %}