Рейтинг:0

Ошибка Ansible WinRM при сборе фактов winrm: вы не можете вызвать метод для сообщения выражения с нулевым значением

флаг uz

У меня есть резидент лаборатории на сервере vCenter, лаборатория включает в себя 5 серверов Windows и 3 Windows 10 Каждый раз, когда я запускаю плейбук (любой плейбук) против этой лаборатории, в TASK [Сбор фактов] появляются 2 ошибки:

[ПРЕДУПРЕЖДЕНИЕ]: ошибка при сборе фактов о winrm: вы не можете вызвать метод для выражения с нулевым значением. В строке:15 символ:17 + ...
$ansibleFacts.ansible_win_rm_certificate_expires = $_.Not ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~ + Информация о категории:  
InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId: InvokeMethodOnNull в <ScriptBlock>, <Нет файла>: строка 15 в <ScriptBlock>, <Нет файла>: строка  
13
[ПРЕДУПРЕЖДЕНИЕ]: Ошибка при сборе фактов фактов: Test-Path: Доступ запрещен В строке: 10 char: 17 + Test-Path -LiteralPath $facterPath +
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : PermissionDenied: (\Domain.com\Sys... rtup\factor.exe:String) [Test-Path], UnauthorizedAccessException  
+ FullyQualifiedErrorId: ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.TestPathCommand в <ScriptBlock>, <Нет файла>: строка 10 в <ScriptBlock>, <Нет 
файл>: строка 3

Полный журнал:

ЗАДАНИЕ [Сбор фактов] *************************************************** ******************************************************* ******************************************************* ***путь к задаче: /ansible/playbooks/copy_r10_files.yml:2
перенаправление (тип: модули) ansible.builtin.setup на ansible.windows.setup
Использование файла модуля /root/.ansible/collections/ansible_collections/ansible/windows/plugins/modules/setup.ps1
Конвейеризация включена.
<vm1.domain.com> УСТАНОВИТЕ СОЕДИНЕНИЕ WINRM ДЛЯ ПОЛЬЗОВАТЕЛЯ: Домен\hiddai на ПОРТУ 5985 К vm1.domain.com
перенаправление (тип: модули) ansible.builtin.setup на ansible.windows.setup
Использование файла модуля /root/.ansible/collections/ansible_collections/ansible/windows/plugins/modules/setup.ps1
Конвейеризация включена.
<vm2.domain.com> УСТАНОВИТЕ СОЕДИНЕНИЕ WINRM ДЛЯ ПОЛЬЗОВАТЕЛЯ: ДОМЕН\hiddai ПО ПОРТУ 5985 К vm1.domain.com
перенаправление (тип: модули) ansible.builtin.setup на ansible.windows.setup
EXEC (через конвейерную оболочку)
Использование файла модуля /root/.ansible/collections/ansible_collections/ansible/windows/plugins/modules/setup.ps1
Конвейеризация включена.
<vm3.domain.com> УСТАНОВИТЕ СОЕДИНЕНИЕ WINRM ДЛЯ ПОЛЬЗОВАТЕЛЯ: ДОМЕН\hiddai на ПОРТУ 5985 К srraalabjhqdb.r10.local
перенаправление (тип: модули) ansible.builtin.setup на ansible.windows.setup
Использование файла модуля /root/.ansible/collections/ansible_collections/ansible/windows/plugins/modules/setup.ps1
Конвейеризация включена.
EXEC (через конвейерную оболочку)
<vm4.domain.com> УСТАНОВИТЕ СОЕДИНЕНИЕ WINRM ДЛЯ ПОЛЬЗОВАТЕЛЯ: ДОМЕН\hiddai ПО ПОРТУ 5985 К vm4.domain.com
перенаправление (тип: модули) ansible.builtin.setup на ansible.windows.setup
EXEC (через конвейерную оболочку)
Использование файла модуля /root/.ansible/collections/ansible_collections/ansible/windows/plugins/modules/setup.ps1
Конвейеризация включена.
<vm5.domain.com> УСТАНОВИТЕ СОЕДИНЕНИЕ WINRM ДЛЯ ПОЛЬЗОВАТЕЛЯ: ДОМЕН\hiddai ПО ПОРТУ 5985 К vm5.domain.com
EXEC (через конвейерную оболочку)
EXEC (через конвейерную оболочку)
[ПРЕДУПРЕЖДЕНИЕ]: ошибка при сборе фактов о winrm: вы не можете вызвать метод для выражения с нулевым значением. В строке:15 символ:17 + ...
$ansibleFacts.ansible_win_rm_certificate_expires = $_.Not ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~ + Информация о категории:  
InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId: InvokeMethodOnNull в <ScriptBlock>, <Нет файла>: строка 15 в <ScriptBlock>, <Нет файла>: строка  
13
хорошо: [vm3.domain.com]
перенаправление (тип: модули) ansible.builtin.setup на ansible.windows.setup
Использование файла модуля /root/.ansible/collections/ansible_collections/ansible/windows/plugins/modules/setup.ps1
Конвейеризация включена.
<vm7.domain.com> УСТАНОВИТЕ СОЕДИНЕНИЕ WINRM ДЛЯ ПОЛЬЗОВАТЕЛЯ: ДОМЕН\hiddai ПО ПОРТУ 5985 К vm7.domain.com
хорошо: [vm4.domain.com]
перенаправление (тип: модули) ansible.builtin.setup на ansible.windows.setup
Использование файла модуля /root/.ansible/collections/ansible_collections/ansible/windows/plugins/modules/setup.ps1
Конвейеризация включена.
<vm6.domain.com> УСТАНОВИТЕ СОЕДИНЕНИЕ WINRM ДЛЯ ПОЛЬЗОВАТЕЛЯ: ДОМЕН\hiddai ПО ПОРТУ 5985 К vm6.domain.com
EXEC (через конвейерную оболочку)
хорошо: [vm1.domain.com]
хорошо: [vm2.domain.com]
перенаправление (тип: модули) ansible.builtin.setup на ansible.windows.setup
Использование файла модуля /root/.ansible/collections/ansible_collections/ansible/windows/plugins/modules/setup.ps1
Конвейеризация включена.
<vm8.domain.com> УСТАНОВИТЕ СОЕДИНЕНИЕ WINRM ДЛЯ ПОЛЬЗОВАТЕЛЯ: ДОМЕН\hiddai ПО ПОРТУ 5985 К vm8.domain.com
EXEC (через конвейерную оболочку)
EXEC (через конвейерную оболочку)
хорошо: [vm5.domain.com]
хорошо: [vm7.domain.com]
[ПРЕДУПРЕЖДЕНИЕ]: Ошибка при сборе фактов фактов: Test-Path: Доступ запрещен В строке: 10 char: 17 + Test-Path -LiteralPath $facterPath +
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : PermissionDenied: (\R10.local\Sys... rtup\factor.exe:String) [Test-Path], UnauthorizedAccessException  
+ FullyQualifiedErrorId: ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.TestPathCommand в <ScriptBlock>, <Нет файла>: строка 10 в <ScriptBlock>, <Нет 
файл>: строка 3
хорошо: [vm8.domain.com]
хорошо: [vm6.domain.com]
МЕТА: запуск обработчиков

