{"id":18445622,"url":"https://github.com/voronenko/wordpress-classic-app-demo","last_synced_at":"2026-05-05T00:36:37.456Z","repository":{"id":38182683,"uuid":"174232574","full_name":"Voronenko/wordpress-classic-app-demo","owner":"Voronenko","description":"Approach for combining terraform and ansible to deploy lamp server with wordpress application","archived":false,"fork":false,"pushed_at":"2023-01-24T23:19:55.000Z","size":614,"stargazers_count":2,"open_issues_count":31,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-15T01:14:09.996Z","etag":null,"topics":["ansible","oops-to-devops","terraform","wordpress"],"latest_commit_sha":null,"homepage":null,"language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Voronenko.png","metadata":{"files":{"readme":"Readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-03-06T22:44:56.000Z","updated_at":"2021-05-01T07:16:31.000Z","dependencies_parsed_at":"2023-01-25T11:30:16.889Z","dependency_job_id":null,"html_url":"https://github.com/Voronenko/wordpress-classic-app-demo","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Voronenko%2Fwordpress-classic-app-demo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Voronenko%2Fwordpress-classic-app-demo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Voronenko%2Fwordpress-classic-app-demo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Voronenko%2Fwordpress-classic-app-demo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Voronenko","download_url":"https://codeload.github.com/Voronenko/wordpress-classic-app-demo/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248986316,"owners_count":21194025,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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","oops-to-devops","terraform","wordpress"],"created_at":"2024-11-06T07:06:35.927Z","updated_at":"2026-05-05T00:36:32.433Z","avatar_url":"https://github.com/Voronenko.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Demo:  using ansible and terraform to deploy wordpress application\n\nIn this demo from oops-to-devops services  https://github.com/topics/oops-to-devops we provide\nexample, how ansible and terraform flows might be splitted between infrastructure deployment\nand business logic deployment.\n\n\nFolders structure:\n\n## providers/\u003cprovider-name\u003e/\n\nUnder providers we put terraform logic, that will create necessary infrastructure for us.\nAs your project might be deployed to multiple clouds, you can end with separate terraform scenarios \nfor those activities, thus it can be reasonable, to put project under folder, named by cloud provider,\nlike `providers/digitalocean/...` \n\n\n## provisioners/shared/\n\nHere we collect knowledge needed to deploy your project. In particular,\n\n### provisioners/env/\n\nThis is shared folder for environment overrides, i.e. specific parameters, that differ across\ndeployments - like fqdn, passwords, options etc.\n\nHere and below ENV stands for environment name, like prod, staging, dev and so on.\n\nNote that this is the place, where you can inject encrypted secrets, for example using ansible vault.\nOrder of proving overrides is following:\n\n- env-ENV-vars.yml\n- env-default-vars.yml\n\n### provisioners/providers/\n\nIdea close to what we have with environments, but here you can put specific \nto cloud provider used. Note, that you also can encrypt sensitive data here with ansible vault. \n\noverrides will be searched in the following order (first found will be picked up):\n\n```\n- PROVIDER-ENV-vars.yml\n- PROVIDER-vars.yml\n``` \n\n### provisioners/files/\n\nAny fixed file artifacts you might have - team ssh keys, etc\n\n### provisioners/inventory/\n\nUnder this directory, terraform script will generate inventory files for ansible, basing \non information about resources created.\n\nTypical structure you will see here \n\n```\ninventory/prod/...\ninventory/staging/...\n\n...\n\ninventory/default/...\n```\n\nYou can explore inventory with `ansible-inventory`\n\n```\n ansible-inventory -i default/ --graph\n@all:\n  |--@aws_ec2:\n  |--@ungrouped:\n```\n\n### Deployment environment\n\nalso it is assumed, that following environment variables are set:\n\nINFRASTRUCTURE_ROOT_DIR, which defaults to root project of the solution,\nANSIBLE_VAULT_IDENTITY_LIST, which hels ansible to decrypt encrypted values\n\n```\nexport INFRASTRUCTURE_ROOT_DIR=$PWD\nexport ANSIBLE_VAULT_IDENTITY_LIST=\"@$HOME/path/to/vault\"\n```\n\nalso you should provide any other environment variables needed for provisioning.\nFor example, for this demo we will be using digitalocean token to create resources,\nand godaddy key pair to create DNS entry.\n\n```\nexport DIGITALOCEAN_TOKEN=hihi\nexport GD_KEY=haha\nexport GD_SECRET=hehe\n```\n\n## Provisioning considerations\n\nServer roles used are proposed to be stored under `provisioners/\u003cserver-role\u003e-box` with a\nspecific structure for environment variables:\n\n```\nBOX_ADDRESS - address of the box, or path to inventory\nBOX_PROVIDER - provider used (digitalocean, aws, etc)\nBOX_DEPLOY_USER - user used to connect to server for provisioning\nBOX_DEPLOY_PASS - provisioning user password, if any\nENVIRONMENT - current environment, like prod, staging, dev\n\n\nREMOTE_USER_INITIAL - only for fresh instance, not prepared for deployment yet\nREMOTE_PASSWORD_INITIAL - only for fresh instance, not prepared for deployment yet\n```\n\nTypical provisioning script would be\n\n```bash\n\n# Static parameters\nWORKSPACE=$(\n  cd $(dirname \"$0\")\n  pwd\n)\n\nBOX_PLAYBOOK=$WORKSPACE/\u003cSERVER-ROLE-PLAYBOOK\u003e.yml\nBOX_NAME=\u003cSERVER-ROLE\u003e\nBOX_ADDRESS=$REMOTE_HOST\nBOX_USER=$REMOTE_USER_INITIAL\nBOX_PWD=$REMOTE_PASSWORD_INITIAL\nBOX_PROVIDER=${BOX_PROVIDER:-}\nENVIRONMENT=${ENVIRONMENT:-default}\n\nprudentia ssh \u003c\u003cEOF\nunregister $BOX_NAME\n\nregister\n$BOX_PLAYBOOK\n$BOX_NAME\n$BOX_ADDRESS\n$BOX_USER\n$BOX_PWD\n\nverbose 1\nset box_address $BOX_ADDRESS\nset box_deploy_pass $BOX_DEPLOY_PASS\nset ansible_become_password $BOX_PWD\nset box_provider $BOX_PROVIDER\nset env $ENVIRONMENT\n\nprovision $BOX_NAME\nEOF\n\n```\n\nAnd bridge between terraform and ansible might look as:\n\n```hcl\nresource \"null_resource\" \"letsencrypted_servers\" {\n  # Changes to any instance of the cluster requires re-provisioning\n  triggers {\n    cluster_instance_ids = \"${join(\",\", digitalocean_droplet.web.*.id)}\"\n  }\n\n\n  provisioner \"local-exec\" {\n\n    command = \"$INFRASTRUCTURE_ROOT_DIR/provisioners/letsencrypted-box/provision_box.sh\"\n\n    environment {\n      REMOTE_HOST = \"${digitalocean_droplet.web.ipv4_address}\"\n      BOX_DEPLOY_USER = \"ubuntu\"\n      BOX_DEPLOY_PASS = \"\"\n      BOX_PROVIDER = \"digitalocean\"\n    }\n\n  }\n\n  depends_on = [\"null_resource.baseboxed_servers\"]\n}\n```\n\nNow lets proceed in a interactive session in details\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvoronenko%2Fwordpress-classic-app-demo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvoronenko%2Fwordpress-classic-app-demo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvoronenko%2Fwordpress-classic-app-demo/lists"}