Browse Source

Merge pull request #447 from noelmcloughlin/macos

feat(macos): basic launchctl service support (WIP)
tags/v1.5.0
N 4 years ago
parent
commit
497fbdda16
No account linked to committer's email address
4 changed files with 113 additions and 68 deletions
  1. +2
    -0
      salt/defaults.yaml
  2. +26
    -10
      salt/master.sls
  3. +79
    -58
      salt/minion.sls
  4. +6
    -0
      salt/osmap.yaml

+ 2
- 0
salt/defaults.yaml View File



salt_master: salt-master salt_master: salt-master
salt_minion: salt-minion salt_minion: salt-minion
salt_master_macos_plist_hash: ''
salt_minion_macos_plist_hash: ''
salt_syndic: salt-syndic salt_syndic: salt-syndic
salt_cloud: salt-cloud salt_cloud: salt-cloud
salt_api: salt-api salt_api: salt-api

+ 26
- 10
salt/master.sls View File

- .pin - .pin
{% endif %} {% endif %}


{%- if grains.os == 'MacOS' %}
salt-master-macos:
file.managed:
- name: /Library/LaunchDaemons/com.saltstack.salt.master.plist
- source: https://raw.githubusercontent.com/saltstack/salt/master/pkg/osx/scripts/com.saltstack.salt.master.plist
- source_hash: {{ salt_settings.salt_master_macos_plist_hash }}
- retry:
attempts: 2
until: True
interval: 10
splay: 10
- require_in:
- service: salt-master
{%- endif %}

salt-master: salt-master:
{% if salt_settings.install_packages %}
{% if salt_settings.install_packages %}
pkg.installed: pkg.installed:
- name: {{ salt_settings.salt_master }} - name: {{ salt_settings.salt_master }}
{%- if salt_settings.version is defined %}
{%- if salt_settings.version is defined %}
- version: {{ salt_settings.version }} - version: {{ salt_settings.version }}
{%- endif %}
{% if salt_settings.master_service_details.state != 'ignore' %}
{%- endif %}
{% if salt_settings.master_service_details.state != 'ignore' %}
- require_in: - require_in:
- service: salt-master - service: salt-master
- watch_in: - watch_in:
- service: salt-master - service: salt-master
{% endif %}
{% endif %}
{% endif %}
{% endif %}
file.recurse: file.recurse:
- name: {{ salt_settings.config_path }}/master.d - name: {{ salt_settings.config_path }}/master.d
{%- if salt_settings.master_config_use_TOFS %} {%- if salt_settings.master_config_use_TOFS %}
{%- endif %} {%- endif %}
- clean: {{ salt_settings.clean_config_d_dir }} - clean: {{ salt_settings.clean_config_d_dir }}
- exclude_pat: _* - exclude_pat: _*
{% if salt_settings.master_service_details.state != 'ignore' %}
{% if salt_settings.master_service_details.state != 'ignore' %}
service.{{ salt_settings.master_service_details.state }}: service.{{ salt_settings.master_service_details.state }}:
- enable: {{ salt_settings.master_service_details.enabled }} - enable: {{ salt_settings.master_service_details.enabled }}
- name: {{ salt_settings.master_service }} - name: {{ salt_settings.master_service }}
- watch: - watch:
- file: salt-master-macos
- file: salt-master - file: salt-master
- file: remove-old-master-conf-file - file: remove-old-master-conf-file
{% endif %}
{% if salt_settings.master_remove_config %}
{% endif %}
{% if salt_settings.master_remove_config %}
remove-default-master-conf-file: remove-default-master-conf-file:
file.absent: file.absent:
- name: {{ salt_settings.config_path }}/master - name: {{ salt_settings.config_path }}/master
{% endif %}
{% endif %}


# clean up old _defaults.conf file if they have it around # clean up old _defaults.conf file if they have it around
remove-old-master-conf-file: remove-old-master-conf-file:

+ 79
- 58
salt/minion.sls View File

- .pin - .pin
{% endif %} {% endif %}


{% if salt_settings.install_packages and grains.os == 'MacOS' %}
{%- if grains.os == 'MacOS' %}
{% if salt_settings.install_packages %}