Мой докерфайл

ОТ СЕНТОС:8

ПОЛЬЗОВАТЕЛЬ root

ЗАПУСК yum check-update -y; \
    ням обновить -y; \
    yum установить -y epel-релиз; \
    ням установить -y gcc; \
    yum install -y libffi-devel; \
    ням установить -y wget; \
    ням установить -y git; \
    ням установить -y python3; \
    dnf install -y python3-setuptools; \
    pip3 install --upgrade setuptools; \
    yum установить -y python3-pip; \
    pip3 установить --обновить пип; \
    pip3 установить pywinrm; \
    pip3 установить PyVmomi; \
    # Ansible 2.11.x
    pip3 установить можно; \
    # Лазурь
    wget -q https://raw.githubusercontent.com/ansible-collections/azure/dev/requirements-azure.txt; \
    pip3 install -r требования-azure.txt; \
    требования rm-azure.txt; \
    установка коллекции ansible-galaxy azure.azcollection; \
    # Коллекция включает модули и плагины VMware, поддерживаемые 
    # Сообщество Ansible VMware для помощи в управлении инфраструктурой VMware
    pip3 install -r ~/.ansible/collections/ansible_collections/community/vmware/requirements.txt; \
    Установка коллекции ansible-galaxy community.vmware; \
    # Загружает файл с HTTP, HTTPS или FTP на узел
    Установка коллекции ansible-galaxy ansible.windows; 
    # chmod -R o-w /ansible;
    
CMD [ "/usr/sbin/init" ]

Мой файл all.yml содержит сведения о winrm

---
# Сведения о протоколе WinRM
ansible_user: ДОМЕН\hiddai
доступный_пароль: F01o3O4
ansible_connection: winrm
доступный_порт: 5985
ansible_winrm_scheme: http
ansible_winrm_server_cert_validation: игнорировать
ansible_winrm_transport: ntlm
ansible_winrm_read_timeout_sec: 60
ansible_winrm_operation_timeout_sec: 58

Что касается ОШИБКИ 1: проверка winrm на одной из машин в домене показывает:

