{"id":15090215,"url":"https://github.com/build-boxes/webnode","last_synced_at":"2026-02-08T03:31:12.767Z","repository":{"id":234378970,"uuid":"785323010","full_name":"build-boxes/webnode","owner":"build-boxes","description":"An Ansible-Vagrant playbook to build a local Virtual Machine (VirtualBox) OR a cloud VM with Apache2, MySQL, PHP, Postfix/Dovecot Relay role. Primary application to be installed will be Wordpress Blogging Application and Email Relay server. For cloud VM deployment curretly tested on Linode.com, Azure, AWS. OS: Debian/RHEL variants","archived":false,"fork":false,"pushed_at":"2025-06-22T21:15:03.000Z","size":5828,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-08-01T08:50:43.208Z","etag":null,"topics":["ansible","dovecot","hcl","postfix","terraform","vagrant","wordpress"],"latest_commit_sha":null,"homepage":"https://andromedabay.ddns.net/experiments-with-iac-automation/","language":"HCL","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/build-boxes.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-04-11T16:49:54.000Z","updated_at":"2025-06-22T21:15:06.000Z","dependencies_parsed_at":"2024-04-19T05:22:15.442Z","dependency_job_id":"8d87ca66-dec4-4a13-8677-f33926479808","html_url":"https://github.com/build-boxes/webnode","commit_stats":{"total_commits":25,"total_committers":1,"mean_commits":25.0,"dds":0.0,"last_synced_commit":"7bfaeab32ecc9b305be6f0a85eb67a997bf151f5"},"previous_names":["build-boxes/webnode"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/build-boxes/webnode","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/build-boxes%2Fwebnode","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/build-boxes%2Fwebnode/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/build-boxes%2Fwebnode/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/build-boxes%2Fwebnode/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/build-boxes","download_url":"https://codeload.github.com/build-boxes/webnode/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/build-boxes%2Fwebnode/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29219273,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-08T03:18:47.732Z","status":"ssl_error","status_checked_at":"2026-02-08T03:15:31.985Z","response_time":57,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ansible","dovecot","hcl","postfix","terraform","vagrant","wordpress"],"created_at":"2024-09-25T09:23:30.967Z","updated_at":"2026-02-08T03:31:12.752Z","avatar_url":"https://github.com/build-boxes.png","language":"HCL","readme":"# WebNode\nIt is a Vagrant and Ansible Playbook that builds a local host with Apache2, MariaDB, PHP, Wordpress and Postfix Relay Roles. It can also be used to deploy it on Public Cloud providers. Currently 4 Public Cloud provider (Linode, Azure, AWS, GCP) scripts are included.\n\n## Disclaimer\n1. There are no Guarantee of anything about this script, please use of your own accord.\n2. Hosting on Public-Cloud is NOT free. See Linode/Azure/AWS/GCP pricing before usage of this script.\n3. If you are testing this script, then make sure that all resources created on the public cloud are also deleted after the testing is completed. Otherwise you may be surprised by a costly bill from Azure or Linode or other Public Cloud provider.\n\n## Copy VMHDK to Physical Disk\nVirtualBox VMHDK disk images can be converted into Physical Disk images. General Process is as follows:  \n1. Convert VMHDK to VDI Image.\n\n  ```\n  VBoxManage clonehd source.vmdk target.vhd --format vhd\n  ```\n\n2. On Windows 10/ Windows 11, mount VDI image file as a Disk using Windows Disk Management tool.\n  \n  ![Disk Management Tool - Attach VHD file](pictures/Disk-Attach-VHD.png)\n\n3. Using a free/good Disk cloning software make a clone of the mounted Disk Image from Step 2 above to target Disk (Note: All data on target disk will be erased).\n  \n  ![AOMEI tool - Clone sector by sector](pictures/Clone-sector-by-sector.png)\n\n4. Place the Target disk in an actual AMD64/x86_64 computer, remove all other disks for protection of those disks.\n5. Also place a Debian12/Ubuntu/RockyLinux8 Installation media in the same target computer.\n6. Boot from the Installtion media and go to Rescue Mode. Mount the Target disk from Step 4 above, Also mount its boot partition. Then using the rescue Media, install/re-install GRUB boot Loader on that disk. Then Shutdown/Reboot. Remove the Installation Media.\n7. Once the computer successfully boots from the Target Disk, you can login using vmuser1, vmuser2 or Vagrant (If account was not removed earlier) credentials.\n8. Check Network connectivity. You may need to add Network Drivers available in the webNode VMHDK image. Try adding the following (public network) to the Vagrantfile. This will add a Bridged Network Controller in the VirtualBox VM. This should enable Physical Network Card Drivers in the VM Image on disk.\n```\n  config.vm.define \"debian\" do |debian|\n    debian.vm.box = \"raufhammad/debian12\"\n    debian.vm.network \"private_network\", ip: \"192.168.56.6\"\n    debian.vm.network \"public_network\"\n  end \n```\n9. Short-Commings\n  * Only MBR Disk Image is created, supporting Old BIOS. No GPT Disk Image, No UEFI BIOS.\n  * Smaller sized disks images only, less then 1 TB.\n  * Maybe able to convert the Underlying Vagrant Box image to use EFI Disk (In the seperate project [Github Repo: build-boxes/packer-boxes](https://github.com/build-boxes/packer-boxes) ).\n\n## Local Images Creation - On VirtualBox\nIt can be used in Windows 10/11 (a bit difficult to setup), or you can use Debian/Ubuntu host environemnt.\n1. Install VirtualBox\n2. Install Vagrant, Ansible (Use Windows Subsystem for Linux 2)\n3. Install some plugins in WSL2 to allow Ansible and Vagrant to access Windows VirtualBox (Google Search, also [this link https://slavid.github.io/2021/11/28/running-vagrant-ansible-windows-through-wsl2/#configuration ](https://slavid.github.io/2021/11/28/running-vagrant-ansible-windows-through-wsl2/#configuration) ).\n4. Change into the project root folder.\n5. Download required roles with the following command:\n    ```\n    rm -rf ~/.ansible/roles/\n    ansible-galaxy install --force -r ./roles/requirements.yml\n    ```\n6. Run:\n    ```\n    vagrant up debian\n\n    OR\n\n    vagrant up centos\n    ```\n7. To Destroy run:\n    ```\n    vagrant destroy -f debian\n\n    OR\n\n    vagrant destroy -f centos\n    ```\n\n## Cloud Image Creation - Linode, Azure, AWS or GCP\nIt can be used in Windows 10/11 (a bit difficult to setup), or you can use Debian/Ubuntu host environemnt.\n1. Install Ansible, Terraform (Use Windows Subsystem for Linux 2)\n2. Install some plugins in WSL2 for Ansible (Google Search, also [this link https://slavid.github.io/2021/11/28/running-vagrant-ansible-windows-through-wsl2/#configuration ](https://slavid.github.io/2021/11/28/running-vagrant-ansible-windows-through-wsl2/#configuration) )\n3. See your Cloud Provider specific steps...\n    1. For Azure, install Azure-CLI, see the section [below](#azure-cli).\n    2. For GCP, install GCloud-CLI, see the section [below](#google-gcloud).\n4. Install some ansible collections.\n    ```\n    ansible-galaxy collection install ansible.utils\n    ```\n5. Change into the project root folder.\n6. Download required roles with the following command:\n    ```\n    rm -rf ~/.ansible/roles/\n    ansible-galaxy install --force -r ./roles/requirements.yml\n    ```\n7. Change into \"tf-\u003c\u003cPublic-Cloud\u003e\u003e*\" subfolder. For Example Change into \"tf-azure*\" or \"tf-linode*\",  subfolder.\n8. Run:\n    ```\n    terraform init\n    terraform plan\n    terraform apply -auto-approve\n    ```\n9. To Destroy run:\n    ```\n    terraform destroy -auto-approve\n    ```\n    NOTE:  \n    The above destroy command can fail, so you may need to login to the public-cloud portal to delete all resources.  \n\n10. To ssh into the Terraform remote host use:\n    ```\n    ssh -i /path/to/User/.ssh-folder/id_rsa_Linode ${UserName}@${IPAddress}\n    ```\n    * Where:\n        - ${UserName} = [User name given in ./vars/secrets.yml](https://github.com/build-boxes/webnode/blob/main/vars/secrets_shadow.yml#L20) OR [var.username](https://github.com/build-boxes/webnode/blob/main/tf-azure-debian12/terraform-azure-webnode-debian12.tf#L202)\n        - ${IPAddress} = IP returned at successfull completeion of 'terraform apply -auto-approve'\n\n## \u003ca name=\"azure-cli\"\u003eInstalling Azure-Cli on Ubuntu and WSL2 - For Terraform\u003c/a\u003e\nFor using Terraform on Azure Cloud, Azure-CLI needs to be installed on the local computer where these scripts will be executed. The \nfollowing are steps for installing Azure-CLI on Ubuntu/Debian and WSL2.\n\n### Azure-CLI Links\n- [Install Azure-CLI on Linux](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli-linux?pivots=apt)\n- [Terraform AzureRM Provider - Authentication](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs#authenticating-to-azure)\n- [Tf AzureRM Auth - Service Principal with Client Secret](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/guides/service_principal_client_secret)\n- [Tf AzureRM Auth - Service Principal with Client Certificate](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/guides/service_principal_client_certificate)\n- [Tf AzureRM Auth - Service Principal with Managed ID (Active Directory)](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/guides/managed_service_identity)\n- [Tf AzureRM Auth - Azure CLI (login)](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/guides/azure_cli)\n\n### Steps using Option 1 for Installation\n- Install Azure-CLI if not already installed.\n    ```\n    $ curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash\n    ```\n- Then login to Azure-CLI\n    ```\n    $ az login\n    ```\n- Then create a Service Principal with Secret\n    ```\n    $ az account list\n    [\n      {\n        \"cloudName\": \"AzureCloud\",\n        \"id\": \"20000000-0000-0000-0000-000000000000\",\n        \"isDefault\": true,\n        \"name\": \"PAYG Subscription\",\n        \"state\": \"Enabled\",\n        \"tenantId\": \"10000000-0000-0000-0000-000000000000\",\n        \"user\": {\n          \"name\": \"user@example.com\",\n          \"type\": \"user\"\n        }\n      }\n    ]\n\n    $ az ad sp create-for-rbac --role=\"Contributor\" --scopes=\"/subscriptions/20000000-0000-0000-0000-000000000000\"\n    {\n      \"appId\": \"00000000-0000-0000-0000-000000000000\",\n      \"displayName\": \"azure-cli-2017-06-05-10-41-15\",\n      \"name\": \"http://azure-cli-2017-06-05-10-41-15\",\n      \"password\": \"0000-0000-0000-0000-000000000000\",\n      \"tenant\": \"00000000-0000-0000-0000-000000000000\"\n    }\n    ```\n    These values map to the Terraform variables like so:  \n      - appId is the client_id defined above.  \n      - password is the client_secret defined above.  \n      - tenant is the tenant_id defined above.  \n- Then save these values in ./tf-azure-*/Terraform.tfvars as follows. Note: the default configuration of '.gitignore' in this repsoitory will ignore this file when commiting to git remote repository.\n    ```\n    (ansible) wsl01@XYZ:/mnt/c/Users/PQR/Source/webnode/tf-azure-debian12$ cat Terraform.tfvars\n    pub_key=\"/mnt/c/Users/PQR/.ssh/id_rsa_4096_Azure.pub\"\n    pvt_key=\"/mnt/c/Users/PQR/.ssh/id_rsa_4096_Azure\"\n    root_password=\"XXXXXXXXXXXX\"\n    az_app_sp_id=\"00000000-0000-0000-0000-000000000000\"\n    az_sp_secret=\"0000-0000-0000-0000-000000000000\"\n    az_tenant=\"00000000-0000-0000-0000-000000000000\"\n    az_subscription_id=\"20000000-0000-0000-0000-000000000000\"\n    (ansible) wsl01@XYZ:/mnt/c/Users/PQR/Source/webnode/tf-azure-debian12$\n    ```\n\n## \u003ca name=\"google-gcloud\"\u003eSetting up Google Cloud Platform and Using it with Terraform\u003c/a\u003e\nFor using Terraform on Google Cloud Platform (GCP), 'gcloud CLI' needs to be installed on the local computer where these scripts will be executed. On a Windows \ncomputer you can either install using Windows 11 Installation method, or use WSL2 and use a suitable Linux Installation method. These instllation steps are documented on [this Google website link](https://cloud.google.com/sdk/docs/install). Windows installed gcloud also works with WSL2 linux.\n\nOR use an adminisistrative CMD/PowerShell prompt and use 'winget' Windows Package Manager to list and then install it. \n```\nPS C:\\Windows\\System32\u003e winget search Google.CloudSDK\nPS C:\\Windows\\System32\u003e winget install Google.CloudSDK\n```\n\n### Gcloud CLI - Links\n* [link 1](https://registry.terraform.io/providers/hashicorp/google/latest/docs/guides/provider_reference)\n* [link 2](https://cloud.google.com/sdk/gcloud/reference/auth/application-default)\n* [link actual](https://blog.avenuecode.com/how-to-use-terraform-to-create-a-virtual-machine-in-google-cloud-platform)\n  \n### Some usefull Gcloud CLI commands\n```\ngcloud auth login\n\ngcloud config set project terraform-webnode\n\ngcloud auth revoke    # Logout\n\n# -- Create Service Account and Assign Key(json file with key is downloaded upon creation only)\n\ngcloud iam service-accounts create svcaccount-terraform\ngcloud iam service-accounts keys create \"${HOME}/.ssh/gcloud-svcaccount-key.json\" --iam-account=svcaccount-terraform@terraform-webnode.iam.gserviceaccount.com\n\n# -- Assign/List Roles to the new service account.\n\n# List all roles assigned - run as top level owner permissions\ngcloud projects get-iam-policy \"terraform-webnode\" --flatten=\"bindings[].members\" --filter=\"bindings.members:serviceAccount:svcaccount-terraform@terraform-webnode.iam.gserviceaccount.com\" --format=\"table(bindings.role)\"\n# reponse:\n# ROLE\n# roles/compute.admin\n# roles/iam.serviceAccountUser\n\n# Assign the minimum Required Roles to the service account - run as owner.\ngcloud projects add-iam-policy-binding \"terrform-webnode\" --member=\"user:svcaccount-terraform@terraform-webnode.iam.gserviceaccount.com\" --role=\"roles/compute.admin\"\n\ngcloud projects add-iam-policy-binding \"terrform-webnode\" --member=\"user:svcaccount-terraform@terraform-webnode.iam.gserviceaccount.com\" --role=\"roles/iam.serviceAccountUser\"\n\n#-- Move Service Account key to a well known location, for ease in pointing in *.tfvars file.\nmv gcloud-svcaccount-key.json ~/.ssh/\n\n# Login using service-account manually. Do not need to login manually if Terraform *.tf script - svc account is defined/setup correctly.\ngcloud auth activate-service-account --key-file=\"${HOME}/.ssh/gcloud-svcaccount-key.json\"\ngcloud auth list\ngcloud auth revoke    # Logout\n\n# -- List VM Images available (need - roles/compute.viewer - role at least)\ngcloud compute images list\n\n# -- To SSH into VM using gcloud default Service-Account:\ngcloud compute ssh --zone \"us-east1-b\" \"webnode\" --project \"terraform-webnode\"\n\n# -- OR if root login (and/or user login) is enabled in the image, and SSH-Key has been placed then:\nssh root@\u003c\u003cExternal (Ephemeral) IP\u003e\u003e\n\n```\n\n## \u003ca name=\"amazon-aws\"\u003eSetting up Amazon AWS and Using it with Terraform\u003c/a\u003e\nFor using Terraform on Amazon Cloud (AWS), 'aws CLI' needs to be installed on the local computer where these scripts will be executed. On a Windows \ncomputer you can either install using Windows 11 Installation method. These instllation steps are documented on [this Amazon website link](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html).\n\nOR use an adminisistrative CMD/PowerShell prompt and use 'winget' Windows Package Manager to list and then install it. \n```\nPS C:\\Windows\\System32\u003e winget search Amazon.AWSCLI\nPS C:\\Windows\\System32\u003e winget install Amazon.AWSCLI\n```\n\n### AWS CLI - Links\n* [link 1](https://registry.terraform.io/providers/hashicorp/aws/latest/docs)\n* [link 2](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-using.html)\n* [link 3](https://medium.com/@shanmorton/set-up-terraform-tf-and-aws-cli-build-a-simple-ec2-1643bcfcb6fe)\n  \n### Some usefull AWS CLI commands\n```\n# Create a New User for Terraform\nPS C:\\Users\\PQRS\u003e  aws iam create-user --user-name terraform2\n{\n    \"User\": {\n        \"Path\": \"/\",\n        \"UserName\": \"terraform2\",\n        \"UserId\": \"AAAAAABBBBBCCCCC\",\n        \"Arn\": \"arn:aws:iam::12456789753:user/terraform2\",\n        \"CreateDate\": \"2025-02-21T05:38:54+00:00\"\n    }\n}\n\n# Create Access-Key for this new user. Note down Access Key ID and SecretAccessKey.\nPS C:\\Users\\PQRS\u003e  aws iam create-access-key --user-name terraform2\n{\n    \"AccessKey\": {\n        \"UserName\": \"terraform2\",\n        \"AccessKeyId\": \"QQQQQAAAAATTTTTT\",\n        \"Status\": \"Active\",\n        \"SecretAccessKey\": \"SOME_RANDOM_SECRET_KEY\",\n        \"CreateDate\": \"2025-02-21T05:39:14+00:00\"\n    }\n}\n\n# Create a IAM Group for Organizing PowerUsers\nPS C:\\Users\\PQRS\u003e  aws iam create-group --group-name PowerUsers2\n{\n    \"Group\": {\n        \"Path\": \"/\",\n        \"GroupName\": \"PowerUsers2\",\n        \"GroupId\": \"AGPATRLD7BEGYLAIBILQ5\",\n        \"Arn\": \"arn:aws:iam::12456789753:group/PowerUsers2\",\n        \"CreateDate\": \"2025-02-21T05:43:11+00:00\"\n    }\n}\n\n# Add the new User to this Group\nPS C:\\Users\\PQRS\u003e  aws iam add-user-to-group --group-name PowerUsers2 --user-name terraform2\nPS C:\\Users\\PQRS\u003e\n\n# Get the Full 'PowerUserAccess' Policy ARN Name.\nPS C:\\Users\\PQRS\u003e  aws iam list-policies --query 'Policies[?PolicyName == `PowerUserAccess`].{PolicyName: PolicyName,Arn: Arn}'\n[\n    {\n        \"PolicyName\": \"PowerUserAccess\",\n        \"Arn\": \"arn:aws:iam::aws:policy/PowerUserAccess\"\n    }\n]\n\n# Attach this Policy to the Group and hence to the user.\nPS C:\\Users\\PQRS\u003e aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/PowerUserAccess --group-name PowerUsers2\nPS C:\\Users\\PQRS\u003e\n```\n\n## Linux User Password Hashing\nLinux User accounts name and passwords are saved in the './vars/secrets.yml' (Default-of-this-repo: It is ignored by git commits) file. The\npassword to be saved in this file should be Hash-encoded, as a safe best practice. This avoids the raw password from appearing in Log files\nand accidentally being commited into the git remote server.\n\n### Hashing on Ubuntu / Debian\n```\n$ sudo apt update\n$ sudo apt install whois \n$ mkpasswd --method=\"sha-512\" --salt=\"Thisisarandomsaltingstring\"\nPassword: \n$6$ieMLxPFShvi6rao9$XEAU9ZDvnPtL.sDuSdRi6M79sgD9254b/0wZvftBNvMOjj3pHJBCIe04x2M.JA7gZ7MwpBWat1t4WQDFziZPw1\n```\n### Hashing on CentOS / Fedora\n```\n$ sudo dnf install expect\n$ mkpasswd --method=\"sha-512\" --salt=\"Thisisarandomsaltingstring\"\nPassword: \n$6$ieMLxPFShvi6rao9$XEAU9ZDvnPtL.sDuSdRi6M79sgD9254b/0wZvftBNvMOjj3pHJBCIe04x2M.JA7gZ7MwpBWat1t4WQDFziZPw1\n```\n\n## External Roles Used in this Project\nThe following external ansible roles are used in this project to make it modular. Details of Role specific variables can be explored in the respective role documentation.  \n* [hammadrauf.sudousers](https://github.com/hammadrauf/sudousers)\n* [fauust.mariadb](https://github.com/fauust/ansible-role-mariadb)\n* [hammadrauf.apache2](https://github.com/hammadrauf/apache2)    \nFor upto date list of roles used please check [roles/requirements.yml](https://github.com/build-boxes/webnode/blob/main/roles/requirements.yml) file.  \n\n## Using the Installed MariaDB instance\nMake sure the user password for MariaDB contains only alpha-numeric characters. Passwords with symbols will fail to login. Currently the \npassword cannot be hashed by SHA256/512. Check later versions if hashing of passwords is enabled.    \nTo connect to the mariadb instance use the command:  \n```\n$ mysql -uUSERNAME -pPASSWORD -PPORTNUMBER\n```\n\n## Icon Attribution Link\n* [Beach-ball icons created by Freepik - Flaticon](https://www.flaticon.com/free-icons/beach-ball)\n\n## About this Project\n- [Andromedabay - Experiments in IAC](https://andromedabay.ddns.net/experiments-with-iac-automation/)\n\n## RedHat / CentOS errors (TO DO)\n```\n$ ansible-playbook -i 192.168.0.12, -u root -k main.yml   # RedHat9.4\n\nTASK [geerlingguy.certbot : Enable DNF module for Rocky/AlmaLinux.] *********************************************************************************************************************************************\nfatal: [192.168.0.12]: FAILED! =\u003e {\"changed\": false, \"cmd\": \"dnf config-manager --set-enabled crb\\n\", \"delta\": \"0:00:01.272953\", \"end\": \"2024-08-09 16:10:49.498680\", \"msg\": \"non-zero return code\", \"rc\": 1, \"start\": \"2024-08-09 16:10:48.225727\", \"stderr\": \"Error: No matching repo to modify: crb.\", \"stderr_lines\": [\"Error: No matching repo to modify: crb.\"], \"stdout\": \"Updating Subscription Management repositories.\", \"stdout_lines\": [\"Updating Subscription Management repositories.\"]}\n```\n\n```\n$ vagrant up centos   # centos9 CentOS-Stream-9-20240415.0-x86_64-dvd1.iso\n\nTASK [geerlingguy.certbot : Generate new certificate if one doesn't exist.] ****\nfatal: [centos]: FAILED! =\u003e {\"msg\": \"The task includes an option with an undefined variable. The error was: {{ certbot_script }} certonly --{{ certbot_create_method  }} {{ '--hsts' if certbot_hsts else '' }} {{ '--test-cert' if certbot_testmode else '' }} --noninteractive --agree-tos --email {{ cert_item.email | default(certbot_admin_email) }} {{ '--webroot-path ' if certbot_create_method == 'webroot'  else '' }} {{ cert_item.webroot | default(certbot_webroot) if certbot_create_method == 'webroot' else '' }} {{ certbot_create_extra_args }} -d {{ cert_item.domains | join(',') }} {{ '--pre-hook /etc/letsencrypt/renewal-hooks/pre/stop_services'\\n  if certbot_create_standalone_stop_services and certbot_create_method == 'standalone'\\nelse '' }} {{ '--post-hook /etc/letsencrypt/renewal-hooks/post/start_services'\\n  if certbot_create_standalone_stop_services and certbot_create_method == 'standalone'\\nelse '' }}: 'certbot_create_extra_args' is undefined. 'certbot_create_extra_args' is undefined. {{ certbot_script }} certonly --{{ certbot_create_method  }} {{ '--hsts' if certbot_hsts else '' }} {{ '--test-cert' if certbot_testmode else '' }} --noninteractive --agree-tos --email {{ cert_item.email | default(certbot_admin_email) }} {{ '--webroot-path ' if certbot_create_method == 'webroot'  else '' }} {{ cert_item.webroot | default(certbot_webroot) if certbot_create_method == 'webroot' else '' }} {{ certbot_create_extra_args }} -d {{ cert_item.domains | join(',') }} {{ '--pre-hook /etc/letsencrypt/renewal-hooks/pre/stop_services'\\n  if certbot_create_standalone_stop_services and certbot_create_method == 'standalone'\\nelse '' }} {{ '--post-hook /etc/letsencrypt/renewal-hooks/post/start_services'\\n  if certbot_create_standalone_stop_services and certbot_create_method == 'standalone'\\nelse '' }}: 'certbot_create_extra_args' is undefined. 'certbot_create_extra_args' is undefined\\n\\nThe error appears to be in '/home/wsl01/.ansible/roles/geerlingguy.certbot/tasks/create-cert-standalone.yml': line 40, column 3, but may\\nbe elsewhere in the file depending on the exact syntax problem.\\n\\nThe offending line appears to be:\\n\\n\\n- name: Generate new certificate if one doesn't exist.\\n  ^ here\\n\"}\n```\n## ToDo\n- [Integrate postfix-dovecot](https://github.com/StackFocus/ansible-role-postfix-dovecot/tree/master)\n- [Integrate Optional Rclone](https://github.com/stefangweichinger/ansible-rclone)\n  - (Rclone is a command-line program to sync files and directories to and from different cloud storage providers)\n- Wordpress restore from backup.\n- Solution for Wordpress App IP Address for Vagrant/Public Cloud\n- Testing on RHEL9/Centos9\n- This error:\n  ```\n  TASK [Comment out old Network config - Debian family] **************************\n  fatal: [34.73.105.50]: FAILED! =\u003e {\"changed\": false, \"msg\": \"Path /etc/network/interfaces does not exist !\", \"rc\": 257}\n  ```\n-  \n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbuild-boxes%2Fwebnode","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbuild-boxes%2Fwebnode","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbuild-boxes%2Fwebnode/lists"}