Puncte:0

Eroare Ansible WinRM la colectarea faptelor winrm: nu puteți apela o metodă pe un mesaj de expresie cu valoare nulă

drapel uz

Am un laborator rezident pe un server vCenter, laboratorul include 5 servere Windows și 3 Windows 10 De fiecare dată când rulez un registru de joc (orice registru de joc) în acest laborator, 2 erori apar în TASK [Gathering Facts]:

[AVERTISMENT]: Eroare la colectarea faptelor winrm: Nu puteți apela o metodă pe o expresie cu valori nule. La linia:15 char:17 +...
$ansibleFacts.ansible_win_rm_certificate_expires = $_.Nu ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:  
InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId: InvokeMethodOnNull la <ScriptBlock>, <No file>: linia 15 la <ScriptBlock>, <No file>: line  
13
[AVERTISMENT]: Eroare la colectarea faptelor factorilor: Test-Path: Accesul este refuzat La linia:10 char:17 + Test-Path -LiteralPath $facterPath +
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo: PermissionDenied: (\Domain.com\Sys... rtup\facter.exe:String) [Test-Path], UnauthorizedAccessException  
+ FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError, Microsoft.PowerShell.Commands.TestPathCommand la <ScriptBlock>, <Fără fișier>: linia 10 la <ScriptBlock>, <Nu 
fișier>: rândul 3

Jurnalul complet:

SARCINA [Adunarea faptelor] ********************************************* **************************************************** **************************************************** *** calea sarcinii: /ansible/playbooks/copy_r10_files.yml:2
redirecționare (tip: module) ansible.builtin.setup către ansible.windows.setup
Folosind fișierul modul /root/.ansible/collections/ansible_collections/ansible/windows/plugins/modules/setup.ps1
Canalizarea este activată.
<vm1.domain.com> ESTABILIȚI CONEXIUNEA WINRM PENTRU UTILIZATOR: Domeniul\hiddai pe PORTUL 5985 LA vm1.domain.com
redirecționare (tip: module) ansible.builtin.setup către ansible.windows.setup
Folosind fișierul modul /root/.ansible/collections/ansible_collections/ansible/windows/plugins/modules/setup.ps1
Canalizarea este activată.
<vm2.domain.com> ESTABILIȚI CONEXIUNEA WINRM PENTRU UTILIZATOR: DOMAIN\hiddai pe PORT 5985 LA vm1.domain.com
redirecționare (tip: module) ansible.builtin.setup către ansible.windows.setup
EXEC (prin înveliș pentru conducte)
Folosind fișierul modul /root/.ansible/collections/ansible_collections/ansible/windows/plugins/modules/setup.ps1
Canalizarea este activată.
<vm3.domain.com> STABILIȚI CONEXIUNEA WINRM PENTRU UTILIZATOR: DOMAIN\hiddai pe PORTUL 5985 LA srraalabjhqdb.r10.local
redirecționare (tip: module) ansible.builtin.setup către ansible.windows.setup
Folosind fișierul modul /root/.ansible/collections/ansible_collections/ansible/windows/plugins/modules/setup.ps1
Canalizarea este activată.
EXEC (prin înveliș pentru conducte)
<vm4.domain.com> ESTABILIȚI CONEXIUNEA WINRM PENTRU UTILIZATOR: DOMAIN\hiddai pe PORT 5985 LA vm4.domain.com
redirecționare (tip: module) ansible.builtin.setup către ansible.windows.setup
EXEC (prin înveliș pentru conducte)
Folosind fișierul modul /root/.ansible/collections/ansible_collections/ansible/windows/plugins/modules/setup.ps1
Canalizarea este activată.
<vm5.domain.com> ESTABILIȚI CONEXIUNEA WINRM PENTRU UTILIZATOR: DOMAIN\hiddai pe PORT 5985 LA vm5.domain.com
EXEC (prin înveliș pentru conducte)
EXEC (prin înveliș pentru conducte)
[AVERTISMENT]: Eroare la colectarea faptelor winrm: Nu puteți apela o metodă pe o expresie cu valori nule. La linia:15 char:17 +...
$ansibleFacts.ansible_win_rm_certificate_expires = $_.Nu ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:  
InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId: InvokeMethodOnNull la <ScriptBlock>, <No file>: linia 15 la <ScriptBlock>, <No file>: line  
13
ok: [vm3.domain.com]
redirecționare (tip: module) ansible.builtin.setup către ansible.windows.setup
Folosind fișierul modul /root/.ansible/collections/ansible_collections/ansible/windows/plugins/modules/setup.ps1
Canalizarea este activată.
<vm7.domain.com> ESTABILIȚI CONEXIUNEA WINRM PENTRU UTILIZATOR: DOMAIN\hiddai pe PORT 5985 LA vm7.domain.com
ok: [vm4.domain.com]
redirecționare (tip: module) ansible.builtin.setup către ansible.windows.setup
Folosind fișierul modul /root/.ansible/collections/ansible_collections/ansible/windows/plugins/modules/setup.ps1
Canalizarea este activată.
<vm6.domain.com> STABILIȚI CONEXIUNEA WINRM PENTRU UTILIZATOR: DOMAIN\hiddai pe PORT 5985 LA vm6.domain.com
EXEC (prin înveliș pentru conducte)
ok: [vm1.domain.com]
ok: [vm2.domain.com]
redirecționare (tip: module) ansible.builtin.setup către ansible.windows.setup
Folosind fișierul modul /root/.ansible/collections/ansible_collections/ansible/windows/plugins/modules/setup.ps1
Canalizarea este activată.
<vm8.domain.com> ESTABILIȚI CONEXIUNEA WINRM PENTRU UTILIZATOR: DOMAIN\hiddai pe PORT 5985 LA vm8.domain.com
EXEC (prin înveliș pentru conducte)
EXEC (prin înveliș pentru conducte)
ok: [vm5.domain.com]
ok: [vm7.domain.com]
[AVERTISMENT]: Eroare la colectarea faptelor factorilor: Test-Path: Accesul este refuzat La linia:10 char:17 + Test-Path -LiteralPath $facterPath +
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo: PermissionDenied: (\R10.local\Sys... rtup\facter.exe:String) [Test-Path], UnauthorizedAccessException  
+ FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError, Microsoft.PowerShell.Commands.TestPathCommand la <ScriptBlock>, <Fără fișier>: linia 10 la <ScriptBlock>, <Nu 
fișier>: rândul 3
ok: [vm8.domain.com]
ok: [vm6.domain.com]
META: conducătorii de conducere

