blob: 620f582eb27bba2ea2d95935646c2b3413c6e020 [file] [log] [blame]
Aleš Komárek63572992017-04-11 13:16:44 +02001============
2Linux Fomula
3============
Filip Pytlounf5383a42015-10-06 16:28:32 +02004
5Linux Operating Systems.
6
7* Ubuntu
8* CentOS
9* RedHat
10* Fedora
11* Arch
12
Aleš Komárek63572992017-04-11 13:16:44 +020013Sample Pillars
Filip Pytlounf5383a42015-10-06 16:28:32 +020014==============
15
Aleš Komárek63572992017-04-11 13:16:44 +020016
17Linux System
Filip Pytlounf5383a42015-10-06 16:28:32 +020018------------
19
20Basic Linux box
21
22.. code-block:: yaml
23
24 linux:
25 system:
26 enabled: true
27 name: 'node1'
28 domain: 'domain.com'
29 cluster: 'system'
30 environment: prod
31 timezone: 'Europe/Prague'
32 utc: true
33
azvyagintsev967af132017-06-12 12:25:24 +030034Linux with system users, some with password set:
35.. WARNING::
36If no 'password' variable has been passed - any predifined password
37will be removed.
Filip Pytlounf5383a42015-10-06 16:28:32 +020038
39.. code-block:: yaml
40
41 linux:
42 system:
43 ...
44 user:
45 jdoe:
46 name: 'jdoe'
47 enabled: true
48 sudo: true
49 shell: /bin/bash
50 full_name: 'Jonh Doe'
51 home: '/home/jdoe'
52 email: 'jonh@doe.com'
53 jsmith:
54 name: 'jsmith'
55 enabled: true
azvyagintsev967af132017-06-12 12:25:24 +030056 full_name: 'With clear password'
Filip Pytlounf5383a42015-10-06 16:28:32 +020057 home: '/home/jsmith'
azvyagintsev967af132017-06-12 12:25:24 +030058 hash_password: true
59 password: "userpassword"
60 mark:
61 name: 'mark'
62 enabled: true
63 full_name: "unchange password'
64 home: '/home/mark'
65 password: false
66 elizabeth:
67 name: 'elizabeth'
68 enabled: true
69 full_name: 'With hased password'
70 home: '/home/elizabeth'
71 password: "$6$nUI7QEz3$dFYjzQqK5cJ6HQ38KqG4gTWA9eJu3aKx6TRVDFh6BVJxJgFWg2akfAA7f1fCxcSUeOJ2arCO6EEI6XXnHXxG10"
Filip Pytlounf5383a42015-10-06 16:28:32 +020072
Petr Michalec1c4c8d82017-02-28 19:09:21 +010073Configure sudo for users and groups under ``/etc/sudoers.d/``.
74This ways ``linux.system.sudo`` pillar map to actual sudo attributes:
75
76.. code-block:: jinja
Aleš Komárek63572992017-04-11 13:16:44 +020077
Petr Michalec1c4c8d82017-02-28 19:09:21 +010078 # simplified template:
79 Cmds_Alias {{ alias }}={{ commands }}
80 {{ user }} {{ hosts }}=({{ runas }}) NOPASSWD: {{ commands }}
81 %{{ group }} {{ hosts }}=({{ runas }}) NOPASSWD: {{ commands }}
82
83 # when rendered:
84 saltuser1 ALL=(ALL) NOPASSWD: ALL
85
Petr Michalec1c4c8d82017-02-28 19:09:21 +010086.. code-block:: yaml
Aleš Komárek63572992017-04-11 13:16:44 +020087
Petr Michalec1c4c8d82017-02-28 19:09:21 +010088 linux:
89 system:
90 sudo:
91 enabled: true
Tomas Kammd8eb3002017-05-08 19:30:29 +020092 aliases:
Petr Michalec1c4c8d82017-02-28 19:09:21 +010093 host:
94 LOCAL:
95 - localhost
96 PRODUCTION:
97 - db1
98 - db2
99 runas:
100 DBA:
101 - postgres
102 - mysql
103 SALT:
104 - root
105 command:
106 # Note: This is not 100% safe when ALL keyword is used, user still may modify configs and hide his actions.
107 # Best practice is to specify full list of commands user is allowed to run.
108 SUPPORT_RESTRICTED:
109 - /bin/vi /etc/sudoers*
110 - /bin/vim /etc/sudoers*
111 - /bin/nano /etc/sudoers*
112 - /bin/emacs /etc/sudoers*
113 - /bin/su - root
114 - /bin/su -
115 - /bin/su
116 - /usr/sbin/visudo
117 SUPPORT_SHELLS:
118 - /bin/sh
119 - /bin/ksh
120 - /bin/bash
121 - /bin/rbash
122 - /bin/dash
123 - /bin/zsh
124 - /bin/csh
125 - /bin/fish
126 - /bin/tcsh
127 - /usr/bin/login
128 - /usr/bin/su
129 - /usr/su
130 ALL_SALT_SAFE:
131 - /usr/bin/salt state*
132 - /usr/bin/salt service*
133 - /usr/bin/salt pillar*
134 - /usr/bin/salt grains*
135 - /usr/bin/salt saltutil*
136 - /usr/bin/salt-call state*
137 - /usr/bin/salt-call service*
138 - /usr/bin/salt-call pillar*
139 - /usr/bin/salt-call grains*
140 - /usr/bin/salt-call saltutil*
141 SALT_TRUSTED:
142 - /usr/bin/salt*
143 users:
144 # saltuser1 with default values: saltuser1 ALL=(ALL) NOPASSWD: ALL
145 saltuser1: {}
146 saltuser2:
147 hosts:
148 - LOCAL
149 # User Alias DBA
150 DBA:
151 hosts:
152 - ALL
153 commands:
154 - ALL_SALT_SAFE
155 groups:
156 db-ops:
157 hosts:
158 - ALL
159 - '!PRODUCTION'
160 runas:
161 - DBA
162 commands:
163 - /bin/cat *
164 - /bin/less *
165 - /bin/ls *
166 salt-ops:
167 hosts:
168 - 'ALL'
169 runas:
170 - SALT
171 commands:
172 - SUPPORT_SHELLS
173 salt-ops-2nd:
174 name: salt-ops
175 nopasswd: false
Jakub Josef7a9d9b92017-05-16 11:39:01 +0200176 setenv: true # Enable sudo -E option
Petr Michalec1c4c8d82017-02-28 19:09:21 +0100177 runas:
178 - DBA
179 commands:
180 - ALL
181 - '!SUPPORT_SHELLS'
182 - '!SUPPORT_RESTRICTED'
183
Filip Pytlounf5383a42015-10-06 16:28:32 +0200184Linux with package, latest version
185
186.. code-block:: yaml
187
188 linux:
189 system:
190 ...
191 package:
192 package-name:
193 version: latest
194
195Linux with package from certail repo, version with no upgrades
196
197.. code-block:: yaml
198
199 linux:
200 system:
201 ...
202 package:
203 package-name:
204 version: 2132.323
205 repo: 'custom-repo'
206 hold: true
207
208Linux with package from certail repo, version with no GPG verification
209
210.. code-block:: yaml
211
212 linux:
213 system:
214 ...
215 package:
216 package-name:
217 version: 2132.323
218 repo: 'custom-repo'
219 verify: false
220
Bruno Binet69a9d8d2017-02-16 22:34:32 +0100221Linux with autoupdates (automatically install security package updates)
222
223.. code-block:: yaml
224
225 linux:
226 system:
227 ...
228 autoupdates:
229 enabled: true
230 mail: root@localhost
231 mail_only_on_error: true
232 remove_unused_dependencies: false
233 automatic_reboot: true
234 automatic_reboot_time: "02:00"
235
Filip Pytlounf5383a42015-10-06 16:28:32 +0200236Linux with cron jobs
Filip Pytloun91222222017-08-04 10:55:27 +0200237By default it will use name as an identifier, unless identifier key is
238explicitly set or False (then it will use Salt's default behavior which is
239identifier same as command resulting in not being able to change it)
Filip Pytlounf5383a42015-10-06 16:28:32 +0200240
241.. code-block:: yaml
242
243 linux:
244 system:
245 ...
246 job:
247 cmd1:
248 command: '/cmd/to/run'
Filip Pytloun91222222017-08-04 10:55:27 +0200249 identifier: cmd1
Filip Pytlounf5383a42015-10-06 16:28:32 +0200250 enabled: true
251 user: 'root'
252 hour: 2
253 minute: 0
254
Filip Pytlound0a29e72015-11-30 15:23:34 +0100255Linux security limits (limit sensu user memory usage to max 1GB):
256
257.. code-block:: yaml
258
259 linux:
260 system:
261 ...
262 limit:
263 sensu:
264 enabled: true
265 domain: sensu
266 limits:
267 - type: hard
268 item: as
269 value: 1000000
270
Filip Pytloun7fee0542015-10-15 11:19:24 +0200271Enable autologin on tty1 (may work only for Ubuntu 14.04):
272
273.. code-block:: yaml
274
275 linux:
276 system:
277 console:
278 tty1:
279 autologin: root
Filip Pytloun281d0202016-01-29 14:03:51 +0100280 # Enable serial console
281 ttyS0:
282 autologin: root
283 rate: 115200
284 term: xterm
Filip Pytloun7fee0542015-10-15 11:19:24 +0200285
286To disable set autologin to `false`.
287
Filip Pytloun7731b852016-02-01 11:13:47 +0100288Set ``policy-rc.d`` on Debian-based systems. Action can be any available
289command in ``while true`` loop and ``case`` context.
290Following will disallow dpkg to stop/start services for cassandra package automatically:
291
292.. code-block:: yaml
293
294 linux:
295 system:
296 policyrcd:
297 - package: cassandra
298 action: exit 101
299 - package: '*'
300 action: switch
301
Filip Pytlounc49445a2016-04-04 14:23:20 +0200302Set system locales:
303
304.. code-block:: yaml
305
306 linux:
307 system:
308 locale:
309 en_US.UTF-8:
310 default: true
Filip Pytlounee1745f2016-04-04 17:39:41 +0200311 "cs_CZ.UTF-8 UTF-8":
Filip Pytlounc49445a2016-04-04 14:23:20 +0200312 enabled: true
313
Andrey Shestakove7cca052017-05-24 23:06:24 +0300314Systemd settings:
315
316.. code-block:: yaml
317
318 linux:
319 system:
320 ...
321 systemd:
322 system:
323 Manager:
324 DefaultLimitNOFILE: 307200
325 DefaultLimitNPROC: 307200
326 user:
327 Manager:
328 DefaultLimitCPU: 2
329 DefaultLimitNPROC: 4
330
Filip Pytloun281034a2016-01-04 18:06:22 +0100331Kernel
332~~~~~~
333
334Install always up to date LTS kernel and headers from Ubuntu trusty:
335
336.. code-block:: yaml
337
338 linux:
339 system:
340 kernel:
341 type: generic
342 lts: trusty
343 headers: true
344
Tomáš Kukrálba35b212017-02-15 17:59:46 +0100345Load kernel modules and add them to `/etc/modules`:
346
347.. code-block:: yaml
348
349 linux:
350 system:
351 kernel:
352 modules:
353 - nf_conntrack
354 - tp_smapi
355 - 8021q
356
teoyaomiqui32b1f7c2017-05-24 14:36:09 +0300357Configure or blacklist kernel modules with additional options to `/etc/modprobe.d` following example
358will add `/etc/modprobe.d/nf_conntrack.conf` file with line `options nf_conntrack hashsize=262144`:
359
360.. code-block:: yaml
361
362 linux:
363 system:
364 kernel:
365 module:
366 nf_conntrack:
367 option:
368 hashsize: 262144
369
370
371
Filip Pytloun281034a2016-01-04 18:06:22 +0100372Install specific kernel version and ensure all other kernel packages are
373not present. Also install extra modules and headers for this kernel:
374
375.. code-block:: yaml
376
377 linux:
378 system:
379 kernel:
380 type: generic
381 extra: true
382 headers: true
383 version: 4.2.0-22
384
Jakub Pavlik32c2cb02016-01-29 12:45:29 +0100385Systcl kernel parameters
386
387.. code-block:: yaml
388
389 linux:
390 system:
391 kernel:
392 sysctl:
393 net.ipv4.tcp_keepalive_intvl: 3
394 net.ipv4.tcp_keepalive_time: 30
395 net.ipv4.tcp_keepalive_probes: 8
396
Jiri Broulikf8f55a22017-01-26 14:36:46 +0100397
398CPU
399~~~
400
teoyaomiqui32b1f7c2017-05-24 14:36:09 +0300401Enable cpufreq governor for every cpu:
Jiri Broulikf8f55a22017-01-26 14:36:46 +0100402
403.. code-block:: yaml
404
405 linux:
406 system:
407 cpu:
408 governor: performance
409
Filip Pytloun361096c2017-08-23 10:57:20 +0200410Sysfs
411~~~~~
412
413Install sysfsutils and set sysfs attributes:
414
415.. code-block:: yaml
416
417 linux:
418 system:
419 sysfs:
420 scheduler:
421 block/sda/queue/scheduler: deadline
422 power:
423 mode:
424 power/state: 0660
425 owner:
426 power/state: "root:power"
427 devices/system/cpu/cpu0/cpufreq/scaling_governor: powersave
428
Jakub Pavlikb148c8c2017-02-12 21:30:48 +0100429Huge Pages
430~~~~~~~~~~~~
431
432Huge Pages give a performance boost to applications that intensively deal
433with memory allocation/deallocation by decreasing memory fragmentation.
434
435.. code-block:: yaml
436
437 linux:
438 system:
439 kernel:
440 hugepages:
441 small:
442 size: 2M
443 count: 107520
444 mount_point: /mnt/hugepages_2MB
445 mount: false/true # default false
446 large:
447 default: true # default automatically mounted
448 size: 1G
449 count: 210
450 mount_point: /mnt/hugepages_1GB
451
452Note: not recommended to use both pagesizes in concurrently.
Jiri Broulikf8f55a22017-01-26 14:36:46 +0100453
Jakub Pavlik5398d872017-02-13 22:30:47 +0100454Intel SR-IOV
455~~~~~~~~~~~~
456
457PCI-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.
458
459.. code-block:: yaml
460
461 linux:
462 system:
463 kernel:
464 sriov: True
465 unsafe_interrupts: False # Default is false. for older platforms and AMD we need to add interrupt remapping workaround
466 rc:
467 local: |
468 #!/bin/sh -e
469 # Enable 7 VF on eth1
470 echo 7 > /sys/class/net/eth1/device/sriov_numvfs; sleep 2; ifup -a
471 exit 0
472
Jakub Pavlik6c9ead12017-02-16 21:53:13 +0100473Isolate CPU options
474~~~~~~~~~~~~~~~~~~~
475
476Remove the specified CPUs, as defined by the cpu_number values, from the general kernel
477SMP balancing and scheduler algroithms. The only way to move a process onto or off an
478"isolated" CPU is via the CPU affinity syscalls. cpu_number begins at 0, so the
479maximum value is 1 less than the number of CPUs on the system.
480
481.. code-block:: yaml
482
483 linux:
484 system:
485 kernel:
486 isolcpu: 1,2,3,4,5,6,7 # isolate first cpu 0
Jiri Broulikf8f55a22017-01-26 14:36:46 +0100487
Filip Pytlounf5383a42015-10-06 16:28:32 +0200488Repositories
489~~~~~~~~~~~~
490
491RedHat based Linux with additional OpenStack repo
492
493.. code-block:: yaml
494
495 linux:
496 system:
497 ...
498 repo:
499 rdo-icehouse:
500 enabled: true
501 source: 'http://repos.fedorapeople.org/repos/openstack/openstack-icehouse/epel-6/'
502 pgpcheck: 0
503
504Ensure system repository to use czech Debian mirror (``default: true``)
505Also pin it's packages with priority 900.
506
507.. code-block:: yaml
508
509 linux:
510 system:
511 repo:
512 debian:
513 default: true
514 source: "deb http://ftp.cz.debian.org/debian/ jessie main contrib non-free"
515 # Import signing key from URL if needed
516 key_url: "http://dummy.com/public.gpg"
517 pin:
518 - pin: 'origin "ftp.cz.debian.org"'
519 priority: 900
520 package: '*'
521
Petr Michalec10462bb2017-03-23 19:18:08 +0100522
523Package manager proxy setup globally:
524
525.. code-block:: yaml
526
527 linux:
528 system:
529 ...
530 repo:
531 apt-mk:
532 source: "deb http://apt-mk.mirantis.com/ stable main salt"
533 ...
534 proxy:
535 pkg:
536 enabled: true
537 ftp: ftp://ftp-proxy-for-apt.host.local:2121
538 ...
539 # NOTE: Global defaults for any other componet that configure proxy on the system.
540 # If your environment has just one simple proxy, set it on linux:system:proxy.
541 #
542 # fall back system defaults if linux:system:proxy:pkg has no protocol specific entries
543 # as for https and http
544 ftp: ftp://proxy.host.local:2121
545 http: http://proxy.host.local:3142
546 https: https://proxy.host.local:3143
547
548Package manager proxy setup per repository:
549
550.. code-block:: yaml
551
552 linux:
553 system:
554 ...
555 repo:
556 debian:
557 source: "deb http://apt-mk.mirantis.com/ stable main salt"
558 ...
559 apt-mk:
560 source: "deb http://apt-mk.mirantis.com/ stable main salt"
561 # per repository proxy
562 proxy:
563 enabled: true
564 http: http://maas-01:8080
565 https: http://maas-01:8080
566 ...
567 proxy:
Oleksandr Vlasov27a6c3a2017-04-11 16:01:19 -0600568 # package manager fallback defaults
Petr Michalec10462bb2017-03-23 19:18:08 +0100569 # used if linux:system:repo:apt-mk:proxy has no protocol specific entries
570 pkg:
571 enabled: true
572 ftp: ftp://proxy.host.local:2121
573 #http: http://proxy.host.local:3142
574 #https: https://proxy.host.local:3143
Oleksandr Vlasov27a6c3a2017-04-11 16:01:19 -0600575 ...
Petr Michalec10462bb2017-03-23 19:18:08 +0100576 # global system fallback system defaults
577 ftp: ftp://proxy.host.local:2121
578 http: http://proxy.host.local:3142
579 https: https://proxy.host.local:3143
580
581
Jiri Broulik34a29b42017-04-25 14:42:54 +0200582Remove all repositories:
583
584.. code-block:: yaml
585
586 linux:
587 system:
588 purge_repos: true
589
590
Petr Michalec10462bb2017-03-23 19:18:08 +0100591RC
592~~
593
Jakub Pavlik78859382016-01-21 11:26:39 +0100594rc.local example
595
596.. code-block:: yaml
597
598 linux:
599 system:
600 rc:
601 local: |
602 #!/bin/sh -e
603 #
604 # rc.local
605 #
606 # This script is executed at the end of each multiuser runlevel.
607 # Make sure that the script will "exit 0" on success or any other
608 # value on error.
609 #
610 # In order to enable or disable this script just change the execution
611 # bits.
612 #
613 # By default this script does nothing.
614 exit 0
615
Petr Michalec10462bb2017-03-23 19:18:08 +0100616
Filip Pytloun1f40dac2016-01-22 15:52:57 +0100617Prompt
618~~~~~~
619
620Setting prompt is implemented by creating ``/etc/profile.d/prompt.sh``. Every
621user can have different prompt.
622
623.. code-block:: yaml
624
625 linux:
626 system:
627 prompt:
628 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\\]
629 default: \\n\\D{%y/%m/%d %H:%M:%S} $(hostname -f)\\n[\\u@\\h:\\w]
630
631On Debian systems to set prompt system-wide it's necessary to remove setting
632PS1 in ``/etc/bash.bashrc`` and ``~/.bashrc`` (which comes from
633``/etc/skel/.bashrc``). This formula will do this automatically, but will not
Filip Pytlound9b68da2016-01-22 15:58:41 +0100634touch existing user's ``~/.bashrc`` files except root.
Jakub Pavlik78859382016-01-21 11:26:39 +0100635
Filip Pytlouneef11c12016-03-25 11:00:23 +0100636Bash
637~~~~
638
639Fix bash configuration to preserve history across sessions (like ZSH does by
640default).
641
642.. code-block:: yaml
643
644 linux:
645 system:
646 bash:
647 preserve_history: true
648
Filip Pytloune874dfb2016-01-22 16:57:34 +0100649Message of the day
650~~~~~~~~~~~~~~~~~~
651
652``pam_motd`` from package ``update-motd`` is used for dynamic messages of the
653day. Setting custom motd will cleanup existing ones.
654
655.. code-block:: yaml
656
657 linux:
658 system:
659 motd:
660 - release: |
661 #!/bin/sh
662 [ -r /etc/lsb-release ] && . /etc/lsb-release
663
664 if [ -z "$DISTRIB_DESCRIPTION" ] && [ -x /usr/bin/lsb_release ]; then
665 # Fall back to using the very slow lsb_release utility
666 DISTRIB_DESCRIPTION=$(lsb_release -s -d)
667 fi
668
669 printf "Welcome to %s (%s %s %s)\n" "$DISTRIB_DESCRIPTION" "$(uname -o)" "$(uname -r)" "$(uname -m)"
670 - warning: |
671 #!/bin/sh
672 printf "This is [company name] network.\n"
673 printf "Unauthorized access strictly prohibited.\n"
674
Marek Celoud713e9072017-05-18 15:20:25 +0200675Services
676~~~~~~~~
677
678Stop and disable linux service:
679
680.. code-block:: yaml
681
682 linux:
683 system:
684 service:
685 apt-daily.timer:
686 status: dead
687
688Possible status is dead (disable service by default), running (enable service by default), enabled, disabled.
689
Serhiy Ovsianikov67bd56a2017-08-11 15:56:01 +0300690Linux with atop service:
691
692.. code-block:: yaml
693
694 linux:
695 system:
696 atop:
697 enabled: true
698 interval: 20
699 logpath: "/var/log/atop"
700 outfile: "/var/log/atop/daily.log"
701
Filip Pytloun2f70b492016-02-19 15:55:25 +0100702RHEL / CentOS
Filip Pytloun8296bb92016-02-19 18:42:09 +0100703^^^^^^^^^^^^^
Filip Pytloun2f70b492016-02-19 15:55:25 +0100704
705Unfortunately ``update-motd`` is currently not available for RHEL so there's
706no native support for dynamic motd.
707You can still set static one, only pillar structure differs:
708
709.. code-block:: yaml
710
711 linux:
712 system:
713 motd: |
714 This is [company name] network.
715 Unauthorized access strictly prohibited.
716
Filip Pytloun8296bb92016-02-19 18:42:09 +0100717Haveged
718~~~~~~~
719
720If you are running headless server and are low on entropy, it may be a good
721idea to setup Haveged.
722
723.. code-block:: yaml
724
725 linux:
726 system:
727 haveged:
728 enabled: true
729
Filip Pytlounf5383a42015-10-06 16:28:32 +0200730Linux network
731-------------
732
733Linux with network manager
734
735.. code-block:: yaml
736
737 linux:
738 network:
739 enabled: true
740 network_manager: true
741
742Linux with default static network interfaces, default gateway interface and DNS servers
743
744.. code-block:: yaml
745
746 linux:
747 network:
748 enabled: true
749 interface:
750 eth0:
751 enabled: true
752 type: eth
753 address: 192.168.0.102
754 netmask: 255.255.255.0
755 gateway: 192.168.0.1
756 name_servers:
757 - 8.8.8.8
758 - 8.8.4.4
759 mtu: 1500
760
jan kaufman6d30adf2016-01-18 17:30:12 +0100761Linux with bonded interfaces and disabled NetworkManager
Filip Pytlounf5383a42015-10-06 16:28:32 +0200762
763.. code-block:: yaml
764
765 linux:
766 network:
767 enabled: true
768 interface:
769 eth0:
770 type: eth
771 ...
772 eth1:
773 type: eth
774 ...
775 bond0:
776 enabled: true
777 type: bond
778 address: 192.168.0.102
779 netmask: 255.255.255.0
780 mtu: 1500
781 use_in:
782 - interface: ${linux:interface:eth0}
783 - interface: ${linux:interface:eth0}
jan kaufman6d30adf2016-01-18 17:30:12 +0100784 network_manager:
785 disable: true
Filip Pytlounf5383a42015-10-06 16:28:32 +0200786
Jan Kaufman6a1ad712015-12-11 14:44:19 +0100787Linux with vlan interface_params
788
789.. code-block:: yaml
790
791 linux:
792 network:
793 enabled: true
794 interface:
795 vlan69:
796 type: vlan
jan kaufmanc0bd76f2015-12-15 16:45:44 +0100797 use_interfaces:
Jan Kaufman6a1ad712015-12-11 14:44:19 +0100798 - interface: ${linux:interface:bond0}
Jan Kaufman6a1ad712015-12-11 14:44:19 +0100799
Filip Pytlounf5383a42015-10-06 16:28:32 +0200800Linux with wireless interface parameters
801
802.. code-block:: yaml
803
804 linux:
805 network:
806 enabled: true
807 gateway: 10.0.0.1
Jan Kaufman6a1ad712015-12-11 14:44:19 +0100808 default_interface: eth0
Filip Pytlounf5383a42015-10-06 16:28:32 +0200809 interface:
810 wlan0:
811 type: eth
812 wireless:
813 essid: example
814 key: example_key
815 security: wpa
816 priority: 1
817
818Linux networks with routes defined
819
820.. code-block:: yaml
821
822 linux:
823 network:
824 enabled: true
825 gateway: 10.0.0.1
Jan Kaufman6a1ad712015-12-11 14:44:19 +0100826 default_interface: eth0
Filip Pytlounf5383a42015-10-06 16:28:32 +0200827 interface:
828 eth0:
829 type: eth
830 route:
831 default:
832 address: 192.168.0.123
833 netmask: 255.255.255.0
834 gateway: 192.168.0.1
835
836Native Linux Bridges
837
838.. code-block:: yaml
839
840 linux:
841 network:
842 interface:
843 eth1:
844 enabled: true
845 type: eth
846 proto: manual
847 up_cmds:
848 - ip address add 0/0 dev $IFACE
849 - ip link set $IFACE up
850 down_cmds:
851 - ip link set $IFACE down
852 br-ex:
853 enabled: true
854 type: bridge
855 address: ${linux:network:host:public_local:address}
856 netmask: 255.255.255.0
857 use_interfaces:
858 - eth1
859
860OpenVswitch Bridges
861
862.. code-block:: yaml
863
864 linux:
865 network:
866 bridge: openvswitch
867 interface:
868 eth1:
869 enabled: true
870 type: eth
871 proto: manual
872 up_cmds:
873 - ip address add 0/0 dev $IFACE
874 - ip link set $IFACE up
875 down_cmds:
876 - ip link set $IFACE down
877 br-ex:
878 enabled: true
879 type: bridge
880 address: ${linux:network:host:public_local:address}
881 netmask: 255.255.255.0
882 use_interfaces:
883 - eth1
884
Petr Jediný8f8ae542017-07-13 16:19:12 +0200885Debian manual proto interfaces
886
887When you are changing interface proto from static in up state to manual, you
888may need to flush ip addresses. For example, if you want to use the interface
889and the ip on the bridge. This can be done by setting the ``ipflush_onchange``
890to true.
891
892.. code-block:: yaml
893
894 linux:
895 network:
896 interface:
897 eth1:
898 enabled: true
899 type: eth
900 proto: manual
901 mtu: 9100
902 ipflush_onchange: true
903
904
Petr Jedinýd577cb52017-06-28 20:17:49 +0200905Concatinating and removing interface files
906
907Debian based distributions have `/etc/network/interfaces.d/` directory, where
908you can store configuration of network interfaces in separate files. You can
909concatinate the files to the defined destination when needed, this operation
910removes the file from the `/etc/network/interfaces.d/`. If you just need to
911remove iface files, you can use the `remove_iface_files` key.
912
913.. code-block:: yaml
914
915 linux:
916 network:
917 concat_iface_files:
918 - src: '/etc/network/interfaces.d/50-cloud-init.cfg'
919 dst: '/etc/network/interfaces'
920 remove_iface_files:
921 - '/etc/network/interfaces.d/90-custom.cfg'
922
923
Oleksandr Vlasov27a6c3a2017-04-11 16:01:19 -0600924DHCP client configuration
925
926None of the keys is mandatory, include only those you really need. For full list
927of available options under send, supersede, prepend, append refer to dhcp-options(5)
928
929.. code-block:: yaml
930
931 linux:
932 network:
933 dhclient:
934 enabled: true
935 backoff_cutoff: 15
936 initial_interval: 10
937 reboot: 10
938 retry: 60
939 select_timeout: 0
940 timeout: 120
941 send:
942 - option: host-name
943 declaration: "= gethostname()"
944 supersede:
945 - option: host-name
946 declaration: "spaceship"
947 - option: domain-name
948 declaration: "domain.home"
949 #- option: arp-cache-timeout
950 # declaration: 20
951 prepend:
952 - option: domain-name-servers
953 declaration:
954 - 8.8.8.8
955 - 8.8.4.4
956 - option: domain-search
957 declaration:
958 - example.com
959 - eng.example.com
960 #append:
961 #- option: domain-name-servers
962 # declaration: 127.0.0.1
963 # ip or subnet to reject dhcp offer from
964 reject:
965 - 192.33.137.209
966 - 10.0.2.0/24
967 request:
968 - subnet-mask
969 - broadcast-address
970 - time-offset
971 - routers
972 - domain-name
973 - domain-name-servers
974 - domain-search
975 - host-name
976 - dhcp6.name-servers
977 - dhcp6.domain-search
978 - dhcp6.fqdn
979 - dhcp6.sntp-servers
980 - netbios-name-servers
981 - netbios-scope
982 - interface-mtu
983 - rfc3442-classless-static-routes
984 - ntp-servers
985 require:
986 - subnet-mask
987 - domain-name-servers
988 # if per interface configuration required add below
989 interface:
990 ens2:
991 initial_interval: 11
992 reject:
993 - 192.33.137.210
994 ens3:
995 initial_interval: 12
996 reject:
997 - 192.33.137.211
998
Petr Michaleceb14b552017-06-01 10:27:05 +0200999Linux network systemd settings:
1000
1001.. code-block:: yaml
1002
1003 linux:
1004 network:
1005 ...
1006 systemd:
1007 link:
1008 10-iface-dmz:
1009 Match:
1010 MACAddress: c8:5b:67:fa:1a:af
1011 OriginalName: eth0
1012 Link:
1013 Name: dmz0
1014 netdev:
1015 20-bridge-dmz:
1016 match:
1017 name: dmz0
1018 network:
1019 mescription: bridge
1020 bridge: br-dmz0
1021 network:
1022 # works with lowercase, keys are by default capitalized
1023 40-dhcp:
1024 match:
1025 name: '*'
1026 network:
1027 DHCP: yes
1028
Oleksandr Vlasov27a6c3a2017-04-11 16:01:19 -06001029
Petr Michalec10462bb2017-03-23 19:18:08 +01001030Configure global environment variables
Petr Michalec10462bb2017-03-23 19:18:08 +01001031
Ales Komarek417e8c52017-08-25 15:10:29 +02001032Use ``/etc/environment`` for static system wide variable assignment after
1033boot. Variable expansion is frequently not supported.
Filip Pytlounf5383a42015-10-06 16:28:32 +02001034
1035.. code-block:: yaml
1036
1037 linux:
Petr Michalec10462bb2017-03-23 19:18:08 +01001038 system:
1039 env:
1040 BOB_VARIABLE: Alice
1041 ...
1042 BOB_PATH:
1043 - /srv/alice/bin
1044 - /srv/bob/bin
1045 ...
1046 ftp_proxy: none
1047 http_proxy: http://global-http-proxy.host.local:8080
1048 https_proxy: ${linux:system:proxy:https}
1049 no_proxy:
1050 - 192.168.0.80
1051 - 192.168.1.80
1052 - .domain.com
1053 - .local
Filip Pytlounf5383a42015-10-06 16:28:32 +02001054 ...
Petr Michalec10462bb2017-03-23 19:18:08 +01001055 # NOTE: global defaults proxy configuration.
Filip Pytlounf5383a42015-10-06 16:28:32 +02001056 proxy:
Petr Michalec10462bb2017-03-23 19:18:08 +01001057 ftp: ftp://proxy.host.local:2121
1058 http: http://proxy.host.local:3142
1059 https: https://proxy.host.local:3143
1060 noproxy:
1061 - .domain.com
1062 - .local
1063
1064Configure profile.d scripts
Petr Michalec10462bb2017-03-23 19:18:08 +01001065
Ales Komarek417e8c52017-08-25 15:10:29 +02001066The profile.d scripts are being sourced during .sh execution and support
1067variable expansion in opposite to /etc/environment global settings in
1068``/etc/environment``.
Petr Michalec10462bb2017-03-23 19:18:08 +01001069
1070.. code-block:: yaml
1071
1072 linux:
1073 system:
1074 profile:
1075 locales: |
1076 export LANG=C
1077 export LC_ALL=C
1078 ...
1079 vi_flavors.sh: |
1080 export PAGER=view
1081 export EDITOR=vim
1082 alias vi=vim
1083 shell_locales.sh: |
1084 export LANG=en_US
1085 export LC_ALL=en_US.UTF-8
1086 shell_proxies.sh: |
1087 export FTP_PROXY=ftp://127.0.3.3:2121
1088 export NO_PROXY='.local'
Filip Pytlounf5383a42015-10-06 16:28:32 +02001089
1090Linux with hosts
1091
Filip Pytloun86506fe2017-01-26 14:36:16 +01001092Parameter purge_hosts will enforce whole /etc/hosts file, removing entries
1093that are not defined in model except defaults for both IPv4 and IPv6 localhost
1094and hostname + fqdn.
Ales Komarek417e8c52017-08-25 15:10:29 +02001095
Filip Pytloun86506fe2017-01-26 14:36:16 +01001096It's good to use this option if you want to ensure /etc/hosts is always in a
1097clean state however it's not enabled by default for safety.
1098
Filip Pytlounf5383a42015-10-06 16:28:32 +02001099.. code-block:: yaml
1100
1101 linux:
1102 network:
Filip Pytloun86506fe2017-01-26 14:36:16 +01001103 purge_hosts: true
Filip Pytlounf5383a42015-10-06 16:28:32 +02001104 host:
Filip Pytloun86506fe2017-01-26 14:36:16 +01001105 # No need to define this one if purge_hosts is true
1106 hostname:
1107 address: 127.0.1.1
1108 names:
1109 - ${linux:network:fqdn}
1110 - ${linux:network:hostname}
Filip Pytlounf5383a42015-10-06 16:28:32 +02001111 node1:
1112 address: 192.168.10.200
1113 names:
1114 - node2.domain.com
1115 - service2.domain.com
1116 node2:
1117 address: 192.168.10.201
1118 names:
1119 - node2.domain.com
1120 - service2.domain.com
1121
Ales Komarek417e8c52017-08-25 15:10:29 +02001122Linux with hosts collected from mine
1123
1124In this case all dns records defined within infrastrucuture will be passed to
1125local hosts records or any DNS server. Only hosts with `grain` parameter to
1126true will be propagated to the mine.
1127
1128.. code-block:: yaml
1129
1130 linux:
1131 network:
1132 purge_hosts: true
1133 mine_dns_records: true
1134 host:
1135 node1:
1136 address: 192.168.10.200
1137 grain: true
1138 names:
1139 - node2.domain.com
1140 - service2.domain.com
Filip Pytloun86506fe2017-01-26 14:36:16 +01001141
Filip Pytlounde9bea52016-01-11 15:39:10 +01001142Setup resolv.conf, nameservers, domain and search domains
1143
1144.. code-block:: yaml
1145
1146 linux:
1147 network:
1148 resolv:
1149 dns:
Jakub Pavlik21ca2152017-02-27 22:21:09 +01001150 - 8.8.4.4
1151 - 8.8.8.8
Filip Pytlounde9bea52016-01-11 15:39:10 +01001152 domain: my.example.com
1153 search:
Jakub Pavlik21ca2152017-02-27 22:21:09 +01001154 - my.example.com
1155 - example.com
Marek Celoudf6cd1922016-12-05 13:39:49 +01001156 options:
Jakub Pavlik21ca2152017-02-27 22:21:09 +01001157 - ndots: 5
1158 - timeout: 2
1159 - attempts: 2
Filip Pytlounde9bea52016-01-11 15:39:10 +01001160
Ales Komarek417e8c52017-08-25 15:10:29 +02001161setting custom TX queue length for tap interfaces
Andrii Petrenko735761d2017-03-21 17:17:35 -07001162
1163.. code-block:: yaml
1164
1165 linux:
1166 network:
1167 tap_custom_txqueuelen: 10000
1168
Jakub Pavlik21ca2152017-02-27 22:21:09 +01001169DPDK OVS interfaces
Jakub Pavlik21ca2152017-02-27 22:21:09 +01001170
1171**DPDK OVS NIC**
1172
1173.. code-block:: yaml
1174
1175 linux:
1176 network:
1177 bridge: openvswitch
1178 dpdk:
1179 enabled: true
Oleg Bondarev9a466792017-05-25 15:55:42 +04001180 driver: uio/vfio
Jakub Pavlik21ca2152017-02-27 22:21:09 +01001181 openvswitch:
1182 pmd_cpu_mask: "0x6"
1183 dpdk_socket_mem: "1024,1024"
1184 dpdk_lcore_mask: "0x400"
1185 memory_channels: 2
1186 interface:
1187 dpkd0:
1188 name: ${_param:dpdk_nic}
1189 pci: 0000:06:00.0
Oleg Bondarev9a466792017-05-25 15:55:42 +04001190 driver: igb_uio/vfio-pci
Jakub Pavlik21ca2152017-02-27 22:21:09 +01001191 enabled: true
1192 type: dpdk_ovs_port
1193 n_rxq: 2
Oleg Bondarev43dbbd32017-05-24 17:06:19 +04001194 pmd_rxq_affinity: "0:1,1:2"
Jakub Pavlik21ca2152017-02-27 22:21:09 +01001195 bridge: br-prv
Jakub Pavlikaa759062017-03-13 15:57:26 +01001196 mtu: 9000
Jakub Pavlik21ca2152017-02-27 22:21:09 +01001197 br-prv:
1198 enabled: true
1199 type: dpdk_ovs_bridge
1200
1201**DPDK OVS Bond**
1202
1203.. code-block:: yaml
1204
1205 linux:
1206 network:
1207 bridge: openvswitch
1208 dpdk:
1209 enabled: true
Oleg Bondarev9a466792017-05-25 15:55:42 +04001210 driver: uio/vfio
Jakub Pavlik21ca2152017-02-27 22:21:09 +01001211 openvswitch:
1212 pmd_cpu_mask: "0x6"
1213 dpdk_socket_mem: "1024,1024"
1214 dpdk_lcore_mask: "0x400"
1215 memory_channels: 2
1216 interface:
1217 dpdk_second_nic:
1218 name: ${_param:primary_second_nic}
1219 pci: 0000:06:00.0
Oleg Bondarev9a466792017-05-25 15:55:42 +04001220 driver: igb_uio/vfio-pci
Jakub Pavlik21ca2152017-02-27 22:21:09 +01001221 bond: dpdkbond0
1222 enabled: true
1223 type: dpdk_ovs_port
1224 n_rxq: 2
Oleg Bondarev43dbbd32017-05-24 17:06:19 +04001225 pmd_rxq_affinity: "0:1,1:2"
Jakub Pavlikaa759062017-03-13 15:57:26 +01001226 mtu: 9000
Jakub Pavlik21ca2152017-02-27 22:21:09 +01001227 dpdk_first_nic:
1228 name: ${_param:primary_first_nic}
1229 pci: 0000:05:00.0
Oleg Bondarev9a466792017-05-25 15:55:42 +04001230 driver: igb_uio/vfio-pci
Jakub Pavlik21ca2152017-02-27 22:21:09 +01001231 bond: dpdkbond0
1232 enabled: true
1233 type: dpdk_ovs_port
1234 n_rxq: 2
Oleg Bondarev43dbbd32017-05-24 17:06:19 +04001235 pmd_rxq_affinity: "0:1,1:2"
Jakub Pavlikaa759062017-03-13 15:57:26 +01001236 mtu: 9000
Jakub Pavlik21ca2152017-02-27 22:21:09 +01001237 dpdkbond0:
1238 enabled: true
1239 bridge: br-prv
1240 type: dpdk_ovs_bond
1241 mode: active-backup
1242 br-prv:
1243 enabled: true
1244 type: dpdk_ovs_bridge
1245
Jakub Pavlikaa759062017-03-13 15:57:26 +01001246**DPDK OVS bridge for VXLAN**
1247
1248If VXLAN is used as tenant segmentation then ip address must be set on br-prv
1249
1250.. code-block:: yaml
1251
1252 linux:
1253 network:
1254 ...
1255 interface:
1256 br-prv:
1257 enabled: true
1258 type: dpdk_ovs_bridge
1259 address: 192.168.50.0
1260 netmask: 255.255.255.0
1261 mtu: 9000
Jakub Pavlik21ca2152017-02-27 22:21:09 +01001262
1263Linux storage
1264-------------
Filip Pytlounf5383a42015-10-06 16:28:32 +02001265
1266Linux with mounted Samba
1267
1268.. code-block:: yaml
1269
1270 linux:
1271 storage:
1272 enabled: true
1273 mount:
1274 samba1:
Simon Pasquier376262a2016-11-16 15:21:51 +01001275 - enabled: true
Filip Pytlounf5383a42015-10-06 16:28:32 +02001276 - path: /media/myuser/public/
1277 - device: //192.168.0.1/storage
1278 - file_system: cifs
1279 - options: guest,uid=myuser,iocharset=utf8,file_mode=0777,dir_mode=0777,noperm
1280
Jiri Broulikb017f932017-03-31 13:55:36 +02001281NFS mount
1282
1283.. code-block:: yaml
1284
1285 linux:
1286 storage:
1287 enabled: true
1288 mount:
1289 nfs_glance:
1290 enabled: true
1291 path: /var/lib/glance/images
1292 device: 172.16.10.110:/var/nfs/glance
1293 file_system: nfs
1294 opts: rw,sync
1295
1296
Jakub Pavlik21ca2152017-02-27 22:21:09 +01001297File swap configuration
Filip Pytlounf5383a42015-10-06 16:28:32 +02001298
1299.. code-block:: yaml
1300
1301 linux:
1302 storage:
1303 enabled: true
1304 swap:
1305 file:
1306 enabled: true
1307 engine: file
1308 device: /swapfile
1309 size: 1024
1310
Jakub Pavlik21ca2152017-02-27 22:21:09 +01001311Partition swap configuration
Lachlan Evenson30676512016-01-22 15:43:28 -08001312
1313.. code-block:: yaml
1314
1315 linux:
1316 storage:
1317 enabled: true
1318 swap:
1319 partition:
1320 enabled: true
1321 engine: partition
1322 device: /dev/vg0/swap
1323
Filip Pytlounc8a001a2015-12-15 14:09:19 +01001324LVM group `vg1` with one device and `data` volume mounted into `/mnt/data`
1325
1326.. code-block:: yaml
1327
1328 parameters:
1329 linux:
1330 storage:
1331 mount:
1332 data:
Simon Pasquier376262a2016-11-16 15:21:51 +01001333 enabled: true
Filip Pytlounc8a001a2015-12-15 14:09:19 +01001334 device: /dev/vg1/data
1335 file_system: ext4
1336 path: /mnt/data
1337 lvm:
1338 vg1:
1339 enabled: true
1340 devices:
1341 - /dev/sdb
1342 volume:
1343 data:
1344 size: 40G
1345 mount: ${linux:storage:mount:data}
1346
Jakub Pavlik4f742142017-08-08 15:05:50 +02001347Create partitions on disk. Specify size in MB. It expects empty
1348disk without any existing partitions.
1349
1350.. code-block:: yaml
1351
1352 linux:
1353 storage:
1354 disk:
1355 first_drive:
1356 name: /dev/loop1
1357 type: gpt
1358 partitions:
1359 - size: 200 #size in MB
1360 type: fat32
1361 - size: 300 #size in MB
Jakub Pavlik8e2140a2017-08-14 23:29:57 +02001362 mkfs: True
1363 type: xfs
Jakub Pavlik4f742142017-08-08 15:05:50 +02001364 /dev/vda1:
1365 partitions:
1366 - size: 5
1367 type: ext2
1368 - size: 10
1369 type: ext4
Ales Komareka634f4b2016-10-02 13:11:04 +02001370
1371Multipath with Fujitsu Eternus DXL
1372
1373.. code-block:: yaml
1374
1375 parameters:
1376 linux:
1377 storage:
1378 multipath:
1379 enabled: true
1380 blacklist_devices:
1381 - /dev/sda
1382 - /dev/sdb
1383 backends:
1384 - fujitsu_eternus_dxl
1385
1386Multipath with Hitachi VSP 1000
1387
1388.. code-block:: yaml
1389
1390 parameters:
1391 linux:
1392 storage:
1393 multipath:
1394 enabled: true
1395 blacklist_devices:
1396 - /dev/sda
1397 - /dev/sdb
1398 backends:
1399 - hitachi_vsp1000
1400
1401Multipath with IBM Storwize
1402
1403.. code-block:: yaml
1404
1405 parameters:
1406 linux:
1407 storage:
1408 multipath:
1409 enabled: true
1410 blacklist_devices:
1411 - /dev/sda
1412 - /dev/sdb
1413 backends:
1414 - ibm_storwize
1415
1416Multipath with multiple backends
1417
1418.. code-block:: yaml
1419
1420 parameters:
1421 linux:
1422 storage:
1423 multipath:
1424 enabled: true
1425 blacklist_devices:
1426 - /dev/sda
1427 - /dev/sdb
1428 - /dev/sdc
1429 - /dev/sdd
1430 backends:
1431 - ibm_storwize
1432 - fujitsu_eternus_dxl
1433 - hitachi_vsp1000
1434
1435Disabled multipath (the default setup)
1436
1437.. code-block:: yaml
1438
1439 parameters:
1440 linux:
1441 storage:
1442 multipath:
1443 enabled: false
1444
Simon Pasquier375001e2017-01-26 13:22:33 +01001445Linux with local loopback device
1446
1447.. code-block:: yaml
1448
1449 linux:
1450 storage:
1451 loopback:
1452 disk1:
1453 file: /srv/disk1
1454 size: 50G
1455
Filip Pytlounb2c8f852016-11-21 17:03:43 +01001456External config generation
1457--------------------------
1458
1459You are able to use config support metadata between formulas and only generate
1460config files for external use, eg. docker, etc.
1461
1462.. code-block:: yaml
1463
1464 parameters:
1465 linux:
1466 system:
1467 config:
1468 pillar:
1469 jenkins:
1470 master:
1471 home: /srv/volumes/jenkins
1472 approved_scripts:
1473 - method java.net.URL openConnection
1474 credentials:
1475 - type: username_password
1476 scope: global
1477 id: test
1478 desc: Testing credentials
1479 username: test
1480 password: test
1481
Vladimir Ereminccf28842017-04-10 23:52:10 +03001482Netconsole Remote Kernel Logging
1483--------------------------------
1484
1485Netconsole logger could be configured for configfs-enabled kernels
1486(`CONFIG_NETCONSOLE_DYNAMIC` should be enabled). Configuration applies both in
1487runtime (if network is already configured), and on-boot after interface
1488initialization. Notes:
1489
1490 * receiver could be located only in same L3 domain
1491 (or you need to configure gateway MAC manually)
1492 * receiver's MAC is detected only on configuration time
1493 * using broadcast MAC is not recommended
1494
1495.. code-block:: yaml
1496
1497 parameters:
1498 linux:
1499 system:
1500 netconsole:
1501 enabled: true
1502 port: 514 (optional)
1503 loglevel: debug (optional)
1504 target:
1505 192.168.0.1:
1506 interface: bond0
1507 mac: "ff:ff:ff:ff:ff:ff" (optional)
Ales Komareka634f4b2016-10-02 13:11:04 +02001508
Filip Pytlounf5383a42015-10-06 16:28:32 +02001509Usage
1510=====
1511
1512Set mtu of network interface eth0 to 1400
1513
1514.. code-block:: bash
1515
1516 ip link set dev eth0 mtu 1400
1517
1518Read more
1519=========
1520
1521* https://www.archlinux.org/
1522* http://askubuntu.com/questions/175172/how-do-i-configure-proxies-in-ubuntu-server-or-minimal-cli-ubuntu
Filip Pytloun018f8712017-02-02 13:02:03 +01001523
1524Documentation and Bugs
1525======================
1526
1527To learn how to install and update salt-formulas, consult the documentation
1528available online at:
1529
1530 http://salt-formulas.readthedocs.io/
1531
1532In the unfortunate event that bugs are discovered, they should be reported to
1533the appropriate issue tracker. Use Github issue tracker for specific salt
1534formula:
1535
1536 https://github.com/salt-formulas/salt-formula-linux/issues
1537
1538For feature requests, bug reports or blueprints affecting entire ecosystem,
1539use Launchpad salt-formulas project:
1540
1541 https://launchpad.net/salt-formulas
1542
1543You can also join salt-formulas-users team and subscribe to mailing list:
1544
1545 https://launchpad.net/~salt-formulas-users
1546
1547Developers wishing to work on the salt-formulas projects should always base
1548their work on master branch and submit pull request against specific formula.
1549
1550 https://github.com/salt-formulas/salt-formula-linux
1551
1552Any questions or feedback is always welcome so feel free to join our IRC
1553channel:
1554
1555 #salt-formulas @ irc.freenode.net