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.

README.rst 39KB

9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
8 years ago
8 years ago
8 years ago
8 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648
  1. ============
  2. Linux Fomula
  3. ============
  4. Linux Operating Systems.
  5. * Ubuntu
  6. * CentOS
  7. * RedHat
  8. * Fedora
  9. * Arch
  10. Sample Pillars
  11. ==============
  12. Linux System
  13. ------------
  14. Basic Linux box
  15. .. code-block:: yaml
  16. linux:
  17. system:
  18. enabled: true
  19. name: 'node1'
  20. domain: 'domain.com'
  21. cluster: 'system'
  22. environment: prod
  23. timezone: 'Europe/Prague'
  24. utc: true
  25. Linux with system users, some with password set:
  26. .. WARNING::
  27. If no 'password' variable has been passed - any predifined password
  28. will be removed.
  29. .. code-block:: yaml
  30. linux:
  31. system:
  32. ...
  33. user:
  34. jdoe:
  35. name: 'jdoe'
  36. enabled: true
  37. sudo: true
  38. shell: /bin/bash
  39. full_name: 'Jonh Doe'
  40. home: '/home/jdoe'
  41. email: 'jonh@doe.com'
  42. jsmith:
  43. name: 'jsmith'
  44. enabled: true
  45. full_name: 'With clear password'
  46. home: '/home/jsmith'
  47. hash_password: true
  48. password: "userpassword"
  49. mark:
  50. name: 'mark'
  51. enabled: true
  52. full_name: "unchange password'
  53. home: '/home/mark'
  54. password: false
  55. elizabeth:
  56. name: 'elizabeth'
  57. enabled: true
  58. full_name: 'With hased password'
  59. home: '/home/elizabeth'
  60. password: "$6$nUI7QEz3$dFYjzQqK5cJ6HQ38KqG4gTWA9eJu3aKx6TRVDFh6BVJxJgFWg2akfAA7f1fCxcSUeOJ2arCO6EEI6XXnHXxG10"
  61. Configure sudo for users and groups under ``/etc/sudoers.d/``.
  62. This ways ``linux.system.sudo`` pillar map to actual sudo attributes:
  63. .. code-block:: jinja
  64. # simplified template:
  65. Cmds_Alias {{ alias }}={{ commands }}
  66. {{ user }} {{ hosts }}=({{ runas }}) NOPASSWD: {{ commands }}
  67. %{{ group }} {{ hosts }}=({{ runas }}) NOPASSWD: {{ commands }}
  68. # when rendered:
  69. saltuser1 ALL=(ALL) NOPASSWD: ALL
  70. .. code-block:: yaml
  71. linux:
  72. system:
  73. sudo:
  74. enabled: true
  75. aliases:
  76. host:
  77. LOCAL:
  78. - localhost
  79. PRODUCTION:
  80. - db1
  81. - db2
  82. runas:
  83. DBA:
  84. - postgres
  85. - mysql
  86. SALT:
  87. - root
  88. command:
  89. # Note: This is not 100% safe when ALL keyword is used, user still may modify configs and hide his actions.
  90. # Best practice is to specify full list of commands user is allowed to run.
  91. SUPPORT_RESTRICTED:
  92. - /bin/vi /etc/sudoers*
  93. - /bin/vim /etc/sudoers*
  94. - /bin/nano /etc/sudoers*
  95. - /bin/emacs /etc/sudoers*
  96. - /bin/su - root
  97. - /bin/su -
  98. - /bin/su
  99. - /usr/sbin/visudo
  100. SUPPORT_SHELLS:
  101. - /bin/sh
  102. - /bin/ksh
  103. - /bin/bash
  104. - /bin/rbash
  105. - /bin/dash
  106. - /bin/zsh
  107. - /bin/csh
  108. - /bin/fish
  109. - /bin/tcsh
  110. - /usr/bin/login
  111. - /usr/bin/su
  112. - /usr/su
  113. ALL_SALT_SAFE:
  114. - /usr/bin/salt state*
  115. - /usr/bin/salt service*
  116. - /usr/bin/salt pillar*
  117. - /usr/bin/salt grains*
  118. - /usr/bin/salt saltutil*
  119. - /usr/bin/salt-call state*
  120. - /usr/bin/salt-call service*
  121. - /usr/bin/salt-call pillar*
  122. - /usr/bin/salt-call grains*
  123. - /usr/bin/salt-call saltutil*
  124. SALT_TRUSTED:
  125. - /usr/bin/salt*
  126. users:
  127. # saltuser1 with default values: saltuser1 ALL=(ALL) NOPASSWD: ALL
  128. saltuser1: {}
  129. saltuser2:
  130. hosts:
  131. - LOCAL
  132. # User Alias DBA
  133. DBA:
  134. hosts:
  135. - ALL
  136. commands:
  137. - ALL_SALT_SAFE
  138. groups:
  139. db-ops:
  140. hosts:
  141. - ALL
  142. - '!PRODUCTION'
  143. runas:
  144. - DBA
  145. commands:
  146. - /bin/cat *
  147. - /bin/less *
  148. - /bin/ls *
  149. salt-ops:
  150. hosts:
  151. - 'ALL'
  152. runas:
  153. - SALT
  154. commands:
  155. - SUPPORT_SHELLS
  156. salt-ops-2nd:
  157. name: salt-ops
  158. nopasswd: false
  159. setenv: true # Enable sudo -E option
  160. runas:
  161. - DBA
  162. commands:
  163. - ALL
  164. - '!SUPPORT_SHELLS'
  165. - '!SUPPORT_RESTRICTED'
  166. Linux with package, latest version
  167. .. code-block:: yaml
  168. linux:
  169. system:
  170. ...
  171. package:
  172. package-name:
  173. version: latest
  174. Linux with package from certail repo, version with no upgrades
  175. .. code-block:: yaml
  176. linux:
  177. system:
  178. ...
  179. package:
  180. package-name:
  181. version: 2132.323
  182. repo: 'custom-repo'
  183. hold: true
  184. Linux with package from certail repo, version with no GPG verification
  185. .. code-block:: yaml
  186. linux:
  187. system:
  188. ...
  189. package:
  190. package-name:
  191. version: 2132.323
  192. repo: 'custom-repo'
  193. verify: false
  194. Linux with autoupdates (automatically install security package updates)
  195. .. code-block:: yaml
  196. linux:
  197. system:
  198. ...
  199. autoupdates:
  200. enabled: true
  201. mail: root@localhost
  202. mail_only_on_error: true
  203. remove_unused_dependencies: false
  204. automatic_reboot: true
  205. automatic_reboot_time: "02:00"
  206. Linux with cron jobs
  207. By default it will use name as an identifier, unless identifier key is
  208. explicitly set or False (then it will use Salt's default behavior which is
  209. identifier same as command resulting in not being able to change it)
  210. .. code-block:: yaml
  211. linux:
  212. system:
  213. ...
  214. job:
  215. cmd1:
  216. command: '/cmd/to/run'
  217. identifier: cmd1
  218. enabled: true
  219. user: 'root'
  220. hour: 2
  221. minute: 0
  222. Linux security limits (limit sensu user memory usage to max 1GB):
  223. .. code-block:: yaml
  224. linux:
  225. system:
  226. ...
  227. limit:
  228. sensu:
  229. enabled: true
  230. domain: sensu
  231. limits:
  232. - type: hard
  233. item: as
  234. value: 1000000
  235. Enable autologin on tty1 (may work only for Ubuntu 14.04):
  236. .. code-block:: yaml
  237. linux:
  238. system:
  239. console:
  240. tty1:
  241. autologin: root
  242. # Enable serial console
  243. ttyS0:
  244. autologin: root
  245. rate: 115200
  246. term: xterm
  247. To disable set autologin to `false`.
  248. Set ``policy-rc.d`` on Debian-based systems. Action can be any available
  249. command in ``while true`` loop and ``case`` context.
  250. Following will disallow dpkg to stop/start services for cassandra package automatically:
  251. .. code-block:: yaml
  252. linux:
  253. system:
  254. policyrcd:
  255. - package: cassandra
  256. action: exit 101
  257. - package: '*'
  258. action: switch
  259. Set system locales:
  260. .. code-block:: yaml
  261. linux:
  262. system:
  263. locale:
  264. en_US.UTF-8:
  265. default: true
  266. "cs_CZ.UTF-8 UTF-8":
  267. enabled: true
  268. Systemd settings:
  269. .. code-block:: yaml
  270. linux:
  271. system:
  272. ...
  273. systemd:
  274. system:
  275. Manager:
  276. DefaultLimitNOFILE: 307200
  277. DefaultLimitNPROC: 307200
  278. user:
  279. Manager:
  280. DefaultLimitCPU: 2
  281. DefaultLimitNPROC: 4
  282. Ensure presence of directory:
  283. .. code-block:: yaml
  284. linux:
  285. system:
  286. directory:
  287. /tmp/test:
  288. user: root
  289. group: root
  290. mode: 700
  291. makedirs: true
  292. Kernel
  293. ~~~~~~
  294. Install always up to date LTS kernel and headers from Ubuntu trusty:
  295. .. code-block:: yaml
  296. linux:
  297. system:
  298. kernel:
  299. type: generic
  300. lts: trusty
  301. headers: true
  302. Load kernel modules and add them to `/etc/modules`:
  303. .. code-block:: yaml
  304. linux:
  305. system:
  306. kernel:
  307. modules:
  308. - nf_conntrack
  309. - tp_smapi
  310. - 8021q
  311. Configure or blacklist kernel modules with additional options to `/etc/modprobe.d` following example
  312. will add `/etc/modprobe.d/nf_conntrack.conf` file with line `options nf_conntrack hashsize=262144`:
  313. .. code-block:: yaml
  314. linux:
  315. system:
  316. kernel:
  317. module:
  318. nf_conntrack:
  319. option:
  320. hashsize: 262144
  321. Install specific kernel version and ensure all other kernel packages are
  322. not present. Also install extra modules and headers for this kernel:
  323. .. code-block:: yaml
  324. linux:
  325. system:
  326. kernel:
  327. type: generic
  328. extra: true
  329. headers: true
  330. version: 4.2.0-22
  331. Systcl kernel parameters
  332. .. code-block:: yaml
  333. linux:
  334. system:
  335. kernel:
  336. sysctl:
  337. net.ipv4.tcp_keepalive_intvl: 3
  338. net.ipv4.tcp_keepalive_time: 30
  339. net.ipv4.tcp_keepalive_probes: 8
  340. CPU
  341. ~~~
  342. Enable cpufreq governor for every cpu:
  343. .. code-block:: yaml
  344. linux:
  345. system:
  346. cpu:
  347. governor: performance
  348. Certificates
  349. ~~~~~~~~~~~~
  350. Add certificate authority into system trusted CA bundle
  351. .. code-block:: yaml
  352. linux:
  353. system:
  354. ca_certificates:
  355. mycert: |
  356. -----BEGIN CERTIFICATE-----
  357. MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG
  358. A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
  359. cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
  360. MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
  361. BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt
  362. YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
  363. ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE
  364. BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is
  365. I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G
  366. CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do
  367. lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc
  368. AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k
  369. -----END CERTIFICATE-----
  370. Sysfs
  371. ~~~~~
  372. Install sysfsutils and set sysfs attributes:
  373. .. code-block:: yaml
  374. linux:
  375. system:
  376. sysfs:
  377. scheduler:
  378. block/sda/queue/scheduler: deadline
  379. power:
  380. mode:
  381. power/state: 0660
  382. owner:
  383. power/state: "root:power"
  384. devices/system/cpu/cpu0/cpufreq/scaling_governor: powersave
  385. Huge Pages
  386. ~~~~~~~~~~~~
  387. Huge Pages give a performance boost to applications that intensively deal
  388. with memory allocation/deallocation by decreasing memory fragmentation.
  389. .. code-block:: yaml
  390. linux:
  391. system:
  392. kernel:
  393. hugepages:
  394. small:
  395. size: 2M
  396. count: 107520
  397. mount_point: /mnt/hugepages_2MB
  398. mount: false/true # default false
  399. large:
  400. default: true # default automatically mounted
  401. size: 1G
  402. count: 210
  403. mount_point: /mnt/hugepages_1GB
  404. Note: not recommended to use both pagesizes in concurrently.
  405. Intel SR-IOV
  406. ~~~~~~~~~~~~
  407. PCI-SIG Single Root I/O Virtualization and Sharing (SR-IOV) specification defines a standardized mechanism to virtualize PCIe devices. The mechanism can virtualize a single PCIe Ethernet controller to appear as multiple PCIe devices.
  408. .. code-block:: yaml
  409. linux:
  410. system:
  411. kernel:
  412. sriov: True
  413. unsafe_interrupts: False # Default is false. for older platforms and AMD we need to add interrupt remapping workaround
  414. rc:
  415. local: |
  416. #!/bin/sh -e
  417. # Enable 7 VF on eth1
  418. echo 7 > /sys/class/net/eth1/device/sriov_numvfs; sleep 2; ifup -a
  419. exit 0
  420. Isolate CPU options
  421. ~~~~~~~~~~~~~~~~~~~
  422. Remove the specified CPUs, as defined by the cpu_number values, from the general kernel
  423. SMP balancing and scheduler algroithms. The only way to move a process onto or off an
  424. "isolated" CPU is via the CPU affinity syscalls. cpu_number begins at 0, so the
  425. maximum value is 1 less than the number of CPUs on the system.
  426. .. code-block:: yaml
  427. linux:
  428. system:
  429. kernel:
  430. isolcpu: 1,2,3,4,5,6,7 # isolate first cpu 0
  431. Repositories
  432. ~~~~~~~~~~~~
  433. RedHat based Linux with additional OpenStack repo
  434. .. code-block:: yaml
  435. linux:
  436. system:
  437. ...
  438. repo:
  439. rdo-icehouse:
  440. enabled: true
  441. source: 'http://repos.fedorapeople.org/repos/openstack/openstack-icehouse/epel-6/'
  442. pgpcheck: 0
  443. Ensure system repository to use czech Debian mirror (``default: true``)
  444. Also pin it's packages with priority 900.
  445. .. code-block:: yaml
  446. linux:
  447. system:
  448. repo:
  449. debian:
  450. default: true
  451. source: "deb http://ftp.cz.debian.org/debian/ jessie main contrib non-free"
  452. # Import signing key from URL if needed
  453. key_url: "http://dummy.com/public.gpg"
  454. pin:
  455. - pin: 'origin "ftp.cz.debian.org"'
  456. priority: 900
  457. package: '*'
  458. Package manager proxy setup globally:
  459. .. code-block:: yaml
  460. linux:
  461. system:
  462. ...
  463. repo:
  464. apt-mk:
  465. source: "deb http://apt-mk.mirantis.com/ stable main salt"
  466. ...
  467. proxy:
  468. pkg:
  469. enabled: true
  470. ftp: ftp://ftp-proxy-for-apt.host.local:2121
  471. ...
  472. # NOTE: Global defaults for any other componet that configure proxy on the system.
  473. # If your environment has just one simple proxy, set it on linux:system:proxy.
  474. #
  475. # fall back system defaults if linux:system:proxy:pkg has no protocol specific entries
  476. # as for https and http
  477. ftp: ftp://proxy.host.local:2121
  478. http: http://proxy.host.local:3142
  479. https: https://proxy.host.local:3143
  480. Package manager proxy setup per repository:
  481. .. code-block:: yaml
  482. linux:
  483. system:
  484. ...
  485. repo:
  486. debian:
  487. source: "deb http://apt-mk.mirantis.com/ stable main salt"
  488. ...
  489. apt-mk:
  490. source: "deb http://apt-mk.mirantis.com/ stable main salt"
  491. # per repository proxy
  492. proxy:
  493. enabled: true
  494. http: http://maas-01:8080
  495. https: http://maas-01:8080
  496. ...
  497. proxy:
  498. # package manager fallback defaults
  499. # used if linux:system:repo:apt-mk:proxy has no protocol specific entries
  500. pkg:
  501. enabled: true
  502. ftp: ftp://proxy.host.local:2121
  503. #http: http://proxy.host.local:3142
  504. #https: https://proxy.host.local:3143
  505. ...
  506. # global system fallback system defaults
  507. ftp: ftp://proxy.host.local:2121
  508. http: http://proxy.host.local:3142
  509. https: https://proxy.host.local:3143
  510. Remove all repositories:
  511. .. code-block:: yaml
  512. linux:
  513. system:
  514. purge_repos: true
  515. Setup custom apt config options:
  516. .. code-block:: yaml
  517. linux:
  518. system:
  519. apt:
  520. config:
  521. compression-workaround:
  522. "Acquire::CompressionTypes::Order": "gz"
  523. docker-clean:
  524. "DPkg::Post-Invoke":
  525. - "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"
  526. "APT::Update::Post-Invoke":
  527. - "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"
  528. RC
  529. ~~
  530. rc.local example
  531. .. code-block:: yaml
  532. linux:
  533. system:
  534. rc:
  535. local: |
  536. #!/bin/sh -e
  537. #
  538. # rc.local
  539. #
  540. # This script is executed at the end of each multiuser runlevel.
  541. # Make sure that the script will "exit 0" on success or any other
  542. # value on error.
  543. #
  544. # In order to enable or disable this script just change the execution
  545. # bits.
  546. #
  547. # By default this script does nothing.
  548. exit 0
  549. Prompt
  550. ~~~~~~
  551. Setting prompt is implemented by creating ``/etc/profile.d/prompt.sh``. Every
  552. user can have different prompt.
  553. .. code-block:: yaml
  554. linux:
  555. system:
  556. prompt:
  557. root: \\n\\[\\033[0;37m\\]\\D{%y/%m/%d %H:%M:%S} $(hostname -f)\\[\\e[0m\\]\\n\\[\\e[1;31m\\][\\u@\\h:\\w]\\[\\e[0m\\]
  558. default: \\n\\D{%y/%m/%d %H:%M:%S} $(hostname -f)\\n[\\u@\\h:\\w]
  559. On Debian systems to set prompt system-wide it's necessary to remove setting
  560. PS1 in ``/etc/bash.bashrc`` and ``~/.bashrc`` (which comes from
  561. ``/etc/skel/.bashrc``). This formula will do this automatically, but will not
  562. touch existing user's ``~/.bashrc`` files except root.
  563. Bash
  564. ~~~~
  565. Fix bash configuration to preserve history across sessions (like ZSH does by
  566. default).
  567. .. code-block:: yaml
  568. linux:
  569. system:
  570. bash:
  571. preserve_history: true
  572. Message of the day
  573. ~~~~~~~~~~~~~~~~~~
  574. ``pam_motd`` from package ``update-motd`` is used for dynamic messages of the
  575. day. Setting custom motd will cleanup existing ones.
  576. .. code-block:: yaml
  577. linux:
  578. system:
  579. motd:
  580. - release: |
  581. #!/bin/sh
  582. [ -r /etc/lsb-release ] && . /etc/lsb-release
  583. if [ -z "$DISTRIB_DESCRIPTION" ] && [ -x /usr/bin/lsb_release ]; then
  584. # Fall back to using the very slow lsb_release utility
  585. DISTRIB_DESCRIPTION=$(lsb_release -s -d)
  586. fi
  587. printf "Welcome to %s (%s %s %s)\n" "$DISTRIB_DESCRIPTION" "$(uname -o)" "$(uname -r)" "$(uname -m)"
  588. - warning: |
  589. #!/bin/sh
  590. printf "This is [company name] network.\n"
  591. printf "Unauthorized access strictly prohibited.\n"
  592. Services
  593. ~~~~~~~~
  594. Stop and disable linux service:
  595. .. code-block:: yaml
  596. linux:
  597. system:
  598. service:
  599. apt-daily.timer:
  600. status: dead
  601. Possible status is dead (disable service by default), running (enable service by default), enabled, disabled.
  602. Linux with atop service:
  603. .. code-block:: yaml
  604. linux:
  605. system:
  606. atop:
  607. enabled: true
  608. interval: 20
  609. logpath: "/var/log/atop"
  610. outfile: "/var/log/atop/daily.log"
  611. RHEL / CentOS
  612. ^^^^^^^^^^^^^
  613. Unfortunately ``update-motd`` is currently not available for RHEL so there's
  614. no native support for dynamic motd.
  615. You can still set static one, only pillar structure differs:
  616. .. code-block:: yaml
  617. linux:
  618. system:
  619. motd: |
  620. This is [company name] network.
  621. Unauthorized access strictly prohibited.
  622. Haveged
  623. ~~~~~~~
  624. If you are running headless server and are low on entropy, it may be a good
  625. idea to setup Haveged.
  626. .. code-block:: yaml
  627. linux:
  628. system:
  629. haveged:
  630. enabled: true
  631. Linux network
  632. -------------
  633. Linux with network manager
  634. .. code-block:: yaml
  635. linux:
  636. network:
  637. enabled: true
  638. network_manager: true
  639. Linux with default static network interfaces, default gateway interface and DNS servers
  640. .. code-block:: yaml
  641. linux:
  642. network:
  643. enabled: true
  644. interface:
  645. eth0:
  646. enabled: true
  647. type: eth
  648. address: 192.168.0.102
  649. netmask: 255.255.255.0
  650. gateway: 192.168.0.1
  651. name_servers:
  652. - 8.8.8.8
  653. - 8.8.4.4
  654. mtu: 1500
  655. Linux with bonded interfaces and disabled NetworkManager
  656. .. code-block:: yaml
  657. linux:
  658. network:
  659. enabled: true
  660. interface:
  661. eth0:
  662. type: eth
  663. ...
  664. eth1:
  665. type: eth
  666. ...
  667. bond0:
  668. enabled: true
  669. type: bond
  670. address: 192.168.0.102
  671. netmask: 255.255.255.0
  672. mtu: 1500
  673. use_in:
  674. - interface: ${linux:interface:eth0}
  675. - interface: ${linux:interface:eth0}
  676. network_manager:
  677. disable: true
  678. Linux with vlan interface_params
  679. .. code-block:: yaml
  680. linux:
  681. network:
  682. enabled: true
  683. interface:
  684. vlan69:
  685. type: vlan
  686. use_interfaces:
  687. - interface: ${linux:interface:bond0}
  688. Linux with wireless interface parameters
  689. .. code-block:: yaml
  690. linux:
  691. network:
  692. enabled: true
  693. gateway: 10.0.0.1
  694. default_interface: eth0
  695. interface:
  696. wlan0:
  697. type: eth
  698. wireless:
  699. essid: example
  700. key: example_key
  701. security: wpa
  702. priority: 1
  703. Linux networks with routes defined
  704. .. code-block:: yaml
  705. linux:
  706. network:
  707. enabled: true
  708. gateway: 10.0.0.1
  709. default_interface: eth0
  710. interface:
  711. eth0:
  712. type: eth
  713. route:
  714. default:
  715. address: 192.168.0.123
  716. netmask: 255.255.255.0
  717. gateway: 192.168.0.1
  718. Native Linux Bridges
  719. .. code-block:: yaml
  720. linux:
  721. network:
  722. interface:
  723. eth1:
  724. enabled: true
  725. type: eth
  726. proto: manual
  727. up_cmds:
  728. - ip address add 0/0 dev $IFACE
  729. - ip link set $IFACE up
  730. down_cmds:
  731. - ip link set $IFACE down
  732. br-ex:
  733. enabled: true
  734. type: bridge
  735. address: ${linux:network:host:public_local:address}
  736. netmask: 255.255.255.0
  737. use_interfaces:
  738. - eth1
  739. OpenVswitch Bridges
  740. .. code-block:: yaml
  741. linux:
  742. network:
  743. bridge: openvswitch
  744. interface:
  745. eth1:
  746. enabled: true
  747. type: eth
  748. proto: manual
  749. up_cmds:
  750. - ip address add 0/0 dev $IFACE
  751. - ip link set $IFACE up
  752. down_cmds:
  753. - ip link set $IFACE down
  754. br-ex:
  755. enabled: true
  756. type: bridge
  757. address: ${linux:network:host:public_local:address}
  758. netmask: 255.255.255.0
  759. use_interfaces:
  760. - eth1
  761. br-prv:
  762. enabled: true
  763. type: ovs_bridge
  764. mtu: 65000
  765. br-ens7:
  766. enabled: true
  767. name: br-ens7
  768. type: ovs_bridge
  769. proto: manual
  770. mtu: 9000
  771. use_interfaces:
  772. - ens7
  773. patch-br-ens7-br-prv:
  774. enabled: true
  775. name: ens7-prv
  776. ovs_type: ovs_port
  777. type: ovs_port
  778. bridge: br-ens7
  779. port_type: patch
  780. peer: prv-ens7
  781. mtu: 65000
  782. patch-br-prv-br-ens7:
  783. enabled: true
  784. name: prv-ens7
  785. bridge: br-prv
  786. ovs_type: ovs_port
  787. type: ovs_port
  788. port_type: patch
  789. peer: ens7-prv
  790. mtu: 65000
  791. ens7:
  792. enabled: true
  793. name: ens7
  794. proto: manual
  795. ovs_port_type: OVSPort
  796. type: ovs_port
  797. ovs_bridge: br-ens7
  798. bridge: br-ens7
  799. Debian manual proto interfaces
  800. When you are changing interface proto from static in up state to manual, you
  801. may need to flush ip addresses. For example, if you want to use the interface
  802. and the ip on the bridge. This can be done by setting the ``ipflush_onchange``
  803. to true.
  804. .. code-block:: yaml
  805. linux:
  806. network:
  807. interface:
  808. eth1:
  809. enabled: true
  810. type: eth
  811. proto: manual
  812. mtu: 9100
  813. ipflush_onchange: true
  814. Concatinating and removing interface files
  815. Debian based distributions have `/etc/network/interfaces.d/` directory, where
  816. you can store configuration of network interfaces in separate files. You can
  817. concatinate the files to the defined destination when needed, this operation
  818. removes the file from the `/etc/network/interfaces.d/`. If you just need to
  819. remove iface files, you can use the `remove_iface_files` key.
  820. .. code-block:: yaml
  821. linux:
  822. network:
  823. concat_iface_files:
  824. - src: '/etc/network/interfaces.d/50-cloud-init.cfg'
  825. dst: '/etc/network/interfaces'
  826. remove_iface_files:
  827. - '/etc/network/interfaces.d/90-custom.cfg'
  828. DHCP client configuration
  829. None of the keys is mandatory, include only those you really need. For full list
  830. of available options under send, supersede, prepend, append refer to dhcp-options(5)
  831. .. code-block:: yaml
  832. linux:
  833. network:
  834. dhclient:
  835. enabled: true
  836. backoff_cutoff: 15
  837. initial_interval: 10
  838. reboot: 10
  839. retry: 60
  840. select_timeout: 0
  841. timeout: 120
  842. send:
  843. - option: host-name
  844. declaration: "= gethostname()"
  845. supersede:
  846. - option: host-name
  847. declaration: "spaceship"
  848. - option: domain-name
  849. declaration: "domain.home"
  850. #- option: arp-cache-timeout
  851. # declaration: 20
  852. prepend:
  853. - option: domain-name-servers
  854. declaration:
  855. - 8.8.8.8
  856. - 8.8.4.4
  857. - option: domain-search
  858. declaration:
  859. - example.com
  860. - eng.example.com
  861. #append:
  862. #- option: domain-name-servers
  863. # declaration: 127.0.0.1
  864. # ip or subnet to reject dhcp offer from
  865. reject:
  866. - 192.33.137.209
  867. - 10.0.2.0/24
  868. request:
  869. - subnet-mask
  870. - broadcast-address
  871. - time-offset
  872. - routers
  873. - domain-name
  874. - domain-name-servers
  875. - domain-search
  876. - host-name
  877. - dhcp6.name-servers
  878. - dhcp6.domain-search
  879. - dhcp6.fqdn
  880. - dhcp6.sntp-servers
  881. - netbios-name-servers
  882. - netbios-scope
  883. - interface-mtu
  884. - rfc3442-classless-static-routes
  885. - ntp-servers
  886. require:
  887. - subnet-mask
  888. - domain-name-servers
  889. # if per interface configuration required add below
  890. interface:
  891. ens2:
  892. initial_interval: 11
  893. reject:
  894. - 192.33.137.210
  895. ens3:
  896. initial_interval: 12
  897. reject:
  898. - 192.33.137.211
  899. Linux network systemd settings:
  900. .. code-block:: yaml
  901. linux:
  902. network:
  903. ...
  904. systemd:
  905. link:
  906. 10-iface-dmz:
  907. Match:
  908. MACAddress: c8:5b:67:fa:1a:af
  909. OriginalName: eth0
  910. Link:
  911. Name: dmz0
  912. netdev:
  913. 20-bridge-dmz:
  914. match:
  915. name: dmz0
  916. network:
  917. mescription: bridge
  918. bridge: br-dmz0
  919. network:
  920. # works with lowercase, keys are by default capitalized
  921. 40-dhcp:
  922. match:
  923. name: '*'
  924. network:
  925. DHCP: yes
  926. Configure global environment variables
  927. Use ``/etc/environment`` for static system wide variable assignment after
  928. boot. Variable expansion is frequently not supported.
  929. .. code-block:: yaml
  930. linux:
  931. system:
  932. env:
  933. BOB_VARIABLE: Alice
  934. ...
  935. BOB_PATH:
  936. - /srv/alice/bin
  937. - /srv/bob/bin
  938. ...
  939. ftp_proxy: none
  940. http_proxy: http://global-http-proxy.host.local:8080
  941. https_proxy: ${linux:system:proxy:https}
  942. no_proxy:
  943. - 192.168.0.80
  944. - 192.168.1.80
  945. - .domain.com
  946. - .local
  947. ...
  948. # NOTE: global defaults proxy configuration.
  949. proxy:
  950. ftp: ftp://proxy.host.local:2121
  951. http: http://proxy.host.local:3142
  952. https: https://proxy.host.local:3143
  953. noproxy:
  954. - .domain.com
  955. - .local
  956. Configure profile.d scripts
  957. The profile.d scripts are being sourced during .sh execution and support
  958. variable expansion in opposite to /etc/environment global settings in
  959. ``/etc/environment``.
  960. .. code-block:: yaml
  961. linux:
  962. system:
  963. profile:
  964. locales: |
  965. export LANG=C
  966. export LC_ALL=C
  967. ...
  968. vi_flavors.sh: |
  969. export PAGER=view
  970. export EDITOR=vim
  971. alias vi=vim
  972. shell_locales.sh: |
  973. export LANG=en_US
  974. export LC_ALL=en_US.UTF-8
  975. shell_proxies.sh: |
  976. export FTP_PROXY=ftp://127.0.3.3:2121
  977. export NO_PROXY='.local'
  978. Linux with hosts
  979. Parameter purge_hosts will enforce whole /etc/hosts file, removing entries
  980. that are not defined in model except defaults for both IPv4 and IPv6 localhost
  981. and hostname + fqdn.
  982. It's good to use this option if you want to ensure /etc/hosts is always in a
  983. clean state however it's not enabled by default for safety.
  984. .. code-block:: yaml
  985. linux:
  986. network:
  987. purge_hosts: true
  988. host:
  989. # No need to define this one if purge_hosts is true
  990. hostname:
  991. address: 127.0.1.1
  992. names:
  993. - ${linux:network:fqdn}
  994. - ${linux:network:hostname}
  995. node1:
  996. address: 192.168.10.200
  997. names:
  998. - node2.domain.com
  999. - service2.domain.com
  1000. node2:
  1001. address: 192.168.10.201
  1002. names:
  1003. - node2.domain.com
  1004. - service2.domain.com
  1005. Linux with hosts collected from mine
  1006. In this case all dns records defined within infrastrucuture will be passed to
  1007. local hosts records or any DNS server. Only hosts with `grain` parameter to
  1008. true will be propagated to the mine.
  1009. .. code-block:: yaml
  1010. linux:
  1011. network:
  1012. purge_hosts: true
  1013. mine_dns_records: true
  1014. host:
  1015. node1:
  1016. address: 192.168.10.200
  1017. grain: true
  1018. names:
  1019. - node2.domain.com
  1020. - service2.domain.com
  1021. Setup resolv.conf, nameservers, domain and search domains
  1022. .. code-block:: yaml
  1023. linux:
  1024. network:
  1025. resolv:
  1026. dns:
  1027. - 8.8.4.4
  1028. - 8.8.8.8
  1029. domain: my.example.com
  1030. search:
  1031. - my.example.com
  1032. - example.com
  1033. options:
  1034. - ndots: 5
  1035. - timeout: 2
  1036. - attempts: 2
  1037. setting custom TX queue length for tap interfaces
  1038. .. code-block:: yaml
  1039. linux:
  1040. network:
  1041. tap_custom_txqueuelen: 10000
  1042. DPDK OVS interfaces
  1043. **DPDK OVS NIC**
  1044. .. code-block:: yaml
  1045. linux:
  1046. network:
  1047. bridge: openvswitch
  1048. dpdk:
  1049. enabled: true
  1050. driver: uio/vfio
  1051. openvswitch:
  1052. pmd_cpu_mask: "0x6"
  1053. dpdk_socket_mem: "1024,1024"
  1054. dpdk_lcore_mask: "0x400"
  1055. memory_channels: 2
  1056. interface:
  1057. dpkd0:
  1058. name: ${_param:dpdk_nic}
  1059. pci: 0000:06:00.0
  1060. driver: igb_uio/vfio-pci
  1061. enabled: true
  1062. type: dpdk_ovs_port
  1063. n_rxq: 2
  1064. pmd_rxq_affinity: "0:1,1:2"
  1065. bridge: br-prv
  1066. mtu: 9000
  1067. br-prv:
  1068. enabled: true
  1069. type: dpdk_ovs_bridge
  1070. **DPDK OVS Bond**
  1071. .. code-block:: yaml
  1072. linux:
  1073. network:
  1074. bridge: openvswitch
  1075. dpdk:
  1076. enabled: true
  1077. driver: uio/vfio
  1078. openvswitch:
  1079. pmd_cpu_mask: "0x6"
  1080. dpdk_socket_mem: "1024,1024"
  1081. dpdk_lcore_mask: "0x400"
  1082. memory_channels: 2
  1083. interface:
  1084. dpdk_second_nic:
  1085. name: ${_param:primary_second_nic}
  1086. pci: 0000:06:00.0
  1087. driver: igb_uio/vfio-pci
  1088. bond: dpdkbond0
  1089. enabled: true
  1090. type: dpdk_ovs_port
  1091. n_rxq: 2
  1092. pmd_rxq_affinity: "0:1,1:2"
  1093. mtu: 9000
  1094. dpdk_first_nic:
  1095. name: ${_param:primary_first_nic}
  1096. pci: 0000:05:00.0
  1097. driver: igb_uio/vfio-pci
  1098. bond: dpdkbond0
  1099. enabled: true
  1100. type: dpdk_ovs_port
  1101. n_rxq: 2
  1102. pmd_rxq_affinity: "0:1,1:2"
  1103. mtu: 9000
  1104. dpdkbond0:
  1105. enabled: true
  1106. bridge: br-prv
  1107. type: dpdk_ovs_bond
  1108. mode: active-backup
  1109. br-prv:
  1110. enabled: true
  1111. type: dpdk_ovs_bridge
  1112. **DPDK OVS bridge for VXLAN**
  1113. If VXLAN is used as tenant segmentation then ip address must be set on br-prv
  1114. .. code-block:: yaml
  1115. linux:
  1116. network:
  1117. ...
  1118. interface:
  1119. br-prv:
  1120. enabled: true
  1121. type: dpdk_ovs_bridge
  1122. address: 192.168.50.0
  1123. netmask: 255.255.255.0
  1124. mtu: 9000
  1125. Linux storage
  1126. -------------
  1127. Linux with mounted Samba
  1128. .. code-block:: yaml
  1129. linux:
  1130. storage:
  1131. enabled: true
  1132. mount:
  1133. samba1:
  1134. - enabled: true
  1135. - path: /media/myuser/public/
  1136. - device: //192.168.0.1/storage
  1137. - file_system: cifs
  1138. - options: guest,uid=myuser,iocharset=utf8,file_mode=0777,dir_mode=0777,noperm
  1139. NFS mount
  1140. .. code-block:: yaml
  1141. linux:
  1142. storage:
  1143. enabled: true
  1144. mount:
  1145. nfs_glance:
  1146. enabled: true
  1147. path: /var/lib/glance/images
  1148. device: 172.16.10.110:/var/nfs/glance
  1149. file_system: nfs
  1150. opts: rw,sync
  1151. File swap configuration
  1152. .. code-block:: yaml
  1153. linux:
  1154. storage:
  1155. enabled: true
  1156. swap:
  1157. file:
  1158. enabled: true
  1159. engine: file
  1160. device: /swapfile
  1161. size: 1024
  1162. Partition swap configuration
  1163. .. code-block:: yaml
  1164. linux:
  1165. storage:
  1166. enabled: true
  1167. swap:
  1168. partition:
  1169. enabled: true
  1170. engine: partition
  1171. device: /dev/vg0/swap
  1172. LVM group `vg1` with one device and `data` volume mounted into `/mnt/data`
  1173. .. code-block:: yaml
  1174. parameters:
  1175. linux:
  1176. storage:
  1177. mount:
  1178. data:
  1179. enabled: true
  1180. device: /dev/vg1/data
  1181. file_system: ext4
  1182. path: /mnt/data
  1183. lvm:
  1184. vg1:
  1185. enabled: true
  1186. devices:
  1187. - /dev/sdb
  1188. volume:
  1189. data:
  1190. size: 40G
  1191. mount: ${linux:storage:mount:data}
  1192. Create partitions on disk. Specify size in MB. It expects empty
  1193. disk without any existing partitions. (set startsector=1, if you want to start partitions from 2048)
  1194. .. code-block:: yaml
  1195. linux:
  1196. storage:
  1197. disk:
  1198. first_drive:
  1199. startsector: 1
  1200. name: /dev/loop1
  1201. type: gpt
  1202. partitions:
  1203. - size: 200 #size in MB
  1204. type: fat32
  1205. - size: 300 #size in MB
  1206. mkfs: True
  1207. type: xfs
  1208. /dev/vda1:
  1209. partitions:
  1210. - size: 5
  1211. type: ext2
  1212. - size: 10
  1213. type: ext4
  1214. Multipath with Fujitsu Eternus DXL
  1215. .. code-block:: yaml
  1216. parameters:
  1217. linux:
  1218. storage:
  1219. multipath:
  1220. enabled: true
  1221. blacklist_devices:
  1222. - /dev/sda
  1223. - /dev/sdb
  1224. backends:
  1225. - fujitsu_eternus_dxl
  1226. Multipath with Hitachi VSP 1000
  1227. .. code-block:: yaml
  1228. parameters:
  1229. linux:
  1230. storage:
  1231. multipath:
  1232. enabled: true
  1233. blacklist_devices:
  1234. - /dev/sda
  1235. - /dev/sdb
  1236. backends:
  1237. - hitachi_vsp1000
  1238. Multipath with IBM Storwize
  1239. .. code-block:: yaml
  1240. parameters:
  1241. linux:
  1242. storage:
  1243. multipath:
  1244. enabled: true
  1245. blacklist_devices:
  1246. - /dev/sda
  1247. - /dev/sdb
  1248. backends:
  1249. - ibm_storwize
  1250. Multipath with multiple backends
  1251. .. code-block:: yaml
  1252. parameters:
  1253. linux:
  1254. storage:
  1255. multipath:
  1256. enabled: true
  1257. blacklist_devices:
  1258. - /dev/sda
  1259. - /dev/sdb
  1260. - /dev/sdc
  1261. - /dev/sdd
  1262. backends:
  1263. - ibm_storwize
  1264. - fujitsu_eternus_dxl
  1265. - hitachi_vsp1000
  1266. Disabled multipath (the default setup)
  1267. .. code-block:: yaml
  1268. parameters:
  1269. linux:
  1270. storage:
  1271. multipath:
  1272. enabled: false
  1273. Linux with local loopback device
  1274. .. code-block:: yaml
  1275. linux:
  1276. storage:
  1277. loopback:
  1278. disk1:
  1279. file: /srv/disk1
  1280. size: 50G
  1281. External config generation
  1282. --------------------------
  1283. You are able to use config support metadata between formulas and only generate
  1284. config files for external use, eg. docker, etc.
  1285. .. code-block:: yaml
  1286. parameters:
  1287. linux:
  1288. system:
  1289. config:
  1290. pillar:
  1291. jenkins:
  1292. master:
  1293. home: /srv/volumes/jenkins
  1294. approved_scripts:
  1295. - method java.net.URL openConnection
  1296. credentials:
  1297. - type: username_password
  1298. scope: global
  1299. id: test
  1300. desc: Testing credentials
  1301. username: test
  1302. password: test
  1303. Netconsole Remote Kernel Logging
  1304. --------------------------------
  1305. Netconsole logger could be configured for configfs-enabled kernels
  1306. (`CONFIG_NETCONSOLE_DYNAMIC` should be enabled). Configuration applies both in
  1307. runtime (if network is already configured), and on-boot after interface
  1308. initialization. Notes:
  1309. * receiver could be located only in same L3 domain
  1310. (or you need to configure gateway MAC manually)
  1311. * receiver's MAC is detected only on configuration time
  1312. * using broadcast MAC is not recommended
  1313. .. code-block:: yaml
  1314. parameters:
  1315. linux:
  1316. system:
  1317. netconsole:
  1318. enabled: true
  1319. port: 514 (optional)
  1320. loglevel: debug (optional)
  1321. target:
  1322. 192.168.0.1:
  1323. interface: bond0
  1324. mac: "ff:ff:ff:ff:ff:ff" (optional)
  1325. Usage
  1326. =====
  1327. Set mtu of network interface eth0 to 1400
  1328. .. code-block:: bash
  1329. ip link set dev eth0 mtu 1400
  1330. Read more
  1331. =========
  1332. * https://www.archlinux.org/
  1333. * http://askubuntu.com/questions/175172/how-do-i-configure-proxies-in-ubuntu-server-or-minimal-cli-ubuntu
  1334. Documentation and Bugs
  1335. ======================
  1336. To learn how to install and update salt-formulas, consult the documentation
  1337. available online at:
  1338. http://salt-formulas.readthedocs.io/
  1339. In the unfortunate event that bugs are discovered, they should be reported to
  1340. the appropriate issue tracker. Use Github issue tracker for specific salt
  1341. formula:
  1342. https://github.com/salt-formulas/salt-formula-linux/issues
  1343. For feature requests, bug reports or blueprints affecting entire ecosystem,
  1344. use Launchpad salt-formulas project:
  1345. https://launchpad.net/salt-formulas
  1346. You can also join salt-formulas-users team and subscribe to mailing list:
  1347. https://launchpad.net/~salt-formulas-users
  1348. Developers wishing to work on the salt-formulas projects should always base
  1349. their work on master branch and submit pull request against specific formula.
  1350. https://github.com/salt-formulas/salt-formula-linux
  1351. Any questions or feedback is always welcome so feel free to join our IRC
  1352. channel:
  1353. #salt-formulas @ irc.freenode.net