download-salt-minion: download-salt-minion:
{% if salt_settings.salt_minion_pkg_source %}
{# only download IF we know where to get the pkg from and what version to check the current install (if installed) against #}
{# e.g. don't download unless it appears as though we're about to try and upgrade the minion #}
{% if salt_settings.salt_minion_pkg_source %} {# minion upgrade? #}
file.managed: file.managed:
- name: '/tmp/salt.pkg' - name: '/tmp/salt.pkg'
- source: {{ salt_settings.salt_minion_pkg_source }} - source: {{ salt_settings.salt_minion_pkg_source }}
{%- if salt_settings.salt_minion_pkg_hash %}
{%- if salt_settings.salt_minion_pkg_hash %}
- source_hash: {{ salt_settings.salt_minion_pkg_hash }} - source_hash: {{ salt_settings.salt_minion_pkg_hash }}
{% else %}
{% else %}
- skip_verify: True - skip_verify: True
{% endif %}
{% endif %}
- user: root - user: root
- group: wheel - group: wheel
- mode: '0644' - mode: '0644'
- test -n "{{ salt_settings.version }}" && '/opt/salt/bin/salt-minion --version=.*{{ salt_settings.version }}.*' - test -n "{{ salt_settings.version }}" && '/opt/salt/bin/salt-minion --version=.*{{ salt_settings.version }}.*'
- require_in: - require_in:
- macpackage: salt-minion - macpackage: salt-minion
{%- elif "workaround https://github.com/saltstack/salt/issues/49348" %}
- retry:
attempts: 2
until: True
interval: 10
splay: 10
{%- elif "workaround https://github.com/saltstack/salt/issues/49348" %}
cmd.run: cmd.run:
- name: /usr/local/bin/brew install {{ salt_settings.salt_minion }} - name: /usr/local/bin/brew install {{ salt_settings.salt_minion }}
- onlyif: test -x /usr/local/bin/brew - onlyif: test -x /usr/local/bin/brew
- runas: {{ salt_settings.rootuser }} - runas: {{ salt_settings.rootuser }}
{%- endif %}
{% endif %}
{%- endif %}

salt-minion-macos:
file.managed:
- onlyif: {{ grains.os == 'MacOS' }}
- name: /Library/LaunchDaemons/com.saltstack.salt.minion.plist
- source: https://raw.githubusercontent.com/saltstack/salt/master/pkg/osx/scripts/com.saltstack.salt.master.plist
- source_hash: {{ salt_settings.salt_minion_macos_plist_hash }}
- retry:
attempts: 2
until: True
interval: 10
splay: 10
- require_in:
- service: salt-minion
{%- endif %}
{%- endif %}


salt-minion: salt-minion:
{% if salt_settings.install_packages %}
{%- if grains.os == 'MacOS' and salt_settings.salt_minion_pkg_source %}
{% if salt_settings.install_packages %}
{%- if grains.os == 'MacOS' and salt_settings.salt_minion_pkg_source %}
macpackage.installed: macpackage.installed:
- name: '/tmp/salt.pkg' - name: '/tmp/salt.pkg'
- target: / - target: /
{# macpackage.installed behaves weirdly with version_check; version_check detects difference but fails to actually complete install. #}
{# use force == True as workaround #}
- force: True
{# macpackage.installed is weird with version_check, detects diff but incomplete install #}
- force: True {# workaround #}
- unless: - unless:
- test -n "{{ salt_settings.version }}" && '/opt/salt/bin/salt-minion --version=.*{{ salt_settings.version }}.*' - test -n "{{ salt_settings.version }}" && '/opt/salt/bin/salt-minion --version=.*{{ salt_settings.version }}.*'
{% if salt_settings.minion_service_details.state != 'ignore' %}
{% if salt_settings.minion_service_details.state != 'ignore' %}
- require_in: - require_in:
- service: salt-minion - service: salt-minion
{% endif %}
{% endif %}
- onchanges_in: - onchanges_in:
- cmd: remove-macpackage-salt - cmd: remove-macpackage-salt
{%- elif grains.os != 'MacOS' and "workaround https://github.com/saltstack/salt/issues/49348" %}
{%- elif grains.os != 'MacOS' and "workaround https://github.com/saltstack/salt/issues/49348" %}
pkg.installed: pkg.installed:
- name: {{ salt_settings.salt_minion }} - name: {{ salt_settings.salt_minion }}
{%- if salt_settings.version %}
{%- if salt_settings.version %}
- version: {{ salt_settings.version }} - version: {{ salt_settings.version }}
{%- endif %}
{% if salt_settings.minion_service_details.state != 'ignore' %}
{%- endif %}
{% if salt_settings.minion_service_details.state != 'ignore' %}
- require_in: - require_in:
- service: salt-minion - service: salt-minion
{% endif %}
{%- endif %}
{% endif %}
{% endif %}
{%- endif %}
{% endif %}
file.recurse: file.recurse:
- name: {{ salt_settings.config_path }}/minion.d - name: {{ salt_settings.config_path }}/minion.d
{%- if salt_settings.minion_config_use_TOFS %} {%- if salt_settings.minion_config_use_TOFS %}
{%- endif %} {%- endif %}
- clean: {{ salt_settings.clean_config_d_dir }} - clean: {{ salt_settings.clean_config_d_dir }}
- exclude_pat: _* - exclude_pat: _*
{% if salt_settings.minion_service_details.state != 'ignore' %}
{% if salt_settings.minion_service_details.state != 'ignore' %}
service.{{ salt_settings.minion_service_details.state }}: service.{{ salt_settings.minion_service_details.state }}:
- enable: {{ salt_settings.minion_service_details.enabled }} - enable: {{ salt_settings.minion_service_details.enabled }}
- name: {{ salt_settings.minion_service }} - name: {{ salt_settings.minion_service }}
- require:
- file: salt-minion
{% endif %}
{%- if not salt_settings.restart_via_at %}
- watch:
- file: salt-master-macos
- file: salt-master
- file: remove-old-minion-conf-file
{% endif %}
{%- if not salt_settings.restart_via_at %}
cmd.run: cmd.run:
{%- if grains['saltversioninfo'] >= [ 2016, 3 ] %}
{%- if grains['kernel'] == 'Windows' %}
{%- if grains['saltversioninfo'] >= [ 2016, 3 ] %}
{%- if grains['kernel'] == 'Windows' %}
- name: 'salt-call.bat --local service.restart {{ salt_settings.minion_service }}' - name: 'salt-call.bat --local service.restart {{ salt_settings.minion_service }}'
{%- else %}
{%- else %}
- name: 'salt-call --local service.restart {{ salt_settings.minion_service }} --out-file /dev/null' - name: 'salt-call --local service.restart {{ salt_settings.minion_service }} --out-file /dev/null'
{%- endif %}
{%- endif %}
- bg: True - bg: True
{%- else %}
{%- if grains['kernel'] == 'Windows' %}
{%- else %}
{%- if grains['kernel'] == 'Windows' %}
- name: 'start powershell "Restart-Service -Name {{ salt_settings.minion_service }}"' - name: 'start powershell "Restart-Service -Name {{ salt_settings.minion_service }}"'
{%- else %}
{%- else %}
# old style, pre 2016.3. fork and disown the process # old style, pre 2016.3. fork and disown the process
- name: |- - name: |-
exec 0>&- # close stdin exec 0>&- # close stdin
exec 1>&- # close stdout exec 1>&- # close stdout
exec 2>&- # close stderr exec 2>&- # close stderr
nohup salt-call --local service.restart {{ salt_settings.minion_service }} --out-file /dev/null & nohup salt-call --local service.restart {{ salt_settings.minion_service }} --out-file /dev/null &
{%- endif %}
{%- endif %}
{%- endif %}
{%- endif %}
- onchanges: - onchanges:
{%- if salt_settings.install_packages %}
{%- if grains.os == 'MacOS' and salt_settings.salt_minion_pkg_source %}
{%- if salt_settings.install_packages %}
{%- if grains.os == 'MacOS' and salt_settings.salt_minion_pkg_source %}
- macpackage: salt-minion - macpackage: salt-minion
{%- elif grains.os == 'MacOS' %}
{%- elif grains.os == 'MacOS' %}
- cmd: download-salt-minion - cmd: download-salt-minion
{%- else %}
{%- else %}
- pkg: salt-minion - pkg: salt-minion
{%- endif %}
{%- endif %}
{%- endif %}
{%- endif %}
- file: salt-minion - file: salt-minion
- file: remove-old-minion-conf-file - file: remove-old-minion-conf-file
{%- else %}
{%- else %}


{% if grains.os_family not in ['MacOS', 'FreeBSD'] %} {% if grains.os_family not in ['MacOS', 'FreeBSD'] %}
{# MacOS and FreeBSD have the 'at' command; but there's no package to install #} {# MacOS and FreeBSD have the 'at' command; but there's no package to install #}
- name: echo salt-call --local service.restart {{ salt_settings.minion_service }} | at now + 1 minute - name: echo salt-call --local service.restart {{ salt_settings.minion_service }} | at now + 1 minute
- order: last - order: last
- onchanges: - onchanges:
{%- if salt_settings.install_packages %}
{%- if grains.os == 'MacOS' and salt_settings.salt_minion_pkg_source %}
{%- if salt_settings.install_packages %}
{%- if grains.os == 'MacOS' and salt_settings.salt_minion_pkg_source %}
- macpackage: salt-minion - macpackage: salt-minion
{%- elif grains.os == 'MacOS' %}
{%- elif grains.os == 'MacOS' %}
- cmd: download-salt-minion - cmd: download-salt-minion
{%- else %}
{%- else %}
- pkg: salt-minion - pkg: salt-minion
{%- endif %}
{%- endif %}
{%- endif %}
{%- endif %}
- file: salt-minion - file: salt-minion
- file: remove-old-minion-conf-file - file: remove-old-minion-conf-file
{%- endif %}
{%- endif %}


{% if 'inotify' in salt_settings.get('minion', {}).get('beacons', {}) and salt_settings.get('pyinotify', False) %}
{% if 'inotify' in salt_settings.get('minion', {}).get('beacons', {}) and salt_settings.get('pyinotify', False) %}
salt-minion-beacon-inotify: salt-minion-beacon-inotify:
pkg.installed: pkg.installed:
- name: {{ salt_settings.pyinotify }} - name: {{ salt_settings.pyinotify }}
- service: salt-minion - service: salt-minion
- watch_in: - watch_in:
- service: salt-minion - service: salt-minion
{% endif %}
{% endif %}


{% if salt_settings.minion_remove_config %}
{% if salt_settings.minion_remove_config %}
remove-default-minion-conf-file: remove-default-minion-conf-file:
file.absent: file.absent:
- name: {{ salt_settings.config_path }}/minion - name: {{ salt_settings.config_path }}/minion
{% endif %}
{% endif %}


# clean up old _defaults.conf file if they have it around # clean up old _defaults.conf file if they have it around
remove-old-minion-conf-file: remove-old-minion-conf-file:
file.absent: file.absent:
- name: {{ salt_settings.config_path }}/minion.d/_defaults.conf - name: {{ salt_settings.config_path }}/minion.d/_defaults.conf


{% if grains.os == 'MacOS' %}
{% if grains.os == 'MacOS' %}
remove-macpackage-salt: remove-macpackage-salt:
file.absent: file.absent:
- name: /tmp/salt.pkg - name: /tmp/salt.pkg
- force: True - force: True
{% endif %}
{% endif %}

+ 6
- 0
salt/osmap.yaml View File

config_path: /opt/local/etc/salt config_path: /opt/local/etc/salt
master: master:
gitfs_provider: dulwich gitfs_provider: dulwich

MacOS:
minion_service: com.saltstack.salt.minion
master_service: com.saltstack.salt.master
salt_master_macos_plist_hash: 8435331b2d48ca8f0759f216e5b15ec9171a4216b1441328c732c6906728b7c9
salt_minion_macos_plist_hash: 26b33da12e0d8960ee96b488c8352002c22a377c19bf3df3f986a1e49eca8b20

Loading…
Cancel
Save