Чтение удаленного файла или доступ к выводу Powershell с помощью Terraform - PullRequest
0 голосов
/ 11 февраля 2020

Извините, если на это ответили. Я не смог найти кого-то, кто делал бы то же самое. У меня есть модуль Terraform, который создает Azure VM. У меня есть ресурс для virtual_machine_extension, который запускает скрипт Powershell для выполнения некоторых элементов до и после сборки. Скрипт Powershell запускается из BLOB-объекта Azure. Основным выводом этого скрипта является созданный текстовый файл. Я пытаюсь найти способ прочитать этот текстовый файл и использовать содержимое Terraform в другом ресурсе в качестве параметра.

Я создал переменную Powershell, которая также содержит содержимое файла, но у меня есть та же проблема, что и с текстовым файлом. Не уверен, как получить содержимое этой переменной в параметр, который Terraform может понять.

Я открыт для любого способа, которым это может быть достигнуто.

Также я использую TF 12.20.

РЕДАКТИРОВАТЬ: Извините все. Позвольте мне предоставить немного больше информации. Поэтому мне нужно получить контент на удаленном сервере, который создается с помощью Terraform. Расширение моей виртуальной машины запускает скрипт powershell, который создает файл локально на создаваемом сервере. Мне нужно взять содержимое из этого файла и передать его в нулевой ресурс.

Итак, предположим, что содержимое файла на удаленном сервере - «Данные тестирования».

Мне нужно будет передать это содержимое в winrm-соединение.

    resource "null_resource" "chef-client" {
      triggers = {
        build_number = "${timestamp()}"
      }
      provisioner "chef" {
        connection {
          type = "winrm"
          user = var.user
          password = var.password
          host = var.host
          cacert = <text content>
          timeout = "5m"
          port = 5986
          use_ntlm = false
          https = true
          insecure = false
       }
     }
   }

Обновлена ​​вся часть соединения, которую я пытаюсь заставить работать. На данный момент сервер не является частью домена. Я попытался local_file источник данных, но не смог автоматически авторизоваться, потому что он не является частью домена. Изучал источник данных template_file и external, но не уверен, что это лучший способ, если вы можете каким-то образом извлечь результат из powershell для чтения TF.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2020

Если я правильно читаю ваш вопрос, то в пределах terraform вы будете sh читать содержимое файла?

Вы смотрели на функцию файла tf? https://www.terraform.io/docs/configuration/functions/file.html Это позволяет вам читать содержимое файла в строку внутри terraform, где вы можете работать с ним любым удобным вам способом.

Что-то вроде

locals {
  my_cert = file ("\path\to\cert\certname.crt")
}
    resource "null_resource" "chef-client" {
      triggers = {
        build_number = "${timestamp()}"
      }
      provisioner "chef" {
        connection {
          type = "winrm"
          user = var.user
          password = var.password
          host = var.host
          cacert = local.my_cert
          timeout = "5m"
          port = 5986
          use_ntlm = false
          https = true
          insecure = false
       }
     }
   }

Помните, что, поскольку это HCL и windows, вам нужен двойной бэкслей sh, чтобы обойти спасательный персонаж.

0 голосов
/ 12 февраля 2020

Вы на самом деле не предоставляете достаточно информации, чтобы помочь, потому что вам действительно нужно предоставить больше информации о том, как выглядит этот файл, и о

Вы можете читать содержимое из переменных так же, как вы можете из файлов на привод. Переменная - это диск в среде PowerShell, и вы можете просмотреть все диски по умолчанию, выполнив ...

Get-PSDrive

# Results
<#
Name           Used (GB)     Free (GB) Provider      Root
----           ---------     --------- --------      ----
Alias                                  Alias              
...                                                      
Cert                                   Certificate   \   
...                                                      
Env                                    Environment       
...                                                      
Function                               Function          
G                                      FileSystem    G:\ 
HKCU                                   Registry      HKEY_CURRENT_USER 
HKLM                                   Registry      HKEY_LOCAL_MACHINE 
Variable                               Variable      
WSMan                                  WSMan
#>

Итак ...

$MyNewVariable = 'Some text here from where ever'   

Get-Content -Path Variable:\MyNewVariable

# Results
<#
Some text here from where ever
#>

Хотя приведенное выше работает, это не всегда в силе. Все зависит от того, как вы заполняете эту переменную. Например:

Get-Content -Path 'D:\temp\hello.bat'

# Results
<#
:: sample cmd file
echo 'Hello World!'
#>

($MyNewVariable = Get-Content -Path 'D:\temp\hello.bat')

# Results
<#
:: sample cmd file
echo 'Hello World!'
#>

Get-Content -Path 'Variable:\MyNewVariable'

# Results
<#
:: sample cmd file
#>

Чтение содержимого файлов - это всего лишь вопрос использования Get-Content и указания пути к файлу. При чтении файлов существует множество опций Get-Content ...

Powershell: множество способов чтения и записи в файлы

Импорт данных с помощью Get-Content -Raw

Get-Content - это команда goto для чтения данных. По умолчанию эта команда будет читать каждую строку файла. В итоге вы получите массив строк. Это также хорошо передает каждый из них по конвейеру.

Параметр -Raw переведет все содержимое в виде многострочной строки. Это также выполняется быстрее, потому что создается меньше объектов.

Get-Content -Path $Path -Raw

... и если это не дает вам все, что вам нужно, например, работа с большими файлами, то есть. Net библиотеки.

Ускоренное чтение с System.IO.File

Простота использования, обеспечиваемая CmdLets, может привести к небольшим потерям производительности. Он настолько мал, что вы не заметите его для большинства сценариев, которые вы делаете. Когда наступит тот день, когда вам понадобится больше скорости, вы обнаружите, что обращаетесь к нативным командам. Net. К счастью, с ними легко работать.

[System.IO.File]::ReadAllLines( ( Resolve-Path $Path ) )

Это так же, как Get-Content -Path $ Path, в результате вы получите коллекцию, полную строк. Вы также можете прочитать данные в виде многострочной строки.

[System.IO.File]::ReadAllText( ( Resolve-Path $Path ) )

$ Path должен быть полным путем, иначе он попытается сохранить файл в C: Папка \ Windows \ System32. Вот почему я использую Resolve-Path в этом примере.

...