1
0
Fork 0
mirror of https://github.com/ansible-collections/community.general.git synced 2024-09-14 20:13:21 +02:00

Create win_dotnet_ngen module

When .NET is installed or updated, ngen is triggered to optimise the installation. This triggers high CPU while it's happening, and usually happens at an inconvenient time.

This allows you to trigger it when you like. Full details and background in doc.

I don't know a way to figure out whether this is required without actually running it.
This commit is contained in:
Peter Mounce 2015-05-01 20:28:56 +01:00 committed by Matt Clay
parent 08e4ef5120
commit 1c6e252ca0
2 changed files with 112 additions and 0 deletions

View file

@ -0,0 +1,69 @@
#!powershell
# This file is part of Ansible
#
# Copyright 2015, Peter Mounce <public@neverrunwithscissors.com>
#
# 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 <http://www.gnu.org/licenses/>.
$ErrorActionPreference = "Stop"
# WANT_JSON
# POWERSHELL_COMMON
$params = Parse-Args $args;
$result = New-Object PSObject;
Set-Attr $result "changed" $false;
function Invoke-NGen
{
[CmdletBinding()]
param
(
[Parameter(Mandatory=$false, Position=0)] [string] $arity = ""
)
if ($arity -eq $null)
{
$arity = ""
}
$cmd = "$($env:windir)\microsoft.net\framework$($arity)\v4.0.30319\ngen.exe"
if (test-path $cmd)
{
$update = Invoke-Expression "$cmd update /force";
Set-Attr $result "dotnet_ngen$($arity)_update_exit_code" $lastexitcode
Set-Attr $result "dotnet_ngen$($arity)_update_output" $update
$eqi = Invoke-Expression "$cmd executequeueditems";
Set-Attr $result "dotnet_ngen$($arity)_eqi_exit_code" $lastexitcode
Set-Attr $result "dotnet_ngen$($arity)_eqi_output" $eqi
$result.changed = $true
}
else
{
Write-Host "Not found: $cmd"
}
}
Try
{
Invoke-NGen
Invoke-NGen -arity "64"
Exit-Json $result;
}
Catch
{
Fail-Json $result $_.Exception.Message
}

View file

@ -0,0 +1,43 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
# (c) 2015, Peter Mounce <public@neverrunwithscissors.com>
#
# 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 <http://www.gnu.org/licenses/>.
# this is a windows documentation stub. actual code lives in the .ps1
# file of the same name
DOCUMENTATION = '''
---
module: win_dotnet_ngen
version_added: "1.9"
short_description: Runs ngen to recompile DLLs after .NET updates
description:
- After .NET framework is installed/updated, Windows will probably want to recompile things to optimise for the host.
- This happens via scheduled task, usually at some inopportune time.
- This module allows you to run this task on your own schedule, so you incur the CPU hit at some more convenient and controlled time.
- http://blogs.msdn.com/b/dotnet/archive/2013/08/06/wondering-why-mscorsvw-exe-has-high-cpu-usage-you-can-speed-it-up.aspx
- Note: there are in fact two scheduled tasks for ngen but they have no triggers so aren't a problem
- Note: there's no way to test if they've been completed (?)
options:
author: Peter Mounce
'''
EXAMPLES = '''
# Run ngen tasks
win_dotnet_ngen:
'''