使用Ansible执行Powershell DSC

时间:2018-07-26 17:48:53

标签: powershell ansible dsc

我的最终目标是使用Ansible在Server 2016服务器上配置AdcsCertificationAuthority。

- name: Install ADCS with sub features and management tools
  win_feature:
    name: Adcs-Cert-Authority
    state: present
    include_management_tools: yes
  register: win_feature

- name: reboot if installing Adcs-Cert-Authority feature requires it
  win_reboot:
  when: win_feature.reboot_required

- name: Add ActiveDirectoryCSDsc
  win_psmodule:
    name: ActiveDirectoryCSDsc
    state: present

- name: Configure AdcsCertificationAuthority Powershell DSC
  win_dsc:
    resource_name: AdcsCertificationAuthority
    IsSingleInstance: 'Yes'
    CAType: 'EnterpriseRootCA'
    CryptoProviderName: 'RSA#Microsoft Software Key Storage Provider'
    KeyLength: 2048
    HashAlgorithmName: 'SHA256'
    ValidityPeriod: 'Years'
    ValidityPeriodUnits: 99
    PsDscRunAsCredential_username: ' {{ ansible_user }}'
    PsDscRunAsCredentual_password: '{{ ansible_password }}'

DSC部分失败,但是我不确定如何确定错误的来源以及其含义。

TASK [internal/qa_env_dc : Configure AdcsCertificationAuthority Powershell DSC] *************************************************************************************************************************************************************
fatal: [10.0.136.5]: FAILED! => {"changed": false, "module_stderr": "Exception calling \"Run\" with \"1\" argument(s): \"Exception calling \"Invoke\" with \"0\" argument(s): \"The running command \r\nstopped because the preference variable \"ErrorActionPreference\" or common parameter is set to Stop: Cannot bind \r\nargument to parameter 'String' because it is null.\"\"\r\nAt line:65 char:5\r\n+     $output = $entrypoint.Run($payload)\r\n+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n    + CategoryInfo          : NotSpecified: (:) [], ParentContainsErrorRecordException\r\n    + FullyQualifiedErrorId : ScriptMethodRuntimeException\r\n \r\n", "module_stdout": "", "msg": "MODULE FAILURE", "rc": 1}

我实质上是在尝试重新创建我一直在用powershell做的事情。

Add-WindowsFeature Adcs-Cert-Authority -IncludeManagementTools
Install-AdcsCertificationAuthority -CAType EnterpriseRootCa -CryptoProviderName "RSA#Microsoft Software Key Storage Provider" -KeyLength 2048 -HashAlgorithmName SHA256 -ValidityPeriod Years -ValidityPeriodUnits 99 -Credential $mycreds -Force:$true

我的ansible_user和ansible_password用于域管理员帐户,因此我认为我的权限应该可以。

im使用的DSC模块的github存储库与ansible并没有直接关系,因此那里没有什么可以帮助的,但是Im是在这里获取参数的。

https://github.com/PowerShell/ActiveDirectoryCSDsc

我还尝试从上述示例中复制我的部署。

https://docs.ansible.com/ansible/2.5/modules/win_dsc_module.html

1 个答案:

答案 0 :(得分:4)

不幸的是,Ansible在这种情况下不会为您提供帮助。

最好的方法是使用相同的参数分别调试DSC部件。在这种情况下,这很烂,因为这是一个很大的问题。如果成功,您将建立CA。如果可以的话,出于理智的考虑,请部署一个可以持续拆除和启动的测试环境。

如果幸运的话,您会在Test方法中找到不会改变任何问题的问题。

第一步,转到正在运行win_dsc的主机上。打开PowerShell。

创建一个包含DSC模块所有参数的[hashtable],如下所示:

if (-not $cred) {
    $cred = Get-Credential # maybe just run this once in your session?
}

$params = @{
    IsSingleInstance = $true
    CAType = 'EnterpriseRootCA'
    CryptoProviderName = 'RSA#Microsoft Software Key Storage Provider'
    KeyLength = 2048
    HashAlgorithmName = 'SHA256'
    ValidityPeriod = 'Years'
    ValidityPeriodUnits = 99
    PsDscRunAsCredential = $cred
}

接下来,直接调用DSC资源,让我们使用Test方法:

Invoke-DscResource -Name AdcsCertificationAuthority -ModuleName ActiveDirectoryCSDsc -Property $params -Verbose -Method Test

看看它吐出什么。它可能会因类似的错误而失败。希望能做到。如果没有,请尝试使用Get方法,以防Set使用它,但Test没有使用。这不太可能,但是您希望尽可能避免使用Set

如果一切运行顺利,请使用方法Set运行。如果成功,请返回到ansible,找出有什么区别(ansible用户是否正在进行身份验证,因为它具有调用DSC的权限?)。

如果您在任何时候遇到故障并想更深入地研究,则可以调试实际的DSC调用。这有点令人费解。

首先,Enable-DscDebug -BreakAll

接下来,打开一个单独的PowerShell ISE窗口(这是我的偏好,使事情变得更容易)。然后,在相同的原始窗口(而不是新的ISE窗口)中重新运行之前执行的Invoke-DscResource命令。

它会中断,并且会为您提供一系列要运行的命令以连接到调试会话。该列表将包含Enter-PSHostProcess。在ISE窗口的终端中运行这些命令。

您将进入正在运行的DSC流程,您将看到该模块的源代码,并能够逐步解决该问题并找出问题所在。

这时,您可能会发现传递的参数不太正确,并且可以通过对其进行调整来修复调用。很好。

您可能会发现模块中存在错误,在这种情况下,您可以报告该错误,甚至可以通过请求请求提供修复;这需要时间。

与此同时,您可以自己克隆该模块,然后使用不满足PR要求的快速修复程序将其分发到服务器。

这里有很多可能性,但是如果您发现实际错误,则可能会提出有关如何处理该特定问题的新问题。

注释

我发现在调试过程中,连接到会话的时间大约有一半导致无法完成的完全卡住的调试会话。在这种情况下,请使用他们给您的PID终止进程。无论如何,您可能必须在两次运行之间进行此操作,不要担心。

最后,在再次尝试使用DSC(例如从Ansible)之前,不要忘记禁用调试!

Disable-DscDebug

(强烈建议您在禁用调试后也杀死该进程)