Dockerfile-ul meu este

DE LA centos:8

rădăcină UTILIZATOR

RUN yum check-update -y; \
    yum update -y; \
    yum install -y epel-release; \
    yum install -y gcc; \
    yum install -y libffi-devel; \
    yum install -y wget; \
    yum install -y git; \
    yum install -y python3; \
    dnf install -y python3-setuptools; \
    pip3 install --upgrade setuptools; \
    yum install -y python3-pip; \
    pip3 install --upgrade pip; \
    pip3 instalează pywinrm; \
    pip3 instalează PyVmomi; \
    # Ansible 2.11.x
    pip3 instalează ansible; \
    # Azure
    wget -q https://raw.githubusercontent.com/ansible-collections/azure/dev/requirements-azure.txt; \
    pip3 install -r requirements-azure.txt; \
    rm requirements-azure.txt; \
    ansible-galaxy collection install azure.azcollection; \
    # Colecția include modulele și pluginurile VMware suportate de 
    # Comunitatea Ansible VMware pentru a ajuta la gestionarea infrastructurii VMware
    pip3 install -r ~/.ansible/collections/ansible_collections/community/vmware/requirements.txt; \
    ansible-galaxy collection instalează community.vmware; \
    # Descărcă fișierul din HTTP, HTTPS sau FTP către nod
    ansible-galaxy collection instalează ansible.windows; 
    # chmod -R o-w /ansible;
    
CMD [ "/usr/sbin/init" ]

Fișierul meu all.yml include detalii winrm

---
# Detalii protocol WinRM
utilizator_ansible: DOMAIN\hiddai
parola_ansible: F01o3O4
ansible_connection: winrm
ansible_port: 5985
ansible_winrm_scheme: http
ansible_winrm_server_cert_validation: ignorați
ansible_winrm_transport: ntlm
ansible_winrm_read_timeout_sec: 60
ansible_winrm_operation_timeout_sec: 58

în ceea ce privește EROAREA 1: verificarea winrm într-una dintre mașinile din domeniu arată:

C:\Users\qa>winrm obține winrm/config
Config
    MaxEnvelopeSizekb = 500
    MaxTimeoutms = 60000
    MaxBatchItems = 32000
    MaxProviderRequests = 4294967295
    Client
        NetworkDelayms = 5000
        URLPrefix = wsman
        AllowUnencrypted = adevărat [Sursa="GPO"]
        Auth
            De bază = adevărat [Sursa="GPO"]
            Digest = adevărat
            Kerberos = adevărat
            Negociază = adevărat
            Certificat = adevărat
            CredSSP = adevărat [Sursa="GPO"]
        Porturi implicite
            HTTP = 5985
            HTTPS = 5986
        TrustedHosts [Sursa="GPO"]
    Serviciu
        RootSDDL = O:NSG:BAD:P(A;;GA;;;BA)(A;;GR;;;IU)S:P(AU;FA;GA;;;WD)(AU;SA;GXGW; ;;WD)
        MaxConcurrentOperations = 4294967295
        MaxConcurrentOperationsPerUser = 1500
        EnumerationTimeoutms = 240000
        MaxConnexions = 300
        MaxPacketRetrievalTimeSeconds = 120
        AllowUnencrypted = adevărat [Sursa="GPO"]
        Auth
            De bază = adevărat [Sursa="GPO"]
            Kerberos = adevărat
            Negociază = adevărat
            Certificat = fals
            CredSSP = adevărat [Sursa="GPO"]
            CbtHardeningLevel = Relaxat
        Porturi implicite
            HTTP = 5985
            HTTPS = 5986
        IPv4Filter = * [Sursa="GPO"]
        IPv6Filter = * [Sursa="GPO"]
        EnableCompatibilityHttpListener = true [Sursa="GPO"]
        EnableCompatibilityHttpsListener = true [Sursa="GPO"]
        Amprenta certificată
        AllowRemoteAccess = adevărat [Sursa="GPO"]
    Câștigători
        AllowRemoteShellAccess = adevărat
        IdleTimeout = 7200000
        MaxConcurrentUsers = 2147483647
        MaxShellRunTime = 2147483647
        MaxProcessesPerShell = 2147483647
        MaxMemoryPerShellMB = 2147483647
        MaxShelsPerUser = 2147483647

