{"id":65051,"date":"2022-06-13T09:00:33","date_gmt":"2022-06-13T09:00:33","guid":{"rendered":"https:\/\/www.cryptocabaret.com\/?p=65051"},"modified":"2022-06-13T09:00:33","modified_gmt":"2022-06-13T09:00:33","slug":"use-terraform-to-manage-truenas","status":"publish","type":"post","link":"https:\/\/www.cryptocabaret.com\/?p=65051","title":{"rendered":"Use Terraform to manage TrueNAS"},"content":{"rendered":"<p><span class=\"field field--name-title field--type-string field--label-hidden\">Use Terraform to manage TrueNAS<\/span><br \/>\n<span class=\"field field--name-uid field--type-entity-reference field--label-hidden\"><a title=\"View user profile.\" href=\"https:\/\/opensource.com\/users\/alanfdoss\" class=\"username\">Alan Formy-Duval<\/a><\/span><br \/>\n<span class=\"field field--name-created field--type-created field--label-hidden\">Mon, 06\/13\/2022 &#8211; 03:00<\/span><\/p>\n<div data-drupal-selector=\"rate-node-70059\" class=\"rate-widget-thumbs-up\" title=\"Register or Login to like.\">\n<div class=\"rate-thumbs-up-btn-up vote-pending\"><a href=\"https:\/\/opensource.com\/user\/register\">Register<\/a> or <a href=\"https:\/\/opensource.com\/user\/login?current=\/rss.xml\">Login<\/a> to like<\/div>\n<div class=\"rate-score\"><a href=\"https:\/\/opensource.com\/user\/register\">Register<\/a> or <a href=\"https:\/\/opensource.com\/user\/login?current=\/rss.xml\">Login<\/a> to like<\/div>\n<\/div>\n<div class=\"clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item\">\n<p>Sometimes combining different open source projects can have benefits. The synergy of using Terraform with TrueNAS is a perfect example.<\/p>\n<p>TrueNAS is an OpenBSD-based operating system that provides network-attached storage (NAS) and network services. One of its main strengths is leveraging the ZFS file system, which is known for enterprise-level reliability and fault tolerance. Terraform is a provisioning and deployment tool embodying the concept of infrastructure as code.<\/p>\n<h2><b>TrueNAS<\/b><\/h2>\n<p>TrueNAS has a very nice web user interface (UI) for its management and an application programming interface (API). Terraform can be integrated with the API to provide configuration management of your NAS, as I&#8217;ll demonstrate below.<\/p>\n<p>To begin, I used Virtual Machine Manager to configure a virtual machine and then installed the latest version, TrueNAS 13.0. The only necessary input was to enter the root password. Once it reboots, the main menu appears. You will also see the HTTP management address. You can access this address from your local web browser.<\/p>\n<article class=\"align-center media media--type-image media--view-mode-default\">\n<div class=\"field field--name-field-media-image field--type-image field--label-hidden field__item\">  <img decoding=\"async\" src=\"https:\/\/www.cryptocabaret.com\/wp-content\/uploads\/2022\/06\/TrueNAS_console.png\" width=\"600\" height=\"342\" alt=\"Virtual machine console setup \" loading=\"lazy\"><\/div>\n<div class=\"field field--name-field-caption field--type-text-long field--label-hidden caption field__item\"><span class=\"caption__byline\">Image by: <\/span><\/p>\n<p>(Alan Formy-Duval, CC BY-SA 4.0)<\/p>\n<\/div>\n<\/article>\n<h2>Terraform<\/h2>\n<p>Terraform needs to be installed where it can access the TrueNAS management URL. I am taking advantage of <i>tfenv<\/i>, a tool for managing Terraform versions.<\/p>\n<pre>\n<code>$ tfenv list-remote\n$ tfenv install 1.2.0\n$ tfenv use 1.2.0\n$ terraform -version\nTerraform v1.2.0\non linux_amd64<\/code><\/pre>\n<p>Next, create a working directory, such as <code>~\/code\/terraform\/truenas<\/code>, to contain the configuration files associated with your TrueNAS instance.<\/p>\n<pre>\n<div class=\"geshifilter\"><div class=\"bash geshifilter-bash\">$ <span class=\"kw2\">mkdir<\/span> ~<span class=\"sy0\">\/<\/span>code<span class=\"sy0\">\/<\/span>terraform<span class=\"sy0\">\/<\/span>truenas<br>\n$ <span class=\"kw3\">cd<\/span> ~<span class=\"sy0\">\/<\/span>code<span class=\"sy0\">\/<\/span>terraform<span class=\"sy0\">\/<\/span>truenas<\/div><\/div><\/pre>\n<p>Create the initial terraform configuration file and add the necessary directives to define the TrueNAS provider.<\/p>\n<pre>\n<span class=\"geshifilter\"><code class=\"bash geshifilter-bash\"><span class=\"co4\">$ <\/span><span class=\"kw2\">vi<\/span> main.tf<\/code><\/span><\/pre>\n<p>The provider will look like this, where the address and API key for your TrueNAS instance will need to be correctly specified.<\/p>\n<pre>\n<div class=\"geshifilter\"><div class=\"bash geshifilter-bash\">$ <span class=\"kw2\">cat<\/span> main.tf<br><br><br>\nterraform <span class=\"br0\">{<\/span><br>\n\u00a0 required_providers <span class=\"br0\">{<\/span><br>\n\u00a0 \u00a0 truenas = <span class=\"br0\">{<\/span><br>\n\u00a0 \u00a0 \u00a0 <span class=\"kw3\">source<\/span> = <span class=\"st0\">\"dariusbakunas\/truenas\"<\/span><br>\n\u00a0 \u00a0 \u00a0 version = <span class=\"st0\">\"0.9.0\"<\/span><br>\n\u00a0 \u00a0 <span class=\"br0\">}<\/span><br>\n\u00a0 <span class=\"br0\">}<\/span><br><span class=\"br0\">}<\/span><br><br>\nprovider <span class=\"st0\">\"truenas\"<\/span> <span class=\"br0\">{<\/span><br>\n\u00a0 api_key = <span class=\"st0\">\"1-61pQpp3WyfYwg4dHToTHcOt7QQzVrMtZnkJAe9mmA0Z2w5MJsDB7Bng5ofZ3bbyn\"<\/span><br>\n\u00a0 base_url = <span class=\"st0\">\"http:\/\/192.168.122.139\/api\/v2.0\"<\/span><br><span class=\"br0\">}<\/span><\/div><\/div><\/pre>\n<p>The TrueNAS API key is created in the Web UI. Log in and click the small gear in the upper right-hand corner.<\/p>\n<article class=\"align-center media media--type-image media--view-mode-default\">\n<div class=\"field field--name-field-media-image field--type-image field--label-hidden field__item\">  <img decoding=\"async\" src=\"https:\/\/www.cryptocabaret.com\/wp-content\/uploads\/2022\/06\/TrueNAS_APIkey.png\" width=\"406\" height=\"245\" alt=\"A pulldown menu from settings shows options including the desired choice, API Keys\" loading=\"lazy\"><\/div>\n<div class=\"field field--name-field-caption field--type-text-long field--label-hidden caption field__item\"><span class=\"caption__byline\">Image by: <\/span><\/p>\n<p>(Alan Formy-Duval, CC BY-SA 4.0)<\/p>\n<\/div>\n<\/article>\n<p>This UI section enables you to create the API key. Once generated, copy it to the <code>main.tf<\/code> file.<\/p>\n<h2>Initialize<\/h2>\n<p>In your TrueNAS Terraform directory, you have the <code>main.tf<\/code> file. The first step is to initialize using the command <code>terraform init<\/code>, which should generate the following result:<\/p>\n<pre>\n<div class=\"geshifilter\"><div class=\"bash geshifilter-bash\">Initializing the backend...<br><br>\nInitializing provider plugins...<br>\n- Finding dariusbakunas<span class=\"sy0\">\/<\/span>truenas versions matching <span class=\"st0\">\"0.9.0\"<\/span>...<br>\n- Installing dariusbakunas<span class=\"sy0\">\/<\/span>truenas v0.9.0...<br>\n- Installed dariusbakunas<span class=\"sy0\">\/<\/span>truenas v0.9.0 <span class=\"br0\">(<\/span>self-signed, key ID E44AF1CA58555E96<span class=\"br0\">)<\/span><br><br>\nPartner and community providers are signed by their developers.<br>\nIf you<span class=\"st_h\">'d like to know more about provider signing, you can read about it here:<br>\nhttps:\/\/www.terraform.io\/docs\/cli\/plugins\/signing.html<br><br>\nTerraform has created a lock file .terraform.lock.hcl to record the provider<br>\nselections it made above. Include this file in your version control repository<br>\nso that Terraform can guarantee to make the same selections by default when<br>\nyou run \"terraform init\" in the future.<br><br>\nTerraform has been successfully initialized!<br><br>\nYou may now begin working with Terraform. Try running \"terraform plan\" to see<br>\nany changes that are required for your infrastructure. All Terraform commands<br>\nshould now work.<br><br>\nIf you ever set or change modules or backend configuration for Terraform,<br>\nrerun this command to reinitialize your working directory. If you forget, other commands will detect it and remind you to do so if necessary.<\/span><\/div><\/div><\/pre>\n<p>A successful initialization means you&#8217;re ready to start adding resources. Any TrueNAS item, such as a storage pool, network file system (NFS) share, or cron job, is a resource.<\/p>\n<\/p>\n<div class=\"embedded-resource-list callout-float-right\">\n<div class=\"field field--name-title field--type-string field--label-hidden field__item\">Linux Containers<\/div>\n<div class=\"field field--name-links field--type-link field--label-hidden field__items\">\n<div class=\"field__item\"><a href=\"https:\/\/www.redhat.com\/en\/topics\/containers\/whats-a-linux-container?intcmp=70160000000h1s6AAA\">What are Linux containers?<\/a><\/div>\n<div class=\"field__item\"><a href=\"https:\/\/www.redhat.com\/en\/topics\/containers\/what-is-kubernetes?intcmp=70160000000h1s6AAA\">What is Kubernetes?<\/a><\/div>\n<div class=\"field__item\"><a href=\"https:\/\/www.redhat.com\/en\/services\/training\/do080-deploying-containerized-applications-technical-overview?intcmp=70160000000h1s6AAA\">Free online course: Deploy containerized applications<\/a><\/div>\n<div class=\"field__item\"><a href=\"https:\/\/opensource.com\/downloads\/kubernetes-sysadmin?intcmp=70160000000h1s6AAA\">eBook: A guide to Kubernetes for SREs and sysadmins<\/a><\/div>\n<div class=\"field__item\"><a href=\"https:\/\/www.redhat.com\/en\/services\/training\/rh065-running-containers-red-hat-technical-overview?intcmp=70160000000h1s6AAA\">Free online course: Running containers with Red Hat technical overview<\/a><\/div>\n<div class=\"field__item\"><a href=\"https:\/\/www.redhat.com\/en\/engage\/kubernetes-containers-storage-s-201911201051?intcmp=70160000000h1s6AAA\">eBook: Storage patterns for Kubernetes<\/a><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<h2>Add a ZFS dataset<\/h2>\n<p>The following example resource directive defines a ZFS dataset. For my example, I will add it to the <code>main.tf <\/code>file.<\/p>\n<pre>\n<div class=\"geshifilter\"><div class=\"bash geshifilter-bash\">resource <span class=\"st0\">\"truenas_dataset\"<\/span> <span class=\"st0\">\"pictures\"<\/span> <span class=\"br0\">{<\/span><br>\n\u00a0 pool = <span class=\"st0\">\"storage-pool\"<\/span><br>\n\u00a0 name = <span class=\"st0\">\"pictures\"<\/span><br>\n\u00a0 comments = <span class=\"st0\">\"Terraform created dataset for Pictures\"<\/span><br>\n\u00a0<span class=\"br0\">}<\/span><\/div><\/div><\/pre>\n<p>Run the command <code>terraform validate<\/code> to check the configuration.<\/p>\n<pre>\n<span class=\"geshifilter\"><code class=\"bash geshifilter-bash\">Success<span class=\"sy0\">!<\/span> The configuration is valid.<\/code><\/span><\/pre>\n<p>Running <code>terraform plan<\/code> will describe the actions that Terraform will perform. Now, add the new dataset with <code>terraform apply<\/code>.<\/p>\n<pre>\n<div class=\"geshifilter\"><div class=\"bash geshifilter-bash\">Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:<br>\n\u00a0 + create<br><br>\nTerraform will perform the following actions:<br><br>\n\u00a0 <span class=\"co0\"># truenas_dataset.pictures will be created<\/span><br>\n\u00a0 + resource <span class=\"st0\">\"truenas_dataset\"<\/span> <span class=\"st0\">\"pictures\"<\/span> <span class=\"br0\">{<\/span><br>\n\u00a0 \u00a0 \u00a0 + acl_mode \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 = <span class=\"br0\">(<\/span>known after apply<span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 \u00a0 + acl_type \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 = <span class=\"br0\">(<\/span>known after apply<span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 \u00a0 + atime \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0= <span class=\"br0\">(<\/span>known after apply<span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 \u00a0 + case_sensitivity \u00a0 \u00a0 = <span class=\"br0\">(<\/span>known after apply<span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 \u00a0 + comments \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 = <span class=\"st0\">\"Terraform created dataset for Pictures\"<\/span><br>\n\u00a0 \u00a0 \u00a0 + compression \u00a0 \u00a0 \u00a0 \u00a0 \u00a0= <span class=\"br0\">(<\/span>known after apply<span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 \u00a0 + copies \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 = <span class=\"br0\">(<\/span>known after apply<span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 \u00a0 + dataset_id \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 = <span class=\"br0\">(<\/span>known after apply<span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 \u00a0 + deduplication \u00a0 \u00a0 \u00a0 \u00a0= <span class=\"br0\">(<\/span>known after apply<span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 \u00a0 + encrypted \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0= <span class=\"br0\">(<\/span>known after apply<span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 \u00a0 + encryption_algorithm = <span class=\"br0\">(<\/span>known after apply<span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 \u00a0 + encryption_key \u00a0 \u00a0 \u00a0 = <span class=\"br0\">(<\/span>sensitive value<span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 \u00a0 + <span class=\"kw3\">exec<\/span> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 = <span class=\"br0\">(<\/span>known after apply<span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 \u00a0 + generate_key \u00a0 \u00a0 \u00a0 \u00a0 = <span class=\"br0\">(<\/span>known after apply<span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 \u00a0 + <span class=\"kw2\">id<\/span> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 = <span class=\"br0\">(<\/span>known after apply<span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 \u00a0 + managed_by \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 = <span class=\"br0\">(<\/span>known after apply<span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 \u00a0 + mount_point \u00a0 \u00a0 \u00a0 \u00a0 \u00a0= <span class=\"br0\">(<\/span>known after apply<span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 \u00a0 + name \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 = <span class=\"st0\">\"pictures\"<\/span><br>\n\u00a0 \u00a0 \u00a0 + pbkdf2iters \u00a0 \u00a0 \u00a0 \u00a0 \u00a0= <span class=\"br0\">(<\/span>known after apply<span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 \u00a0 + pool \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 = <span class=\"st0\">\"storage-pool\"<\/span><br>\n\u00a0 \u00a0 \u00a0 + quota_bytes \u00a0 \u00a0 \u00a0 \u00a0 \u00a0= <span class=\"br0\">(<\/span>known after apply<span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 \u00a0 + quota_critical \u00a0 \u00a0 \u00a0 = <span class=\"br0\">(<\/span>known after apply<span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 \u00a0 + quota_warning \u00a0 \u00a0 \u00a0 \u00a0= <span class=\"br0\">(<\/span>known after apply<span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 \u00a0 + <span class=\"kw3\">readonly<\/span> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 = <span class=\"br0\">(<\/span>known after apply<span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 \u00a0 + record_size \u00a0 \u00a0 \u00a0 \u00a0 \u00a0= <span class=\"br0\">(<\/span>known after apply<span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 \u00a0 + ref_quota_bytes \u00a0 \u00a0 \u00a0= <span class=\"br0\">(<\/span>known after apply<span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 \u00a0 + ref_quota_critical \u00a0 = <span class=\"br0\">(<\/span>known after apply<span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 \u00a0 + ref_quota_warning \u00a0 \u00a0= <span class=\"br0\">(<\/span>known after apply<span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 \u00a0 + share_type \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 = <span class=\"br0\">(<\/span>known after apply<span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 \u00a0 + snap_dir \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 = <span class=\"br0\">(<\/span>known after apply<span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 \u00a0 + <span class=\"kw2\">sync<\/span> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 = <span class=\"br0\">(<\/span>known after apply<span class=\"br0\">)<\/span><br>\n\u00a0 \u00a0 <span class=\"br0\">}<\/span><br><br>\nPlan: <span class=\"nu0\">1<\/span> to add, <span class=\"nu0\">0<\/span> to change, <span class=\"nu0\">0<\/span> to destroy.<br><br>\nDo you want to perform these actions?<br>\n\u00a0 Terraform will perform the actions described above.<br>\n\u00a0 Only <span class=\"st_h\">'yes'<\/span> will be accepted to approve.<br><br>\n\u00a0 Enter a value:<\/div><\/div><\/pre>\n<p>Type <code>yes<\/code> to confirm and hit <b>Enter<\/b>.<\/p>\n<pre>\n<div class=\"geshifilter\"><div class=\"bash geshifilter-bash\">truenas_dataset.pictures: Creating...<br>\ntruenas_dataset.pictures: Creation <span class=\"kw3\">complete<\/span> after 0s <span class=\"br0\">[<\/span><span class=\"re2\">id<\/span>=storage-pool<span class=\"sy0\">\/<\/span>pictures<span class=\"br0\">]<\/span><br><br>\nApply <span class=\"kw3\">complete<\/span><span class=\"sy0\">!<\/span> Resources: <span class=\"nu0\">1<\/span> added, <span class=\"nu0\">0<\/span> changed, <span class=\"nu0\">0<\/span> destroyed.<\/div><\/div><\/pre>\n<p>That&#8217;s it. You can check for this new dataset in the TrueNAS Web UI.<\/p>\n<article class=\"align-center media media--type-image media--view-mode-default\">\n<div class=\"field field--name-field-media-image field--type-image field--label-hidden field__item\">  <img decoding=\"async\" src=\"https:\/\/www.cryptocabaret.com\/wp-content\/uploads\/2022\/06\/TrueNAS_Dataset.png\" width=\"600\" height=\"103\" alt=\"The pictures dataset is shown in the storage pool list, with the comment \" terraform create dataset for pictures loading=\"lazy\"><\/div>\n<div class=\"field field--name-field-caption field--type-text-long field--label-hidden caption field__item\"><span class=\"caption__byline\">Image by: <\/span><\/p>\n<p>(Alan Formy-Duval, CC BY-SA 4.0)<\/p>\n<\/div>\n<\/article>\n<h2>Do more with TrueNAS and Terraform<\/h2>\n<p>The TrueNAS provider for Terraform allows you to manage many more aspects of your TrueNAS device. For instance, you could share this new dataset as an NFS or server message block (SMB) share. You can also create additional datasets, cron jobs, and zvols.<\/p>\n<\/div>\n<div class=\"clearfix text-formatted field field--name-field-article-subhead field--type-text-long field--label-hidden field__item\">\n<p>Get more out of TrueNAS when you integrate Terraform for configuration management.<\/p>\n<\/div>\n<div class=\"field field--name-field-lead-image field--type-entity-reference field--label-hidden field__item\">\n<article class=\"media media--type-image media--view-mode-caption\">\n<div class=\"field field--name-field-media-image field--type-image field--label-hidden field__item\">  <img decoding=\"async\" src=\"https:\/\/www.cryptocabaret.com\/wp-content\/uploads\/2022\/06\/puzzle_computer_solve_fix_tool.png\" width=\"1041\" height=\"584\" alt=\"Puzzle pieces coming together to form a computer screen\" title=\"Puzzle pieces coming together to form a computer screen\" loading=\"lazy\"><\/div>\n<div class=\"field field--name-field-caption field--type-text-long field--label-hidden caption field__item\"><span class=\"caption__byline\">Image by: <\/span><\/p>\n<p>Opensource.com<\/p>\n<\/div>\n<\/article>\n<\/div>\n<div class=\"field field--name-field-tags field--type-entity-reference field--label-hidden field__items\">\n<div class=\"field__item\"><a href=\"https:\/\/opensource.com\/tags\/containers\" hreflang=\"en\">Containers<\/a><\/div>\n<div class=\"field__item\"><a href=\"https:\/\/opensource.com\/tags\/linux\" hreflang=\"en\">Linux<\/a><\/div>\n<\/p><\/div>\n<div class=\"hidden field field--name-field-listicle-title field--type-string field--label-hidden field__item\">What to read next<\/div>\n<div class=\"field field--name-field-default-license field--type-list-string field--label-hidden field__item\"><a rel=\"license\" href=\"http:\/\/creativecommons.org\/licenses\/by-sa\/4.0\/\"><br \/>\n        <img decoding=\"async\" alt=\"Creative Commons License\" src=\"https:\/\/www.cryptocabaret.com\/wp-content\/uploads\/2022\/06\/cc-by-sa--14.png\" title=\"This work is licensed under a Creative Commons Attribution-Share Alike 4.0 International License.\"><\/a>This work is licensed under a Creative Commons Attribution-Share Alike 4.0 International License.<\/div>\n<section class=\"field field--name-field-comments field--type-comment field--label-hidden comment-wrapper\">\n<div class=\"comments__count\">\n<div class=\"login\"><a href=\"https:\/\/opensource.com\/user\/register?absolute=1\">Register<\/a> or <a href=\"https:\/\/opensource.com\/user\/login?current=\/rss.xml&amp;absolute=1\">Login<\/a> to post a comment.<\/div>\n<\/p><\/div>\n<\/section>\n<p class=\"wpematico_credit\"><small>Powered by <a href=\"http:\/\/www.wpematico.com\" target=\"_blank\" rel=\"noopener\">WPeMatico<\/a><\/small><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Use Terraform to manage TrueNAS Alan Formy-Duval Mon, 06\/13\/2022 &#8211; 03:00 Register or Login to like Register or Login to like Sometimes combining different open source projects can have benefits. The synergy of using Terraform with TrueNAS is a perfect example. TrueNAS is an OpenBSD-based operating system that provides network-attached storage (NAS) and network services. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":65052,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[307],"tags":[],"class_list":["post-65051","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-open-source"],"_links":{"self":[{"href":"https:\/\/www.cryptocabaret.com\/index.php?rest_route=\/wp\/v2\/posts\/65051","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.cryptocabaret.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.cryptocabaret.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.cryptocabaret.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.cryptocabaret.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=65051"}],"version-history":[{"count":0,"href":"https:\/\/www.cryptocabaret.com\/index.php?rest_route=\/wp\/v2\/posts\/65051\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.cryptocabaret.com\/index.php?rest_route=\/wp\/v2\/media\/65052"}],"wp:attachment":[{"href":"https:\/\/www.cryptocabaret.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=65051"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.cryptocabaret.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=65051"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.cryptocabaret.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=65051"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}