问题
I'm using azurerm_virtual_machine_extension
to bootstrap some virtual machines in azure.
All examples i've found show using something similar to:
settings = <<SETTINGS
{
"fileUris": [ "https://my.bootstrapscript.com/script.sh}" ],
"commandToExecute": "bash script.sh"
}
SETTINGS
While this works, my issue is i'm having to publicly host script
for use with fileUris
. Is there an option within settings that will allow me to send local file contents from my terraform folder?
Something like:
settings = <<SETTINGS
{
"file": [ ${file("./script.txt")} ],
"commandToExecute": "bash script.sh"
}
SETTINGS
Thanks.
回答1:
Yes We Can!
Introduction
In protected_settings, use "script".
Scripts
terraform script
provider "azurerm" {
}
resource "azurerm_virtual_machine_extension" "vmext" {
resource_group_name = "${var.resource_group_name}"
location = "${var.location}"
name = "${var.hostname}-vmext"
virtual_machine_name = "${var.hostname}"
publisher = "Microsoft.Azure.Extensions"
type = "CustomScript"
type_handler_version = "2.0"
protected_settings = <<PROT
{
"script": "${base64encode(file(var.scfile))}"
}
PROT
}
variables
variable resource_group_name {
type = string
default = "ORA"
}
variable location {
type = string
default = "eastus"
}
variable hostname {
type = string
default = "ora"
}
variable scfile{
type = string
default = "yum.bash"
}
bash script
#!/bin/bash
mkdir -p ~/download
cd ~/download
wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -ivh epel-release-latest-7.noarch.rpm
yum -y install cowsay
cowsay ExaGridDba
Output
apply
[terraform@terra stackoverflow]$ terraform apply
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# azurerm_virtual_machine_extension.vmex0 will be created
+ resource "azurerm_virtual_machine_extension" "vmex0" {
+ id = (known after apply)
+ location = "eastus"
+ name = "ora-vmext"
+ protected_settings = (sensitive value)
+ publisher = "Microsoft.Azure.Extensions"
+ resource_group_name = "ORA"
+ tags = (known after apply)
+ type = "CustomScript"
+ type_handler_version = "2.0"
+ virtual_machine_name = "ora"
}
Plan: 1 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
azurerm_virtual_machine_extension.vmex0: Creating...
azurerm_virtual_machine_extension.vmex0: Still creating... [10s elapsed]
azurerm_virtual_machine_extension.vmex0: Still creating... [20s elapsed]
azurerm_virtual_machine_extension.vmex0: Still creating... [30s elapsed]
azurerm_virtual_machine_extension.vmex0: Still creating... [40s elapsed]
azurerm_virtual_machine_extension.vmex0: Still creating... [50s elapsed]
azurerm_virtual_machine_extension.vmex0: Still creating... [1m0s elapsed]
azurerm_virtual_machine_extension.vmex0: Still creating... [1m10s elapsed]
azurerm_virtual_machine_extension.vmex0: Still creating... [1m20s elapsed]
azurerm_virtual_machine_extension.vmex0: Still creating... [1m30s elapsed]
azurerm_virtual_machine_extension.vmex0: Still creating... [1m40s elapsed]
azurerm_virtual_machine_extension.vmex0: Still creating... [1m50s elapsed]
azurerm_virtual_machine_extension.vmex0: Still creating... [2m0s elapsed]
azurerm_virtual_machine_extension.vmex0: Creation complete after 2m1s [id=/subscriptions/7fe8a9c3-0812-42e2-9733-3f567308a0d0/resourceGroups/ORA/providers/Microsoft.Compute/virtualMachines/ora/extensions/ora-vmext]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
stdout on the target
[root@ora ~]# cat /var/lib/waagent/custom-script/download/0/stdout
Preparing... ########################################
Updating / installing...
epel-release-7-12 ########################################
Loaded plugins: langpacks, ulninfo
Resolving Dependencies
--> Running transaction check
---> Package cowsay.noarch 0:3.04-4.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
cowsay noarch 3.04-4.el7 epel 42 k
Transaction Summary
================================================================================
Install 1 Package
Total download size: 42 k
Installed size: 77 k
Downloading packages:
Public key for cowsay-3.04-4.el7.noarch.rpm is not installed
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : cowsay-3.04-4.el7.noarch 1/1
Verifying : cowsay-3.04-4.el7.noarch 1/1
Installed:
cowsay.noarch 0:3.04-4.el7
Complete!
< ExaGridDba >
------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Remarks
- The script size limit is 262144 bytes base64 encoded, or 196608 bytes.
- "#!" determines the interpreter. "#!/bin/python" would start a python script.
- These azurerm_virtual_machine_extension parameters are not required:
- settings
- fileUris
- commandToExecute
- storageAccountName
- storageAccountKey
- protected_settings parameter "script" might not be mentioned in the Terraform documentation. Please refer to Use the Azure Custom Script Extension Version 2 with Linux virtual machines
- azurerm_virtual_machine_extension may be used during VM creation, or as a standalone administrative tool.
Conclusion
In Azure VM, it is possible to run a script without referring to a blob storage account.
来源:https://stackoverflow.com/questions/54088476/terraform-azurerm-virtual-machine-extension