This folder contains an example Packer template for building an AMI (Amazon Machine Image) containing the OpenVPN server.
Pre-requisites:
In order to build this AMI you will need to provide some input variables. There are several variables but the most important ones are:
In which AWS region should Packer build your AMI
Where should Packer look for a copy of the openvpn-admin binary that you will use to manage your VPN certificates. If you haven't built this before, take a look at it's documentation for steps on how to build it. Remember: When building openvpn-admin for use in this packer template, keep in mind the OS and architecture where this will be deployed and not the OS/architecture of the machine that's building openvpn-admin. E.g., if you're firing up an EC2 Instance that runs Linux, you'll need to build the binary for Linux, even if you happen to be running the build on a Mac.
All variables below:
Variable name
Description
Default Value
active_git_branch
The git branch to use for gruntwork-install.
null
aws_region
Tells Packer in which AWS region to build your AMI
us-east-1
github_oauth_token
Your github OAuth token.
env.GITHUB_OAUTH_TOKEN
openvpn_admin_binary
Where should Packer look for a copy of the openvpn-admin binary that you will use to manage the VPN certificates on your VPN server. See: openvpn-admin for more info.
Please note a few details about the command above:
it requires the openvpn-admin binary being provided
⚠️ Make sure the format of the openvpn-admin binary needs to be executable by the OpenVPN server OS. For example for EC2 Instances running Ubuntu, the format that would be appropriate is openvpn-admin_linux_amd64.
You could run the automated test or build the binary manually:
cd ./../../modules/openvpn-admin/src
GOOS=linux GOARCH=amd64 go build .
You can download the latest release from the Releases pages;
For production builds, you can use gruntwork-install to install the binary:
it uses the only flag that allows you to execute one specific builder with the given name.
This parameter can be ommitted if the packer template has only one builder defined in it. Or alternatively, Packer will build all that is specified in the packer/build.json file.
Questions? Ask away.
We're here to talk about our services, answer any questions, give advice, or just to chat.
{"treedata":{"name":"root","toggled":true,"children":[{"name":".circleci","children":[{"name":"config.yml","path":".circleci/config.yml","sha":"2b3ceae62420b4fd9ef7413f400619f24e05ac62"},{"name":"post-upgrade-test-results.sh","path":".circleci/post-upgrade-test-results.sh","sha":"a4867e8fbdc334b7a90259568ee41ea577fbe764"},{"name":"set-upgrade-test-vars.sh","path":".circleci/set-upgrade-test-vars.sh","sha":"0978a60d00cfb4a959a939b71d9e9d5929d9baff"}]},{"name":".github","children":[{"name":"ISSUE_TEMPLATE","children":[{"name":"bug_report.md","path":".github/ISSUE_TEMPLATE/bug_report.md","sha":"d2e87e27c601e423865ed660ec697082470ca60f"},{"name":"feature_request.md","path":".github/ISSUE_TEMPLATE/feature_request.md","sha":"023a33099be2336476930c96e17ff1ba5dc55348"}]},{"name":"pull_request_template.md","path":".github/pull_request_template.md","sha":"6b100e40e323b5b07f40ed30616277c51c9f4b9e"}]},{"name":".gitignore","path":".gitignore","sha":"dc2eb8ea5e17708df66634ed2f95c8c5e973daed"},{"name":".patcher","children":[{"name":"patches","children":[{"name":"v0.20.0","children":[{"name":"iam-inline-policies","children":[{"name":"patch.yaml","path":".patcher/patches/v0.20.0/iam-inline-policies/patch.yaml","sha":"227e840b5996bae65ce9984c9e1398226a5d8141"},{"name":"var_use_managed_iam_policies.sh","path":".patcher/patches/v0.20.0/iam-inline-policies/var_use_managed_iam_policies.sh","sha":"e5eb47cf889c6e28fec50f34e973ef8c3c5ec2f3"}]}]},{"name":"v0.21.0","children":[{"name":"terraform-1.1-upgrade","children":[{"name":"bump_required_version.sh","path":".patcher/patches/v0.21.0/terraform-1.1-upgrade/bump_required_version.sh","sha":"30abb1d075dbc85ce83dc415869de1c9c8560b0d"},{"name":"patch.yaml","path":".patcher/patches/v0.21.0/terraform-1.1-upgrade/patch.yaml","sha":"1b27c37854276ff6fa550c1211dac23cb61d6ac5"}]}]},{"name":"v0.22.0","children":[{"name":"disable-ebs-optimization","children":[{"name":"patch.yaml","path":".patcher/patches/v0.22.0/disable-ebs-optimization/patch.yaml","sha":"793d51f95be26299442847ac2f9ae523200b7bb1"},{"name":"set_var_ebs_optimized_to_false.sh","path":".patcher/patches/v0.22.0/disable-ebs-optimization/set_var_ebs_optimized_to_false.sh","sha":"870246ddb1d2d902fc830d080e278372110ddc24"}]}]},{"name":"v0.23.0","children":[{"name":"aws-provider-4.x","children":[{"name":"bump_provider.sh","path":".patcher/patches/v0.23.0/aws-provider-4.x/bump_provider.sh","sha":"d3daee144dd21814811d998e5ae69796b9956509"},{"name":"create_script_for_terraform_init.sh","path":".patcher/patches/v0.23.0/aws-provider-4.x/create_script_for_terraform_init.sh","sha":"c38f2bb4802978301590d1a045037655e54995e3"},{"name":"patch.yaml","path":".patcher/patches/v0.23.0/aws-provider-4.x/patch.yaml","sha":"f287d938e73b1b3fbbd3912c31f429d73416c468"}]}]},{"name":"v0.24.0","children":[{"name":"aws-provider-4.x","children":[{"name":"bump_provider.sh","path":".patcher/patches/v0.24.0/aws-provider-4.x/bump_provider.sh","sha":"7c61315127a8c8471a2688c089e23963161d5d35"},{"name":"create_script_for_terraform_init.sh","path":".patcher/patches/v0.24.0/aws-provider-4.x/create_script_for_terraform_init.sh","sha":"10a61b3d3b064715829a8635464cb45df2fa6608"},{"name":"patch.yaml","path":".patcher/patches/v0.24.0/aws-provider-4.x/patch.yaml","sha":"284408766ca98c795d72d9f0dcb7482e948fda08"}]}]}]}]},{"name":".pre-commit-config.yaml","path":".pre-commit-config.yaml","sha":"ef4c514168a04923df9033bb2ea77801b035eef5"},{"name":"CODEOWNERS","path":"CODEOWNERS","sha":"ba6f6b4ca9979f15f13a1002e4d6edbeca674637"},{"name":"LICENSE.txt","path":"LICENSE.txt","sha":"5ae97660cb6e3a07b61c971f1a25edf402e90f53"},{"name":"README.md","path":"README.md","sha":"a04049315ec75ca736c9a2c562eb97ac24679a6e"},{"name":"examples","children":[{"name":"openvpn-host-duo","children":[{"name":"README.md","path":"examples/openvpn-host-duo/README.md","sha":"1a3065f058745f0f03fd74844ac4e872d52538de"},{"name":"main.tf","path":"examples/openvpn-host-duo/main.tf","sha":"bc5a44c2030d8c471ff9ba045681b427fbc909ab"},{"name":"outputs.tf","path":"examples/openvpn-host-duo/outputs.tf","sha":"f527145f657a5a99d32c301c591f461f2230e3b9"},{"name":"user-data","children":[{"name":"user-data.sh","path":"examples/openvpn-host-duo/user-data/user-data.sh","sha":"11d8cb4fd9efc019a506a848eb8312d26f8d9b26"}]},{"name":"vars.tf","path":"examples/openvpn-host-duo/vars.tf","sha":"280eaddae0870e2815aab482f81e73e19754c15f"}]},{"name":"openvpn-host","children":[{"name":"README.md","path":"examples/openvpn-host/README.md","sha":"851c84174ea25ce2dbf01aae7a3764a5208f553d"},{"name":"main.tf","path":"examples/openvpn-host/main.tf","sha":"15b314bc2e17bbdfb79d5473e7245b882b7df5bd"},{"name":"outputs.tf","path":"examples/openvpn-host/outputs.tf","sha":"f527145f657a5a99d32c301c591f461f2230e3b9"},{"name":"user-data","children":[{"name":"user-data.sh","path":"examples/openvpn-host/user-data/user-data.sh","sha":"efee4866142d928414e821e5bde470f5bdb1a2bf"}]},{"name":"vars.tf","path":"examples/openvpn-host/vars.tf","sha":"542775561463c32dde942a809ad0736d71a83b5a"}]},{"name":"packer-duo","children":[{"name":"README.md","path":"examples/packer-duo/README.md","sha":"d885b8114f2af50fb01d4707e56bb81ae79da798"},{"name":"build.json","path":"examples/packer-duo/build.json","sha":"277b1569ac194f72c2796089870a9c8b366373e5"}]},{"name":"packer","children":[{"name":"README.md","path":"examples/packer/README.md","sha":"7c3444a90e7bd6ffd8dd0d281439a03d01827d68","toggled":true},{"name":"build.json","path":"examples/packer/build.json","sha":"0202c80862a2758391cb07b3753ffc6d76f20f38"}],"toggled":true}],"toggled":true},{"name":"modules","children":[{"name":"backup-openvpn-pki","children":[{"name":"README.md","path":"modules/backup-openvpn-pki/README.md","sha":"d271084a97e3ea953afb0e9e690fac951bb6be6d"},{"name":"bin","children":[{"name":"backup-openvpn-pki","path":"modules/backup-openvpn-pki/bin/backup-openvpn-pki","sha":"90effb15d572fb909c10c45cfd7bb496f6efb748"}]},{"name":"install.sh","path":"modules/backup-openvpn-pki/install.sh","sha":"af225b1dcd43eaab802a9e8040b3d39e25dd46a0"}]},{"name":"init-openvpn","children":[{"name":"README.md","path":"modules/init-openvpn/README.md","sha":"3a55b2c92611085870730ea15d589723b31dc775"},{"name":"bin","children":[{"name":"init-openvpn","path":"modules/init-openvpn/bin/init-openvpn","sha":"6446e18cb12aa1f21cf565905a5e8fbdbabf98d9"}]},{"name":"install.sh","path":"modules/init-openvpn/install.sh","sha":"9a41f990f62b2a9b526edfa813075cff277e1312"}]},{"name":"install-openvpn","children":[{"name":"README.md","path":"modules/install-openvpn/README.md","sha":"6073ab56f3a3ca0a69ca949a8a1e6086d7797709"},{"name":"bin","children":[{"name":"install-openvpn","path":"modules/install-openvpn/bin/install-openvpn","sha":"3927f5cbeaf08966f9132c161187915186c5a1f2"}]},{"name":"files","children":[{"name":"before.rules","path":"modules/install-openvpn/files/before.rules","sha":"e9f11106dda0d258910a36d88b3cac05c0d85146"},{"name":"openvpn-client.ovpn","path":"modules/install-openvpn/files/openvpn-client.ovpn","sha":"3fe8af5d74c724399d2b2acaaac3e5d07889912f"},{"name":"ufw-default","path":"modules/install-openvpn/files/ufw-default","sha":"ff5e7f69b1f65a2760579d4aa7575b278273e56b"},{"name":"vars.local","path":"modules/install-openvpn/files/vars.local","sha":"b19ce7da2758a7792a05d7563201127f8b1542c9"}]},{"name":"install.sh","path":"modules/install-openvpn/install.sh","sha":"65c8ed227131e94e7db76f47093f05b953950d07"},{"name":"scripts","children":[{"name":"generate-wrapper.sh","path":"modules/install-openvpn/scripts/generate-wrapper.sh","sha":"34d49724be9c3555a886d3cf00cf9cdbcb2a43bf"},{"name":"revoke-wrapper.sh","path":"modules/install-openvpn/scripts/revoke-wrapper.sh","sha":"d158a871cdd70cfed92418b6618d81c6bef08bd7"}]}]},{"name":"openvpn-admin","children":[{"name":".dockerignore","path":"modules/openvpn-admin/.dockerignore","sha":"a725465aee245635a2bd129af54858ed32c84cb8"},{"name":"Dockerfile","path":"modules/openvpn-admin/Dockerfile","sha":"d8b2de7aeb782a31932157e3a4fb183333da4259"},{"name":"README.md","path":"modules/openvpn-admin/README.md","sha":"27e205afef3ce91fb229c359693de4a99c5651f7"},{"name":"_ci","children":[{"name":"build-and-test.sh","path":"modules/openvpn-admin/_ci/build-and-test.sh","sha":"7b57f49d2a5cbce5f3e833c6e3dac767a90a92fa"},{"name":"test.sh","path":"modules/openvpn-admin/_ci/test.sh","sha":"ba48b9b10f31ca3f2e41ee3ce85e04d6ae289657"}]},{"name":"docker-compose.yml","path":"modules/openvpn-admin/docker-compose.yml","sha":"9a1c04848275d1a302063301d55b811aa0d666ed"},{"name":"go.mod","path":"modules/openvpn-admin/go.mod","sha":"ab79e395738712bb556310407f5db92bfdaee77d"},{"name":"go.sum","path":"modules/openvpn-admin/go.sum","sha":"3c87ad8ce8618d3614021bd24633a1c4159613dc"},{"name":"openvpn-request-flow-diagram.svg","path":"modules/openvpn-admin/openvpn-request-flow-diagram.svg","sha":"4c170df3fd6cf76d4c8e0bed7e1f2dbd98c08942"},{"name":"openvpn-revoke-flow-diagram.png","path":"modules/openvpn-admin/openvpn-revoke-flow-diagram.png","sha":"ccf48d05e3a492188900dfe73ea2fbc4eb3a3e29"},{"name":"scripts","children":[{"name":"build-linux-binary.sh","path":"modules/openvpn-admin/scripts/build-linux-binary.sh","sha":"3dfe844499b28878ebbb177453887bc786aec4de"},{"name":"run.sh","path":"modules/openvpn-admin/scripts/run.sh","sha":"bbcb7f9bdf8578561226954669cdb3e886093fcb"}]},{"name":"src","children":[{"name":"app","children":[{"name":"app.go","path":"modules/openvpn-admin/src/app/app.go","sha":"28e3810bc071174e385ebf2247b61bda13435971"},{"name":"cert_helpers.go","path":"modules/openvpn-admin/src/app/cert_helpers.go","sha":"020446eb604694f4e7d96157147ca8a1889d72bb"},{"name":"cmd_process_certificate_requests.go","path":"modules/openvpn-admin/src/app/cmd_process_certificate_requests.go","sha":"cf02bc05833ef0b56d83ead4d5d176e944e37636"},{"name":"cmd_process_certificate_revocation_requests.go","path":"modules/openvpn-admin/src/app/cmd_process_certificate_revocation_requests.go","sha":"74861b358fb0f6d3cb5cbad5db7300334bd82cca"},{"name":"cmd_request_new_certificate.go","path":"modules/openvpn-admin/src/app/cmd_request_new_certificate.go","sha":"c71dc8560f604ab280ef8836cbbec8871cb43777"},{"name":"cmd_revoke_certificate.go","path":"modules/openvpn-admin/src/app/cmd_revoke_certificate.go","sha":"ee774da09d7dacf3040262589f1a78d415e72f6f"},{"name":"common.go","path":"modules/openvpn-admin/src/app/common.go","sha":"c4719d234436c76dee9950728e6654ec0227c187"},{"name":"common_test.go","path":"modules/openvpn-admin/src/app/common_test.go","sha":"95a41eb26136556b11fdcd1e5b731f6700b5dfc9"},{"name":"flags.go","path":"modules/openvpn-admin/src/app/flags.go","sha":"cdc6e7119277e7d1b8ff1684fd2c5aaf45c3b732"}]},{"name":"aws_helpers","children":[{"name":"iam.go","path":"modules/openvpn-admin/src/aws_helpers/iam.go","sha":"dd72a9b653f9ef2b2c2a98f1e1aa99adab9a8ff0"},{"name":"imds.go","path":"modules/openvpn-admin/src/aws_helpers/imds.go","sha":"2e0a36ba3352deaed04ea262fd0405e37bed9e00"},{"name":"sqs.go","path":"modules/openvpn-admin/src/aws_helpers/sqs.go","sha":"16e133d97e6f28e470c44aad18870dfe8e4685c9"}]},{"name":"main.go","path":"modules/openvpn-admin/src/main.go","sha":"b3a10913aa75a4032e52a071f1b88033ef10a29c"},{"name":"ping_helpers","children":[{"name":"ping_darwin.go","path":"modules/openvpn-admin/src/ping_helpers/ping_darwin.go","sha":"2322b41ee20f31a9312d1f3fdff02c3f81bca38a"},{"name":"ping_linux.go","path":"modules/openvpn-admin/src/ping_helpers/ping_linux.go","sha":"2890ee14fcaf9360e6d800648e7b272b78ea1fed"},{"name":"ping_windows.go","path":"modules/openvpn-admin/src/ping_helpers/ping_windows.go","sha":"a61dc1671a7726907d77693e25e2679a0b8cc856"}]}]}]},{"name":"openvpn-server","children":[{"name":"README.md","path":"modules/openvpn-server/README.md","sha":"87b5f1fe56a78b2310fd3a0232d68da34ba0ab07"},{"name":"main.tf","path":"modules/openvpn-server/main.tf","sha":"a738bfd945211c92075a86367cc108b872ae438f"},{"name":"outputs.tf","path":"modules/openvpn-server/outputs.tf","sha":"47f8161b74e4e659bcaee4b985e246cae8dba8ba"},{"name":"vars.tf","path":"modules/openvpn-server/vars.tf","sha":"6b457a3d89685e38ea5e19d886e96cc3fe71408d"}]},{"name":"start-openvpn-admin","children":[{"name":"README.md","path":"modules/start-openvpn-admin/README.md","sha":"0c9902a49939a60e80a57fa0f39bfbb50eafd40a"},{"name":"bin","children":[{"name":"run-process-requests","path":"modules/start-openvpn-admin/bin/run-process-requests","sha":"c46e8124f8d940bb682d8610cbf26f6877e13f08"},{"name":"run-process-revokes","path":"modules/start-openvpn-admin/bin/run-process-revokes","sha":"28a93d013eebb6cea2101eb81629431d25b9523b"}]},{"name":"install.sh","path":"modules/start-openvpn-admin/install.sh","sha":"2af5af7f24c40136b22d50cb8cec47f7a9d2b2ac"}]}]},{"name":"terraform-cloud-enterprise-private-module-registry-placeholder.tf","path":"terraform-cloud-enterprise-private-module-registry-placeholder.tf","sha":"ae586c0fe830819580e1009d41a9074f16e65bed"},{"name":"test","children":[{"name":"README.md","path":"test/README.md","sha":"0b09878429ef9ed0b43b812a3947ba8e1264d107"},{"name":"go.mod","path":"test/go.mod","sha":"c963b682e6f0a870482e1eb04500dc61394b13d3"},{"name":"go.sum","path":"test/go.sum","sha":"c3c6829ba00cc19eea1311d0b9074e438c5b50d6"},{"name":"local-test","children":[{"name":"docker-compose.yml","path":"test/local-test/docker-compose.yml","sha":"e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"}]},{"name":"openvpn_test.go","path":"test/openvpn_test.go","sha":"c0eeaac954b4f8b88b48610ad0f16f14c1cad631"},{"name":"test_helpers.go","path":"test/test_helpers.go","sha":"f250a2ee29e5c55a8fb97359083a565846575fad"},{"name":"upgrades","children":[{"name":"constants.go","path":"test/upgrades/constants.go","sha":"eb3c6ad4b94676fc1ab1313d0c10a2e3ce99996a"},{"name":"upgrade_module_openvpn_test.go","path":"test/upgrades/upgrade_module_openvpn_test.go","sha":"cfb675307aa23f7735dfb46938f25975487161d6"}]},{"name":"validation","children":[{"name":"validate_all_modules_and_examples_test.go","path":"test/validation/validate_all_modules_and_examples_test.go","sha":"33d73c385b64c4fc870033e99427e683c31dc45a"}]}]}]},"detailsContent":"<h1 class=\"preview__body--title\" id=\"open-vpn-example-ami\">Open VPN example AMI</h1><div class=\"preview__body--border\"></div><p>This folder contains an example <a href=\"https://www.packer.io/\" class=\"preview__body--description--blue\" target=\"_blank\">Packer</a> template for building an AMI (Amazon Machine Image) containing the OpenVPN server.</p>\n<h2 class=\"preview__body--subtitle\" id=\"pre-requisites\">Pre-requisites:</h2>\n<p>In order to build this AMI you will need to provide some input variables. There are several variables but the most important ones are:</p>\n<ul>\n<li>In which AWS region should Packer build your AMI</li>\n<li>Where should Packer look for a copy of the <a href=\"/repos/v0.24.0/package-openvpn/modules/openvpn-admin\" class=\"preview__body--description--blue\">openvpn-admin</a> binary that you will use to manage your VPN certificates. If you haven't built this before, take a look at it's documentation for steps on how to build it. <strong>Remember:</strong> When building <code>openvpn-admin</code> for use in this packer template, keep in mind the OS and architecture where this will be <em>deployed</em> and not the OS/architecture of the machine that's building <code>openvpn-admin</code>. E.g., if you're firing up an EC2 Instance that runs Linux, you'll need to build the binary for Linux, even if you happen to be running the build on a Mac.</li>\n</ul>\n<p>All variables below:</p>\n<table>\n<thead>\n<tr>\n<th>Variable name</th>\n<th>Description</th>\n<th>Default Value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>active_git_branch</td>\n<td>The git branch to use for gruntwork-install.</td>\n<td><code>null</code></td>\n</tr>\n<tr>\n<td>aws_region</td>\n<td>Tells Packer in which AWS region to build your AMI</td>\n<td><code>us-east-1</code></td>\n</tr>\n<tr>\n<td>github_oauth_token</td>\n<td>Your github OAuth token.</td>\n<td><code>env.GITHUB_OAUTH_TOKEN</code></td>\n</tr>\n<tr>\n<td>openvpn_admin_binary</td>\n<td>Where should Packer look for a copy of the <code>openvpn-admin</code> binary that you will use to manage the VPN certificates on your VPN server. See: <a href=\"/repos/v0.24.0/package-openvpn/modules/openvpn-admin\" class=\"preview__body--description--blue\">openvpn-admin</a> for more info.</td>\n<td><code>/examples/bin/openvpn-admin</code></td>\n</tr>\n<tr>\n<td>gruntwork_installer_version</td>\n<td>What version of <a href=\"/repos/gruntwork-installer\" class=\"preview__body--description--blue\">Gruntwork Installer</a> to use</td>\n<td><code>v0.0.20</code></td>\n</tr>\n<tr>\n<td>bash_commons_version</td>\n<td>What version of <a href=\"/repos/bash-commons\" class=\"preview__body--description--blue\">bash-commons</a> to use</td>\n<td><code>v0.0.6</code></td>\n</tr>\n</tbody>\n</table>\n<h2 class=\"preview__body--subtitle\" id=\"building-an-ami-using-the-packer-templates\">Building an AMI using the <code>Packer</code> templates</h2>\n<p>To build the desired <code>Packer</code> template, see the following example command:</p>\n<pre>aws-vault exec <IAM USER> -- packer build <span class=\"hljs-string\">\\</span>\n -<span class=\"hljs-keyword\">var</span> active_git_branch=master <span class=\"hljs-string\">\\</span>\n -<span class=\"hljs-keyword\">var</span> aws_region=eu-west-<span class=\"hljs-number\">2</span> <span class=\"hljs-string\">\\</span>\n -<span class=\"hljs-keyword\">var</span> openvpn_admin_binary=./openvpn-admin_linux_amd64 <span class=\"hljs-string\">\\</span>\n -only=ubuntu-<span class=\"hljs-number\">20</span>-build <span class=\"hljs-string\">\\</span>\n ./examples/packer/build.json\n</pre>\n<p>Please note a few details about the command above:</p>\n<ul>\n<li>it requires the <code>openvpn-admin</code> binary being provided\n<ul>\n<li>⚠️ Make sure the format of the <code>openvpn-admin</code> binary needs to be executable by the OpenVPN server OS. For example for EC2 Instances running Ubuntu, the format that would be appropriate is <code>openvpn-admin_linux_amd64</code>.\n<ul>\n<li>You could run the <a href=\"/repos/v0.24.0/package-openvpn/test/openvpn_test.go\" class=\"preview__body--description--blue\">automated test</a> or build the binary manually:</li>\n</ul>\n<pre>cd ./<span class=\"hljs-built_in\">..</span>/<span class=\"hljs-built_in\">..</span>/modules/openvpn-admin/src\n<span class=\"hljs-attribute\">GOOS</span>=linux <span class=\"hljs-attribute\">GOARCH</span>=amd64 go build .\n</pre>\n<ul>\n<li>You can download the latest release from the <a href=\"#open_modal\" class=\"preview__body--description--blue\">Releases pages</a>;</li>\n</ul>\n</li>\n<li>For production builds, you can use <code>gruntwork-install</code> to install the binary:</li>\n</ul>\n<pre><span class=\"hljs-string\">gruntwork-install </span><span class=\"hljs-built_in\">--binary-name</span> <span class=\"hljs-string\">openvpn-admin </span><span class=\"hljs-built_in\">--repo</span> <span class=\"hljs-string\">\"$openvpn_repo\"</span> <span class=\"hljs-built_in\">--tag</span> <span class=\"hljs-string\">\"$package_openvpn_version\"</span>\n</pre>\n</li>\n<li>it requires the <code>active_git_branch</code></li>\n<li>it uses the <code>only</code> flag that allows you to execute one specific builder with the given name.\n<ul>\n<li>This parameter can be ommitted if the packer template has only one builder defined in it. Or alternatively, <code>Packer</code> will build all that is specified in the <code>packer/build.json</code> file.</li>\n</ul>\n</li>\n</ul>\n","repoName":"package-openvpn","repoRef":"v0.24.3","serviceDescriptor":{"serviceName":"OpenVPN","serviceRepoName":"package-openvpn","serviceRepoOrg":"gruntwork-io","cloudProviders":["aws"],"description":"Deploy an OpenVPN server. Supports auto healing, public key infrastructure (PKI), cert backup, and managing user accounts using IAM groups.","imageUrl":"openvpn.png","licenseType":"subscriber","technologies":["Terraform","Bash","Go"],"compliance":[],"tags":[""]},"serviceCategoryName":"Client VPN access","fileName":"README.md","filePath":"/examples/packer/README.md","title":"Repo Browser: OpenVPN","description":"Browse the repos in the Gruntwork Infrastructure as Code Library."}