Versiunea mea de container ansible este:

[root@ansible ansible]# ansible --version
[AVERTISMENT DE DEPRECARE]: Ansible va necesita Python 3.8 sau mai nou pe controler începând cu Ansible 2.12. Versiunea curentă: 3.6.8 (implicit, 19 martie 2021, 05:13:41) [GCC
 8.4.1 20200928 (Red Hat 8.4.1-1)]. Această caracteristică va fi eliminată din ansible-core în versiunea 2.12. Avertismentele de depreciere pot fi dezactivate prin setare 
deprecation_warnings=Fals în ansible.cfg.
ansible [nucleul 2.11.3] 
  fișier de configurare = /ansible/ansible.cfg
  cale de căutare a modulului configurat = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  Locația modulului python ansible = /usr/local/lib/python3.6/site-packages/ansible
  Locația colecției ansible = /root/.ansible/collections:/usr/share/ansible/collections
  locație executabilă = /usr/local/bin/ansible
  versiunea python = 3.6.8 (implicit, 19 martie 2021, 05:13:41) [GCC 8.4.1 20200928 (Red Hat 8.4.1-1)]
  versiunea jinja = 3.0.1
  libyaml = Adevărat

Cum pot rezolva acele erori?

Puncte:1
drapel jo

Prima eroare: aveți un ascultător winrm https (tcp port 5986) configurat cu un certificat? Bănuiesc că nu poate apela acea metodă, deoarece nu găsește niciun certificat.

A doua eroare: se pare că primiți o eroare de acces refuzat când încercați să faceți salt dublu către o cale UNC. Fie 1) Nu faceți acest lucru, fie 2) dacă este necesar, va trebui să configurați delegarea acreditărilor (fie per sarcină, per joc sau în conexiune). Puteți delega fie acreditările CredSSP, fie Kerberos (după aspectul ei, cu siguranță veți avea nevoie de mai multe module Python dacă utilizați Kerberos.

Citiți mai multe despre ansible, windows și kerberos aici: https://docs.ansible.com/ansible/latest/user_guide/windows_winrm.html

drapel uz
Mulțumesc, conform răspunsului dvs., adaug informații suplimentare. ERR1+2 sunt clare atunci când utilizați al doilea Dockerfile. ERR2 - Se pare că atunci când se adună fapte, un anumit PowerShell încearcă să se conecteze cu controlerul de domeniu (calea ```\domain.com\sys...``` în interiorul erorii). Am verificat majoritatea pachetelor din lista de cerințe - se găsesc și în primul container Docker. Îmi lipsește ceva din configurația mea Dockerfile?
Semicolon avatar
drapel jo
Eroarea 1 nu ar fi deloc afectată de fișierul docker - Eroare 1 se referă strict la ce certificat este configurat pe ascultătorul winrm de pe mașina Windows pe care o gestionați.
Semicolon avatar
drapel jo
Nici eroarea 2 nu ar trebui să fie afectată de nimic din fișierul dvs. docker - mai ales că, după ce am spus că trebuie să utilizați fie CredSSP, fie KERBEROS pentru salturi duble, conexiunea dvs. winrm încă folosește autentificarea ntlm
Semicolon avatar
drapel jo
O întrebare mai bună este de ce Ansible încearcă să lovească o cale UNC pentru a apela „facter.exe” Aveți căi de profil sau foldere redirecționate configurate pentru acel cont de utilizator pe mașina(e) Windows? Aș folosi un cont SEPARAT decât unul pe care l-ați fi folosit pentru a vă conecta interactiv.
Semicolon avatar
drapel jo
De asemenea, probabil că trebuie să ieși din mentalitatea „unde este problema mea dockerfile”. Acestea sunt probleme Windows care trebuie abordate/investigate. probabil că nu o să-ți „docker” drumul din acesta.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.