Initial commit
This commit is contained in:
commit
213960dec7
21
LICENSE
Normal file
21
LICENSE
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2022 AtaxyaNetwork - Cécile MORANGE
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
19
README.md
Normal file
19
README.md
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
**Netbox + XO + Terraform + Ansible = The best deployment kit**
|
||||||
|
|
||||||
|
How to run:<br>
|
||||||
|
cp passwd.auto.tfvars.example passwd.auto.tfvars<br>
|
||||||
|
replace all variable to match your infrastructure
|
||||||
|
|
||||||
|
edit cloud_config.tftpl to add your ssh key<br>
|
||||||
|
edit cloud_network_config.tftpl to replace eth0 and your gateway (to be changed)
|
||||||
|
|
||||||
|
create a prefix with IP you want to use on netbox <br>
|
||||||
|
edit variables.auto.tfvars
|
||||||
|
|
||||||
|
You can add your playbook in the folder playbooks/ and use them in variables.auto.tfvars
|
||||||
|
|
||||||
|
then
|
||||||
|
|
||||||
|
terraform init<br>
|
||||||
|
terraform plan<br>
|
||||||
|
terraform apply
|
5
cloud_config.tftpl
Normal file
5
cloud_config.tftpl
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
#cloud-config
|
||||||
|
hostname: ${hostname}
|
||||||
|
ssh_authorized_keys:
|
||||||
|
${ssh_keys}
|
||||||
|
|
9
cloud_network_config.tftpl
Normal file
9
cloud_network_config.tftpl
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
#cloud-config
|
||||||
|
version: 1
|
||||||
|
config:
|
||||||
|
- type: physical
|
||||||
|
name: eth0
|
||||||
|
subnets:
|
||||||
|
- type: static
|
||||||
|
address: "${ip}"
|
||||||
|
gateway: "${gateway}"
|
96
main.tf
Normal file
96
main.tf
Normal file
|
@ -0,0 +1,96 @@
|
||||||
|
data "netbox_prefix" "test" {
|
||||||
|
cidr = var.netbox_prefix
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "netbox_available_ip_address" "test" {
|
||||||
|
prefix_id = data.netbox_prefix.test.id
|
||||||
|
description = var.name
|
||||||
|
dns_name = var.dns_name
|
||||||
|
}
|
||||||
|
|
||||||
|
output "ip_addr" {
|
||||||
|
value = netbox_available_ip_address.test.ip_address
|
||||||
|
}
|
||||||
|
|
||||||
|
data "xenorchestra_sr" "local_storage" {
|
||||||
|
name_label = var.storage
|
||||||
|
}
|
||||||
|
|
||||||
|
data "xenorchestra_network" "network" {
|
||||||
|
name_label = var.network
|
||||||
|
pool_id = data.xenorchestra_pool.pool.id
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
data "xenorchestra_pool" "pool" {
|
||||||
|
name_label = var.pool
|
||||||
|
}
|
||||||
|
|
||||||
|
data "xenorchestra_template" "template" {
|
||||||
|
name_label = var.template
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
resource "xenorchestra_vm" "bar" {
|
||||||
|
memory_max = var.ram * 1024 * 1024 * 1024
|
||||||
|
cpus = var.cpu
|
||||||
|
cloud_config = templatefile("cloud_config.tftpl", {
|
||||||
|
hostname = var.name
|
||||||
|
ssh_keys = var.ssh_keys
|
||||||
|
})
|
||||||
|
cloud_network_config = templatefile("cloud_network_config.tftpl", {
|
||||||
|
ip = "${replace(netbox_available_ip_address.test.ip_address, "var.netmask_netbox", var.netmask)}"
|
||||||
|
gateway = var.gateway
|
||||||
|
})
|
||||||
|
name_label = var.name
|
||||||
|
name_description = var.desc
|
||||||
|
template = data.xenorchestra_template.template.id
|
||||||
|
|
||||||
|
# Prefer to run the VM on the primary pool instance
|
||||||
|
affinity_host = data.xenorchestra_pool.pool.master
|
||||||
|
network {
|
||||||
|
network_id = data.xenorchestra_network.network.id
|
||||||
|
}
|
||||||
|
|
||||||
|
disk {
|
||||||
|
sr_id = data.xenorchestra_sr.local_storage.id
|
||||||
|
name_label = var.name
|
||||||
|
size = var.disk_size * 1024 * 1024 * 1024
|
||||||
|
}
|
||||||
|
|
||||||
|
tags = [
|
||||||
|
"Debian",
|
||||||
|
"Best Distro",
|
||||||
|
]
|
||||||
|
|
||||||
|
// Override the default create timeout from 5 mins to 20.
|
||||||
|
timeouts {
|
||||||
|
create = "20m"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Generate inventory file
|
||||||
|
resource "local_file" "inventory" {
|
||||||
|
filename = "inventory"
|
||||||
|
content = <<EOF
|
||||||
|
[all]
|
||||||
|
${split("/", netbox_available_ip_address.test.ip_address)[0]}
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "time_sleep" "wait_30_seconds" {
|
||||||
|
depends_on = [xenorchestra_vm.bar]
|
||||||
|
|
||||||
|
create_duration = "30s"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "null_resource" "run-ansible" {
|
||||||
|
provisioner "local-exec" {
|
||||||
|
command = "ansible-playbook -D -i inventory playbooks/${var.playbook} "
|
||||||
|
environment = {
|
||||||
|
ANSIBLE_HOST_KEY_CHECKING = "false"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
depends_on = [time_sleep.wait_30_seconds]
|
||||||
|
}
|
13
passwd.auto.tfvars.example
Normal file
13
passwd.auto.tfvars.example
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
#Netbox
|
||||||
|
|
||||||
|
|
||||||
|
netbox_server_url = "https://netbox.exemple.net"
|
||||||
|
netbox_api_token = ""
|
||||||
|
netbox_allow_insecure_https = false
|
||||||
|
|
||||||
|
#XO
|
||||||
|
|
||||||
|
xo_url = "ws://xo.example.net"
|
||||||
|
xo_username = "admin"
|
||||||
|
xo_password = "passwd"
|
||||||
|
xo_insecure = true
|
8
playbooks/basicpackage.yml
Normal file
8
playbooks/basicpackage.yml
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
- hosts: all
|
||||||
|
tasks:
|
||||||
|
- name: update a server
|
||||||
|
apt: update_cache=yes
|
||||||
|
- name: "emacs-nox"
|
||||||
|
apt:
|
||||||
|
name: ["emacs-nox"]
|
||||||
|
state: present
|
31
providers.tf
Normal file
31
providers.tf
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
terraform {
|
||||||
|
required_providers {
|
||||||
|
netbox = {
|
||||||
|
source = "e-breuninger/netbox"
|
||||||
|
version = "~> 1.5.2"
|
||||||
|
}
|
||||||
|
xenorchestra = {
|
||||||
|
source = "terra-farm/xenorchestra"
|
||||||
|
version = "~> 0.9"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
provider "netbox" {
|
||||||
|
server_url = var.netbox_server_url
|
||||||
|
api_token = var.netbox_api_token
|
||||||
|
allow_insecure_https = var.netbox_allow_insecure_https
|
||||||
|
}
|
||||||
|
provider "xenorchestra" {
|
||||||
|
# Must be ws or wss
|
||||||
|
url = var.xo_url
|
||||||
|
username = var.xo_username
|
||||||
|
password = var.xo_password
|
||||||
|
|
||||||
|
# This is false by default and
|
||||||
|
# will disable ssl verification if true.
|
||||||
|
# This is useful if your deployment uses
|
||||||
|
# a self signed certificate but should be
|
||||||
|
# used sparingly!
|
||||||
|
insecure = var.xo_insecure # Or set XOA_INSECURE environment variable to any value
|
||||||
|
}
|
95
var.tf
Normal file
95
var.tf
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
#Provider
|
||||||
|
variable "netbox_server_url" {
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "netbox_api_token" {
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
variable "netbox_allow_insecure_https" {
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "xo_url" {
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "xo_username" {
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "xo_password" {
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "xo_insecure" {
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#Main
|
||||||
|
variable "netbox_prefix" {
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "netmask_netbox" {
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "gateway" {
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "netmask" {
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "dns_name" {
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "storage" {
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "network" {
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "pool" {
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "template" {
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "playbook" {
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "cpu" {
|
||||||
|
type = number
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "ram" {
|
||||||
|
type = number
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "name" {
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "desc" {
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "disk_size" {
|
||||||
|
type = number
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "ssh_keys" {
|
||||||
|
type = string
|
||||||
|
}
|
29
variables.auto.tfvars
Normal file
29
variables.auto.tfvars
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
####
|
||||||
|
#Variables utilisé dans le main.tf
|
||||||
|
####
|
||||||
|
netbox_prefix = "185.119.254.192/27"
|
||||||
|
netmask_netbox = "/27"
|
||||||
|
netmask = "/32"
|
||||||
|
gateway = "185.119.254.1"
|
||||||
|
dns_name = "maVM.ataxya.net"
|
||||||
|
# storage utilisé pour le disque de la VM
|
||||||
|
storage = "Local storage"
|
||||||
|
# Interface réseau pour la VM
|
||||||
|
network = "Pool-wide network associated with eth2"
|
||||||
|
# nom du pool ou sera storé la VM
|
||||||
|
pool = "chouffe"
|
||||||
|
# nom de la template utilisé pour la VM
|
||||||
|
template = "Debian11"
|
||||||
|
playbook = "basicpackage.yml"
|
||||||
|
###################
|
||||||
|
#PARAMETRES DE LA VM
|
||||||
|
###################
|
||||||
|
cpu = 2
|
||||||
|
ram = 2
|
||||||
|
name = "maVM"
|
||||||
|
desc = "By Ataxya"
|
||||||
|
disk_size = 30
|
||||||
|
ssh_keys = <<-EOF
|
||||||
|
- key1
|
||||||
|
- key2
|
||||||
|
EOF
|
Loading…
Reference in New Issue
Block a user