New version of salt-formula from Saltstack
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 20KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860
  1. =====
  2. Usage
  3. =====
  4. Salt is a new approach to infrastructure management. Easy enough to get
  5. running in minutes, scalable enough to manage tens of thousands of servers,
  6. and fast enough to communicate with them in seconds.
  7. Salt delivers a dynamic communication bus for infrastructures that can be used
  8. for orchestration, remote execution, configuration management and much more.
  9. Sample Metadata
  10. ===============
  11. Salt Master
  12. -----------
  13. Salt master with base formulas and pillar metadata back end:
  14. .. literalinclude:: tests/pillar/master_single_pillar.sls
  15. :language: yaml
  16. Salt master with reclass ENC metadata back end:
  17. .. literalinclude:: tests/pillar/master_single_reclass.sls
  18. :language: yaml
  19. Salt master with Architect ENC metadata back end:
  20. .. code-block:: yaml
  21. salt:
  22. master:
  23. enabled: true
  24. pillar:
  25. engine: architect
  26. project: project-name
  27. host: architect-api
  28. port: 8181
  29. username: salt
  30. password: password
  31. Salt master with multiple ``ext_pillars``:
  32. .. literalinclude:: tests/pillar/master_single_extpillars.sls
  33. :language: yaml
  34. Salt master with API:
  35. .. literalinclude:: tests/pillar/master_api.sls
  36. :language: yaml
  37. Salt master with defined user ACLs:
  38. .. literalinclude:: tests/pillar/master_acl.sls
  39. :language: yaml
  40. Salt master with preset minions:
  41. .. code-block:: yaml
  42. salt:
  43. master:
  44. enabled: true
  45. minions:
  46. - name: 'node1.system.location.domain.com'
  47. Salt master with pip based installation (optional):
  48. .. code-block:: yaml
  49. salt:
  50. master:
  51. enabled: true
  52. ...
  53. source:
  54. engine: pip
  55. version: 2016.3.0rc2
  56. Install formula through system package management:
  57. .. code-block:: yaml
  58. salt:
  59. master:
  60. enabled: true
  61. ...
  62. environment:
  63. prd:
  64. keystone:
  65. source: pkg
  66. name: salt-formula-keystone
  67. nova:
  68. source: pkg
  69. name: salt-formula-keystone
  70. version: 0.1+0~20160818133412.24~1.gbp6e1ebb
  71. postresql:
  72. source: pkg
  73. name: salt-formula-postgresql
  74. version: purged
  75. Formula keystone is installed latest version and the formulas
  76. without version are installed in one call to aptpkg module.
  77. If the version attribute is present sls iterates over formulas
  78. and take action to install specific version or remove it.
  79. The version attribute may have these values
  80. ``[latest|purged|removed|<VERSION>]``.
  81. Clone master branch of keystone formula as local feature branch:
  82. .. code-block:: yaml
  83. salt:
  84. master:
  85. enabled: true
  86. ...
  87. environment:
  88. dev:
  89. formula:
  90. keystone:
  91. source: git
  92. address: git@github.com:openstack/salt-formula-keystone.git
  93. revision: master
  94. branch: feature
  95. Salt master with specified formula refs (for example, for Gerrit
  96. review):
  97. .. code-block:: yaml
  98. salt:
  99. master:
  100. enabled: true
  101. ...
  102. environment:
  103. dev:
  104. formula:
  105. keystone:
  106. source: git
  107. address: https://git.openstack.org/openstack/salt-formula-keystone
  108. revision: refs/changes/56/123456/1
  109. Salt master logging configuration:
  110. .. code-block:: yaml
  111. salt:
  112. master:
  113. enabled: true
  114. log:
  115. level: warning
  116. file: '/var/log/salt/master'
  117. level_logfile: warning
  118. Salt minion logging configuration:
  119. .. code-block:: yaml
  120. salt:
  121. minion:
  122. enabled: true
  123. log:
  124. level: info
  125. file: '/var/log/salt/minion'
  126. level_logfile: warning
  127. Salt master with logging handlers:
  128. .. code-block:: yaml
  129. salt:
  130. master:
  131. enabled: true
  132. handler:
  133. handler01:
  134. engine: udp
  135. bind:
  136. host: 127.0.0.1
  137. port: 9999
  138. minion:
  139. handler:
  140. handler01:
  141. engine: udp
  142. bind:
  143. host: 127.0.0.1
  144. port: 9999
  145. handler02:
  146. engine: zmq
  147. bind:
  148. host: 127.0.0.1
  149. port: 9999
  150. Salt engine definition for saltgraph metadata collector:
  151. .. code-block:: yaml
  152. salt:
  153. master:
  154. engine:
  155. graph_metadata:
  156. engine: saltgraph
  157. host: 127.0.0.1
  158. port: 5432
  159. user: salt
  160. password: salt
  161. database: salt
  162. Salt engine definition for Architect service:
  163. .. code-block:: yaml
  164. salt:
  165. master:
  166. engine:
  167. architect:
  168. engine: architect
  169. project: project-name
  170. host: architect-api
  171. port: 8181
  172. username: salt
  173. password: password
  174. Salt engine definition for sending events from docker events:
  175. .. code-block:: yaml
  176. salt:
  177. master:
  178. engine:
  179. docker_events:
  180. docker_url: unix://var/run/docker.sock
  181. Salt master peer setup for remote certificate signing:
  182. .. code-block:: yaml
  183. salt:
  184. master:
  185. peer:
  186. ".*":
  187. - x509.sign_remote_certificate
  188. Salt master backup configuration:
  189. .. code-block:: yaml
  190. salt:
  191. master:
  192. backup: true
  193. initial_data:
  194. engine: backupninja
  195. home_dir: remote-backup-home-dir
  196. source: backup-node-host
  197. host: original-salt-master-id
  198. Configure verbosity of state output (used for :command:`salt`
  199. command):
  200. .. code-block:: yaml
  201. salt:
  202. master:
  203. state_output: changes
  204. Pass pillar render error to minion log:
  205. .. note:: When set to `False` this option is great for debuging.
  206. However it is not recomended for any production environment as it may contain
  207. templating data as passwords, and so on, that minion should not expose.
  208. .. code-block:: yaml
  209. salt:
  210. master:
  211. pillar_safe_render_error: False
  212. Enable Windows repository support:
  213. .. code-block:: yaml
  214. salt:
  215. master:
  216. win_repo:
  217. source: git
  218. address: https://github.com/saltstack/salt-winrepo-ng
  219. revision: master
  220. Event/Reactor systems
  221. ~~~~~~~~~~~~~~~~~~~~~
  222. Salt to synchronize node pillar and modules after start:
  223. .. code-block:: yaml
  224. salt:
  225. master:
  226. reactor:
  227. salt/minion/*/start:
  228. - salt://salt/reactor/node_start.sls
  229. Trigger basic node install:
  230. .. code-block:: yaml
  231. salt:
  232. master:
  233. reactor:
  234. salt/minion/install:
  235. - salt://salt/reactor/node_install.sls
  236. Sample event to trigger the node installation:
  237. .. code-block:: bash
  238. salt-call event.send 'salt/minion/install'
  239. Run any defined orchestration pipeline:
  240. .. code-block:: yaml
  241. salt:
  242. master:
  243. reactor:
  244. salt/orchestrate/start:
  245. - salt://salt/reactor/orchestrate_start.sls
  246. Event to trigger the orchestration pipeline:
  247. .. code-block:: bash
  248. salt-call event.send 'salt/orchestrate/start' "{'orchestrate': 'salt/orchestrate/infra_install.sls'}"
  249. Synchronise modules and pillars on minion start:
  250. .. code-block:: yaml
  251. salt:
  252. master:
  253. reactor:
  254. 'salt/minion/*/start':
  255. - salt://salt/reactor/minion_start.sls
  256. Add and/or remove the minion key:
  257. .. code-block:: yaml
  258. salt:
  259. master:
  260. reactor:
  261. salt/key/create:
  262. - salt://salt/reactor/key_create.sls
  263. salt/key/remove:
  264. - salt://salt/reactor/key_remove.sls
  265. Event to trigger the key creation:
  266. .. code-block:: bash
  267. salt-call event.send 'salt/key/create' \
  268. > "{'node_id': 'id-of-minion', 'node_host': '172.16.10.100', 'orch_post_create': 'kubernetes.orchestrate.compute_install', 'post_create_pillar': {'node_name': 'id-of-minion'}}"
  269. .. note::
  270. You can add pass additional ``orch_pre_create``, ``orch_post_create``,
  271. ``orch_pre_remove`` or ``orch_post_remove`` parameters to the event
  272. to call extra orchestrate files. This can be useful for example for
  273. registering/unregistering nodes from the monitoring alarms or dashboards.
  274. The key creation event needs to be run from other machine than the one
  275. being registered.
  276. Event to trigger the key removal:
  277. .. code-block:: bash
  278. salt-call event.send 'salt/key/remove'
  279. Control VM provisioning:
  280. .. code-block:: yaml
  281. virt:
  282. disk:
  283. three_disks:
  284. - system:
  285. size: 4096
  286. image: ubuntu.qcow
  287. - repository_snapshot:
  288. size: 8192
  289. image: snapshot.qcow
  290. - cinder-volume:
  291. size: 2048
  292. nic:
  293. control:
  294. - name: nic01
  295. bridge: br-pxe
  296. model: virtio
  297. - name: nic02
  298. bridge: br-cp
  299. model: virtio
  300. - name: nic03
  301. bridge: br-store-front
  302. model: virtio
  303. - name: nic04
  304. bridge: br-public
  305. model: virtio
  306. - name: nic05
  307. bridge: br-prv
  308. model: virtio
  309. virtualport:
  310. type: openvswitch
  311. salt:
  312. control:
  313. enabled: true
  314. virt_enabled: true
  315. size:
  316. medium_three_disks:
  317. cpu: 2
  318. ram: 4
  319. disk_profile: three_disks
  320. cluster:
  321. mycluster:
  322. domain: neco.virt.domain.com
  323. engine: virt
  324. #Option to set rng globaly
  325. rng: false
  326. node:
  327. ubuntu1:
  328. provider: node01.domain.com
  329. image: ubuntu.qcow
  330. size: medium
  331. img_dest: /var/lib/libvirt/ssdimages
  332. #Rng defined on node will have higher priority then global one
  333. rng:
  334. backend: /dev/urandom
  335. model: random
  336. rate:
  337. period: '1800'
  338. bytes: '1500'
  339. mac:
  340. nic01: AC:DE:48:AA:AA:AA
  341. nic02: AC:DE:48:AA:AA:BB
  342. To enable Redis plugin for the Salt caching subsystem, use the
  343. below pillar structure:
  344. .. code-block:: yaml
  345. salt:
  346. master:
  347. cache:
  348. plugin: redis
  349. host: localhost
  350. port: 6379
  351. db: '0'
  352. password: pass_word
  353. bank_prefix: 'MCP'
  354. bank_keys_prefix: 'MCPKEY'
  355. key_prefix: 'KEY'
  356. separator: '@'
  357. Jinja options
  358. -------------
  359. Use the following options to update default Jinja renderer options.
  360. Salt recognize Jinja options for templates and for the ``sls`` files.
  361. For full list of options, see Jinja documentation:
  362. http://jinja.pocoo.org/docs/api/#high-level-api
  363. .. code-block:: yaml
  364. salt:
  365. renderer:
  366. # for templates
  367. jinja: &jina_env
  368. # Default Jinja environment options
  369. block_start_string: '{%'
  370. block_end_string: '%}'
  371. variable_start_string: '{{'
  372. variable_end_string: '}}'
  373. comment_start_string: '{#'
  374. comment_end_string: '#}'
  375. keep_trailing_newline: False
  376. newline_sequence: '\n'
  377. # Next two are enabled by default in Salt
  378. trim_blocks: True
  379. lstrip_blocks: True
  380. # Next two are not enabled by default in Salt
  381. # but worth to consider to enable in future for salt-formulas
  382. line_statement_prefix: '%'
  383. line_comment_prefix: '##'
  384. # for .sls state files
  385. jinja_sls: *jinja_env
  386. With the ``line_statement/comment* _prefix`` options enabled following
  387. code statements are valid:
  388. .. code-block:: yaml
  389. %- set myvar = 'one'
  390. ## You can mix even with '{%'
  391. {%- set myvar = 'two' %} ## comment
  392. %- set mylist = ['one', 'two', 'three'] ## comment
  393. ## comment
  394. %- for item in mylist: ## comment
  395. {{- item }}
  396. %- endfor
  397. Encrypted pillars
  398. ~~~~~~~~~~~~~~~~~
  399. .. note:: NACL and the below configuration will be available in Salt > 2017.7.
  400. External resources:
  401. - Tutorial to configure the Salt and Reclass ``ext_pillar`` and NACL:
  402. http://apealive.net/post/2017-09-salt-nacl-ext-pillar/
  403. - SaltStack documentation:
  404. https://docs.saltstack.com/en/latest/ref/modules/all/salt.modules.nacl.html
  405. Configure salt NACL module:
  406. .. code-block:: bash
  407. pip install --upgrade libnacl===1.5.2
  408. salt-call --local nacl.keygen /etc/salt/pki/master/nacl
  409. local:
  410. saved sk_file:/etc/salt/pki/master/nacl pk_file: /etc/salt/pki/master/nacl.pub
  411. .. code-block:: yaml
  412. salt:
  413. master:
  414. pillar:
  415. reclass: *reclass
  416. nacl:
  417. index: 99
  418. nacl:
  419. box_type: sealedbox
  420. sk_file: /etc/salt/pki/master/nacl
  421. pk_file: /etc/salt/pki/master/nacl.pub
  422. #sk: None
  423. #pk: None
  424. NACL encrypt secrets:
  425. .. code-block:: bash
  426. salt-call --local nacl.enc 'my_secret_value' pk_file=/etc/salt/pki/master/nacl.pub
  427. hXTkJpC1hcKMS7yZVGESutWrkvzusXfETXkacSklIxYjfWDlMJmR37MlmthdIgjXpg4f2AlBKb8tc9Woma7q
  428. # or
  429. salt-run nacl.enc 'myotherpass'
  430. ADDFD0Rav6p6+63sojl7Htfrncp5rrDVyeE4BSPO7ipq8fZuLDIVAzQLf4PCbDqi+Fau5KD3/J/E+Pw=
  431. NACL encrypted values on pillar:
  432. Use Boxed syntax `NACL[CryptedValue=]` to encode value on pillar:
  433. .. code-block:: yaml
  434. my_pillar:
  435. my_nacl:
  436. key0: unencrypted_value
  437. key1: NACL[hXTkJpC1hcKMS7yZVGESutWrkvzusXfETXkacSklIxYjfWDlMJmR37MlmthdIgjXpg4f2AlBKb8tc9Woma7q]
  438. NACL large files:
  439. .. code-block:: bash
  440. salt-call nacl.enc_file /tmp/cert.crt out=/srv/salt/env/dev/cert.nacl
  441. # or more advanced
  442. cert=$(cat /tmp/cert.crt)
  443. salt-call --out=newline_values_only nacl.enc_pub data="$cert" > /srv/salt/env/dev/cert.nacl
  444. NACL within template/native pillars:
  445. .. code-block:: yaml
  446. pillarexample:
  447. user: root
  448. password1: {{salt.nacl.dec('DRB7Q6/X5gGSRCTpZyxS6hlbWj0llUA+uaVyvou3vJ4=')|json}}
  449. cert_key: {{salt.nacl.dec_file('/srv/salt/env/dev/certs/example.com/cert.nacl')|json}}
  450. cert_key2: {{salt.nacl.dec_file('salt:///certs/example.com/cert2.nacl')|json}}
  451. Salt Syndic
  452. -----------
  453. The master of masters:
  454. .. code-block:: yaml
  455. salt:
  456. master:
  457. enabled: true
  458. order_masters: True
  459. Lower syndicated master:
  460. .. code-block:: yaml
  461. salt:
  462. syndic:
  463. enabled: true
  464. master:
  465. host: master-of-master-host
  466. timeout: 5
  467. Syndicated master with multiple master of masters:
  468. .. code-block:: yaml
  469. salt:
  470. syndic:
  471. enabled: true
  472. masters:
  473. - host: master-of-master-host1
  474. - host: master-of-master-host2
  475. timeout: 5
  476. Salt Minion
  477. -----------
  478. Minion ID by default triggers dependency on Linux formula, as it uses fqdn
  479. configured from `linux.system.name` and `linux.system.domain` pillar.
  480. To override, provide exact minion ID you require. The same can be set for
  481. master ID rendered at ``master.conf``.
  482. .. code-block:: yaml
  483. salt:
  484. minion:
  485. id: minion1.production
  486. master:
  487. id: master.production
  488. Simplest Salt minion setup with central configuration node:
  489. .. literalinclude:: tests/pillar/minion_master.sls
  490. :language: yaml
  491. Multi-master Salt minion setup:
  492. .. literalinclude:: tests/pillar/minion_multi_master.sls
  493. :language: yaml
  494. Salt minion with salt mine options:
  495. .. literalinclude:: tests/pillar/minion_mine.sls
  496. :language: yaml
  497. Salt minion with graphing dependencies:
  498. .. literalinclude:: tests/pillar/minion_graph.sls
  499. :language: yaml
  500. Salt minion behind HTTP proxy:
  501. .. code-block:: yaml
  502. salt:
  503. minion:
  504. proxy:
  505. host: 127.0.0.1
  506. port: 3128
  507. Salt minion to specify non-default HTTP backend. The default
  508. tornado backend does not respect HTTP proxy settings set as
  509. environment variables. This is useful for cases where you need
  510. to set no_proxy lists.
  511. .. code-block:: yaml
  512. salt:
  513. minion:
  514. backend: urllib2
  515. Salt minion with PKI certificate authority (CA):
  516. .. literalinclude:: tests/pillar/minion_pki_ca.sls
  517. :language: yaml
  518. Salt minion using PKI certificate
  519. .. literalinclude:: tests/pillar/minion_pki_cert.sls
  520. :language: yaml
  521. Salt minion trust CA certificates issued by salt CA on a
  522. specific host (ie: salt-master node):
  523. .. code-block:: yaml
  524. salt:
  525. minion:
  526. trusted_ca_minions:
  527. - cfg01
  528. Salt Minion Proxy
  529. ~~~~~~~~~~~~~~~~~
  530. Salt proxy pillar:
  531. .. code-block:: yaml
  532. salt:
  533. minion:
  534. proxy_minion:
  535. master: localhost
  536. device:
  537. vsrx01.mydomain.local:
  538. enabled: true
  539. engine: napalm
  540. csr1000v.mydomain.local:
  541. enabled: true
  542. engine: napalm
  543. .. note:: This is pillar of the the real salt-minion
  544. Proxy pillar for IOS device:
  545. .. code-block:: yaml
  546. proxy:
  547. proxytype: napalm
  548. driver: ios
  549. host: csr1000v.mydomain.local
  550. username: root
  551. passwd: r00tme
  552. .. note:: This is pillar of the node thats not able to run
  553. salt-minion itself.
  554. Proxy pillar for JunOS device:
  555. .. code-block:: yaml
  556. proxy:
  557. proxytype: napalm
  558. driver: junos
  559. host: vsrx01.mydomain.local
  560. username: root
  561. passwd: r00tme
  562. optional_args:
  563. config_format: set
  564. .. note:: This pillar applies to the node that can not run
  565. salt-minion itself.
  566. Salt SSH
  567. ~~~~~~~~
  568. Salt SSH with sudoer using key:
  569. .. literalinclude:: tests/pillar/master_ssh_minion_key.sls
  570. :language: yaml
  571. Salt SSH with sudoer using password:
  572. .. literalinclude:: tests/pillar/master_ssh_minion_password.sls
  573. :language: yaml
  574. Salt SSH with root using password:
  575. .. literalinclude:: tests/pillar/master_ssh_minion_root.sls
  576. :language: yaml
  577. Salt control (cloud/kvm/docker)
  578. -------------------------------
  579. Salt cloud with local OpenStack provider:
  580. .. literalinclude:: tests/pillar/control_cloud_openstack.sls
  581. :language: yaml
  582. Salt cloud with Digital Ocean provider:
  583. .. literalinclude:: tests/pillar/control_cloud_digitalocean.sls
  584. :language: yaml
  585. Salt virt with KVM cluster:
  586. .. literalinclude:: tests/pillar/control_virt.sls
  587. :language: yaml
  588. Salt virt with custom destination for image file:
  589. .. literalinclude:: tests/pillar/control_virt_custom.sls
  590. :language: yaml
  591. Usage
  592. =====
  593. Working with salt-cloud:
  594. .. code-block:: bash
  595. salt-cloud -m /path/to/map --assume-yes
  596. Debug LIBCLOUD for salt-cloud connection:
  597. .. code-block:: bash
  598. export LIBCLOUD_DEBUG=/dev/stderr; salt-cloud --list-sizes provider_name --log-level all
  599. Read more
  600. =========
  601. * http://salt.readthedocs.org/en/latest/
  602. * https://github.com/DanielBryan/salt-state-graph
  603. * http://karlgrz.com/testing-salt-states-rapidly-with-docker/
  604. * https://mywushublog.com/2013/03/configuration-management-with-salt-stack/
  605. * http://russell.ballestrini.net/replace-the-nagios-scheduler-and-nrpe-with-salt-stack/
  606. * https://github.com/saltstack-formulas/salt-formula
  607. * http://docs.saltstack.com/en/latest/topics/tutorials/multimaster.html
  608. salt-cloud
  609. ----------
  610. * http://www.blog.sandro-mathys.ch/2013/07/setting-user-password-when-launching.html
  611. * http://cloudinit.readthedocs.org/en/latest/topics/examples.html
  612. * http://salt-cloud.readthedocs.org/en/latest/topics/install/index.html
  613. * http://docs.saltstack.com/topics/cloud/digitalocean.html
  614. * http://salt-cloud.readthedocs.org/en/latest/topics/rackspace.html
  615. * http://salt-cloud.readthedocs.org/en/latest/topics/map.html
  616. * http://docs.saltstack.com/en/latest/topics/tutorials/multimaster.html
  617. Documentation and Bugs
  618. ======================
  619. * http://salt-formulas.readthedocs.io/
  620. Learn how to install and update salt-formulas
  621. * https://github.com/salt-formulas/salt-formula-salt/issues
  622. In the unfortunate event that bugs are discovered, report the issue to the
  623. appropriate issue tracker. Use the Github issue tracker for a specific salt
  624. formula
  625. * https://launchpad.net/salt-formulas
  626. For feature requests, bug reports, or blueprints affecting the entire
  627. ecosystem, use the Launchpad salt-formulas project
  628. * https://launchpad.net/~salt-formulas-users
  629. Join the salt-formulas-users team and subscribe to mailing list if required
  630. * https://github.com/salt-formulas/salt-formula-salt
  631. Develop the salt-formulas projects in the master branch and then submit pull
  632. requests against a specific formula
  633. * #salt-formulas @ irc.freenode.net
  634. Use this IRC channel in case of any questions or feedback which is always
  635. welcome