C:\Users\qa>winrm получить winrm/config
Конфигурация
    MaxEnvelopeSizekb = 500
    Максимальное время ожидания = 60000
    Максбатчитемс = 32000
    Макспровидеррекуестс = 4294967295
    Клиент
        NetworkDelayms = 5000
        Префикс URL=wsman
        AllowUnencrypted = true [Source="GPO"]
        Авторизация
            Базовый = истина [Source="GPO"]
            Дайджест = правда
            Керберос = правда
            Переговоры = правда
            Сертификат = правда
            CredSSP = истина [Source="GPO"]
        Порты по умолчанию
            HTTP = 5985
            HTTPS = 5986
        TrustedHosts [Источник = "GPO"]
    Оказание услуг
        RootSDDL = O:NSG:BAD:P(A;;GA;;;BA)(A;;GR;;;IU)S:P(AU;FA;GA;;;WD)(AU;SA;GXGW; ;;ВД)
        Максконкуррентоператионс = 4294967295
        MaxConcurrentOperationsPerUser = 1500
        EnumerationTimeoutms = 240000
        Максимальное количество подключений = 300
        MaxPacketRetrievalTimeSeconds = 120
        AllowUnencrypted = истина [Source="GPO"]
        Авторизация
            Базовый = истина [Source="GPO"]
            Керберос = правда
            Переговоры = правда
            Сертификат = ложь
            CredSSP = истина [Source="GPO"]
            CbtHardeningLevel = расслабленный
        Порты по умолчанию
            HTTP = 5985
            HTTPS = 5986
        IPv4Filter = * [Источник = "GPO"]
        IPv6Filter = * [Источник = "GPO"]
        EnableCompatibilityHttpListener = true [Source="GPO"]
        EnableCompatibilityHttpsListener = true [Source="GPO"]
        Отпечаток сертификата
        AllowRemoteAccess = истина [Source="GPO"]
    Победители
        Алловремотешеллакцесс = истина
        Время простоя = 7200000
        МаксКонкуррентусерс = 2147483647
        Максшеллрантиме = 2147483647
        Макспроцессеспершелл = 2147483647
        Максмеморипершеллмб = 2147483647
        Максшеллсперусер = 2147483647

Моя доступная версия контейнера:

[root@ansible ansible]# ansible --version
[ПРЕДУПРЕЖДЕНИЕ ОБ УСТАРЕНИИ]: Ansible потребует Python 3.8 или новее на контроллере, начиная с Ansible 2.12. Текущая версия: 3.6.8 (по умолчанию, 19 марта 2021 г., 05:13:41) [GCC
 8.4.1 20200928 (Red Hat 8.4.1-1)]. Эта функция будет удалена из ansible-core в версии 2.12. Предупреждения об устаревании можно отключить, установив 
deprecation_warnings=False в файле ansible.cfg.
доступный [ядро 2.11.3] 
  конфигурационный файл = /ansible/ansible.cfg
  настроенный путь поиска модуля = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  расположение модуля ansible python = /usr/local/lib/python3.6/site-packages/ansible
  расположение коллекции ansible = /root/.ansible/collections:/usr/share/ansible/collections
  местоположение исполняемого файла = /usr/local/bin/ansible
  версия python = 3.6.8 (по умолчанию, 19 марта 2021 г., 05:13:41) [GCC 8.4.1 20200928 (Red Hat 8.4.1-1)]
  версия джиндзя = 3.0.1
  libyaml = Истина

Как я могу устранить эти ошибки?

Рейтинг:1
флаг jo

Первая ошибка: у вас есть прослушиватель winrm https (tcp порт 5986), настроенный с сертификатом? Я предполагаю, что он не может вызвать этот метод, потому что не может найти никаких сертификатов.

Вторая ошибка: похоже, вы получаете ошибку отказа в доступе при попытке двойного перехода к пути UNC. Либо 1) не делайте этого, либо 2) при необходимости вам необходимо настроить делегирование учетных данных (для каждой задачи, для каждой игры или в соединении). Вы можете делегировать учетные данные CredSSP или Kerberos (судя по всему, вам определенно понадобятся дополнительные модули Python, если вы будете использовать Kerberos.

Читайте об ansible, windows и kerberos здесь: https://docs.ansible.com/ansible/latest/user_guide/windows_winrm.html

флаг uz
Спасибо, согласно вашему ответу, я добавляю дополнительную информацию. ERR1+2 очевидны при использовании второго Dockerfile. ERR2. Похоже, что при сборе фактов конкретный PowerShell пытается подключиться к контроллеру домена (```\domain.com\sys...``` путь внутри ошибки). Я проверил большинство пакетов в списке требований — они есть и в 1-м контейнере Docker. Я что-то упустил в своей конфигурации Dockerfile?
Semicolon avatar
флаг jo
Ошибка 1 никак не повлияет на ваш файл докера. Ошибка 1 строго связана с тем, какой сертификат настроен для прослушивателя winrm на компьютере с Windows, которым вы управляете.
Semicolon avatar
флаг jo
На ошибку 2 также не должно влиять что-либо в вашем файле docker, тем более что после того, как я сказал, что вам нужно использовать либо CredSSP, либо KERBEROS для двойных переходов, ваше соединение winrm ВСЕ ЕЩЕ использует аутентификацию ntlm.
Semicolon avatar
флаг jo
Лучший вопрос: почему ansible пытается использовать путь UNC для вызова «facter.exe». Есть ли у вас какие-либо пути профиля или перенаправленные папки, настроенные для этой учетной записи пользователя на компьютерах с Windows? Я бы использовал ОТДЕЛЬНУЮ учетную запись, а не ту, которую вы могли бы использовать для интерактивного входа в систему.
Semicolon avatar
флаг jo
Кроме того, вероятно, нужно избавиться от мышления «где моя проблема с файлом докеров». Это проблемы Windows, которые необходимо решить/расследовать. вероятно, вы не собираетесь «докеривать» свой выход из этого.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.