Use OTP 2FA

This commit is contained in:
Virgil 2019-08-02 14:01:52 +02:00
parent 5a325404c8
commit d596852f8c
6 changed files with 20 additions and 5 deletions

View File

@ -37,7 +37,11 @@ export PM_API_URL="https://xxxx.com:8006/api2/json"
export PM_USER=user@pam export PM_USER=user@pam
export PM_PASS=password export PM_PASS=password
``` ```
If a 2FA OTP code is required
```bash
# Optional 2FA OTP code
export PM_OTP=otpcode
```
## Run ## Run
@ -58,6 +62,8 @@ provider "proxmox" {
pm_api_url = "https://proxmox-server01.example.com:8006/api2/json" pm_api_url = "https://proxmox-server01.example.com:8006/api2/json"
pm_password = "secret" pm_password = "secret"
pm_user = "terraform-user@pve" pm_user = "terraform-user@pve"
//Optional
pm_otp = "otpcode"
*/ */
} }

View File

@ -3,6 +3,7 @@ provider "proxmox" {
pm_api_url = "https://proxmox-server01.example.com:8006/api2/json" pm_api_url = "https://proxmox-server01.example.com:8006/api2/json"
pm_password = "secret" pm_password = "secret"
pm_user = "terraform-user@pve" pm_user = "terraform-user@pve"
pm_otp = ""
} }
resource "proxmox_vm_qemu" "cloudinit-test" { resource "proxmox_vm_qemu" "cloudinit-test" {

View File

@ -3,6 +3,7 @@ provider "proxmox" {
pm_api_url = "https://proxmox.org/api2/json" pm_api_url = "https://proxmox.org/api2/json"
pm_password = "supersecret" pm_password = "supersecret"
pm_user = "terraform-user@pve" pm_user = "terraform-user@pve"
pm_otp = ""
} }
resource "proxmox_lxc" "lxc-test" { resource "proxmox_lxc" "lxc-test" {

View File

@ -54,6 +54,12 @@ func Provider() *schema.Provider {
Optional: true, Optional: true,
Default: false, Default: false,
}, },
"pm_otp": {
Type: schema.TypeString,
Required: true,
DefaultFunc: schema.EnvDefaultFunc("PM_OTP", nil),
Description: "OTP 2FA code (if required)",
},
}, },
ResourcesMap: map[string]*schema.Resource{ ResourcesMap: map[string]*schema.Resource{
@ -69,7 +75,7 @@ func Provider() *schema.Provider {
} }
func providerConfigure(d *schema.ResourceData) (interface{}, error) { func providerConfigure(d *schema.ResourceData) (interface{}, error) {
client, err := getClient(d.Get("pm_api_url").(string), d.Get("pm_user").(string), d.Get("pm_password").(string), d.Get("pm_tls_insecure").(bool)) client, err := getClient(d.Get("pm_api_url").(string), d.Get("pm_user").(string), d.Get("pm_password").(string), d.Get("pm_otp").(string), d.Get("pm_tls_insecure").(bool))
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -84,13 +90,13 @@ func providerConfigure(d *schema.ResourceData) (interface{}, error) {
}, nil }, nil
} }
func getClient(pm_api_url string, pm_user string, pm_password string, pm_tls_insecure bool) (*pxapi.Client, error) { func getClient(pm_api_url string, pm_user string, pm_password string, pm_otp string, pm_tls_insecure bool) (*pxapi.Client, error) {
tlsconf := &tls.Config{InsecureSkipVerify: true} tlsconf := &tls.Config{InsecureSkipVerify: true}
if !pm_tls_insecure { if !pm_tls_insecure {
tlsconf = nil tlsconf = nil
} }
client, _ := pxapi.NewClient(pm_api_url, nil, tlsconf) client, _ := pxapi.NewClient(pm_api_url, nil, tlsconf)
err := client.Login(pm_user, pm_password) err := client.Login(pm_user, pm_password, pm_otp)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -45,7 +45,7 @@ func applyFn(ctx context.Context) error {
vmr.SetNode(targetNode) vmr.SetNode(targetNode)
client := currentClient client := currentClient
if client == nil { if client == nil {
client, err = getClient(connInfo["pm_api_url"], connInfo["pm_user"], connInfo["pm_password"], connInfo["pm_tls_insecure"] == "true") client, err = getClient(connInfo["pm_api_url"], connInfo["pm_user"], connInfo["pm_password"], connInfo["pm_otp"], connInfo["pm_tls_insecure"] == "true")
if err != nil { if err != nil {
return err return err
} }

View File

@ -839,6 +839,7 @@ func initConnInfo(
"pm_api_url": client.ApiUrl, "pm_api_url": client.ApiUrl,
"pm_user": client.Username, "pm_user": client.Username,
"pm_password": client.Password, "pm_password": client.Password,
"pm_otp": client.Otp,
"pm_tls_insecure": "true", // TODO - pass pm_tls_insecure state around, but if we made it this far, default insecure "pm_tls_insecure": "true", // TODO - pass pm_tls_insecure state around, but if we made it this far, default insecure
}) })
return nil return nil