diff --git a/library/windows/win_service b/library/windows/win_service new file mode 100644 index 00000000000..d26ee0840b2 --- /dev/null +++ b/library/windows/win_service @@ -0,0 +1,72 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# (c) 2014, Chris Hoffman +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . + +# this is a windows documentation stub. actual code lives in the .ps1 +# file of the same name + +DOCUMENTATION = ''' +--- +module: win_service +version_added: "1.7" +short_description: Manages Windows services +description: + - Manages Windows services +options: + name: + description: + - Name of the service + required: true + default: null + aliases: [] + start_mode: + description: + - Set the startup type for the service + required: false + choices: + - auto + - manual + - disabled + state: + description: + - C(started)/C(stopped) are idempotent actions that will not run + commands unless necessary. C(restarted) will always bounce the + service. + required: false + choices: + - started + - stopped + - restarted + default: null + aliases: [] +author: Chris Hoffman +''' + +EXAMPLES = ''' + # Restart a service + win_service: + name: ncover + state: restarted + + # Set service startup mode to auto and ensure it is started + win_service: + name: ncover + start_mode: auto + state: started +''' diff --git a/library/windows/win_service.ps1 b/library/windows/win_service.ps1 new file mode 100644 index 00000000000..535707d329d --- /dev/null +++ b/library/windows/win_service.ps1 @@ -0,0 +1,76 @@ +#!powershell +# This file is part of Ansible +# +# Copyright 2014, Chris Hoffman +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . + +# WANT_JSON +# POWERSHELL_COMMON + +$params = Parse-Args $args; + +$result = New-Object PSObject; +Set-Attr $result "changed" $false; + +If (-not $params.name.GetType) +{ + Fail-Json $result "missing required arguments: name" +} + +If ($params.state) { + $state = $params.state.ToString().ToLower() + If (($state -ne 'started') -and ($state -ne 'stopped') -and ($state -ne 'restarted')) { + Fail-Json $result "state is '$state'; must be 'started', 'stopped', or 'restarted'" + } +} + +If ($params.start_mode) { + $startMode = $params.start_mode.ToString().ToLower() + If (($startMode -ne 'auto') -and ($startMode -ne 'manual') -and ($startMode -ne 'disabled')) { + Fail-Json $result "start mode is '$startMode'; must be 'auto', 'manual', or 'disabled'" + } +} + +$svcName = $params.name +$svc = Get-Service -Name $svcName -ErrorAction SilentlyContinue +If (-not $svc) { + Fail-Json $result "Service not installed" +} + +If ($startMode) { + $svcMode = Get-WmiObject -Class Win32_Service -Property StartMode -Filter "Name='$svcName'" + + If ($svcMode.StartMode.ToLower() -ne $startMode) { + Set-Service -Name $svcName -StartupType $startMode + Set-Attr $result "changed" $true + } +} + +If ($state) { + If ($state -eq "started" -and $svc.Status -ne "Running") { + Start-Service -Name $svcName + Set-Attr $result "changed" $true; + } + ElseIf ($state -eq "stopped" -and $svcName -ne "Stopped") { + Stop-Service -Name $svcName + Set-Attr $result "changed" $true; + } + ElseIf ($state -eq "restarted") { + Restart-Service -Name $svcName + Set-Attr $result "changed" $true; + } +} + +Exit-Json $result;