我的最终目标是使用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
答案 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
(强烈建议您在禁用调试后也杀死该进程)