techcommunity.microsoft.com Open in urlscan Pro
2a02:26f0:fb:593::207e  Public Scan

Submitted URL: https://comm.microsoft.com/PoliteMail257/default.aspx?page=p5bs0tjZeUWqZ-pHtHKBuA&ref_id=lV0dfqeODEeQp1nMY0sf3Q
Effective URL: https://techcommunity.microsoft.com/t5/itops-talk-blog/infrastructure-as-code-iac-comparing-the-tools/ba-p/3205045
Submission: On March 09 via api from US — Scanned from DE

Form analysis 2 forms found in the DOM

Name: form_315e3c4ea46fbdPOST https://techcommunity.microsoft.com/t5/blogs/v2/blogarticlepage.searchformv32.form.form

<form enctype="multipart/form-data" class="lia-form lia-form-inline SearchForm" action="https://techcommunity.microsoft.com/t5/blogs/v2/blogarticlepage.searchformv32.form.form" method="post" id="form_315e3c4ea46fbd" name="form_315e3c4ea46fbd">
  <div class="t-invisible"><input value="blog-id/ITOpsTalkBlog/article-id/2103" name="t:ac" type="hidden"><input value="search/contributions/page" name="t:cp" type="hidden"><input
      value="1mgxA_X64S6drMgxxsw-DOPkm-qPnISJ-EPbPfAFFgHNEu1vS-wt3w-fqnzqXifYI6PjRp1UccRrnKwj6B8g4kk-JJU_fn25fQd1GyzEScXDf7IQedw-ZOSJfndkLkryI2CWhcOLoUVrX9Jenh1jXXlNjQhIHd9jkO_JI-lfwTQWO8BlVAABNUg9ABNVeE5AzJL2LhW43m7jJxIB-GgH17wOn6mBKYCZbhdfYc8hCSQtJYK7xe0CUEfiSvFMnE8cUa1XSDkTh8UBp-KpZu5wgQiz433utDliCD6LcxD7QSasXycl67tw7FHxi5ashj-Xo5iUadwIN6Dwc3M6NNRzrNPeM-oZFnZwQhajcfFnJtWh0HD60PrU1jMtfspN7TABJelGxWJ_w96kiMoBr4qbEQUL7_PSGunM5khfCq268eMf0XEdgqpi7DOpfWjCOcQDwghK2TpjWVX-2MAzyvf8_U0uspekzEzGu9KJzrlLdGKwQZiCrqN4H8_YWb97MrcjRDvQnjNqjAIoLd3010_RCwRYYxIcxSMutiyevvgWmrX0dB3RkR4hza2BKI84pUU2jWostat4XABWnJVSr-f8JXAG2v1EAxW2cpav_Wy15rKJafOh4VTLnBtdDDeLAs9ALtFue1ShjQ-4ok8KlZpMl7U9lQPk-E1GywK9XG9tTa3G6oEQLgQoYlIW7-Tw2F0tapMREaZSdc4ZFcNkSb6QLXBfk1yWSijQaY1YJMU7uX3l3jKkVa4a9bMg8icV-vVtRrFRdiq8CeePTwWpuZo6vD54mIqn8NE853vR0cOm5obCsJTzL_jru0caHDMyBJIARrZpLJMjUa4ie21kra9Yb957myyCekmga8RAc2SzCxy5PjsBej_luJbHOVYjYVNp9z5R2mlEf8qHEWdjW6gvj_XfVP8fmOUEXISvFrDgib5QQcIlDbVysYsJCUks8ja1eL7JAfMlMKUAZ3YQ79gYlsKIN3NdUpMIlVemB2cdqJAo2HLF0JGAhntM88nhPBYux0Yiec7UGYzx2oquWJSCWv5cK91IJfhm3ImfX8LnHqA7zZzqjAa0VyU6dpgMkZ3RxRO-OgidukYm7ijwqAJAR5GYlLcUCX1HOMGHB-pIyeB_Kxti6l7_-WXgbV8tdSEGi3zps-2YYjfq_ItMhltssiB7BhbUFJfnWnBcY5fXIuidIEcmfRu7DDbuhs1PXTRBoMxLolhDM-aO7tNP74cYyK2yVAxmzDlfdHvWsWlodqB17RkDJh3gzqa2tS01yTJ0P9w_SM7zpela5ccAo6cP7Q.."
      name="lia-form-context" type="hidden"><input value="BlogArticlePage:blog-id/ITOpsTalkBlog/article-id/2103:searchformv32.form:" name="liaFormContentKey" type="hidden"><input
      value="dzOv4c3RXyNwwkfp7lwVMGy6yiU=:H4sIAAAAAAAAALWRQUrDQBSGn4WuigiiN9DtRNRuVIQiKELVYHAtM+lrGk0ycWbSxI1H6QnES3Thzjt4ALeuXDiTRKlVMJG4CvO/8H/fm7l/gXa6D3sSqXBHlssjJXyWKJ9H0rKphzvFZMhFON7aJDJhoa/Kj/kbMyUFdLnwCI2pO0KiaIxSidsucbnAwGeEUYmkx3RIXXXoYzBYc1Al8frFtPO8+vjWgoU+dHI2D05piAqW+1d0TK2ARp7laKXI281iBYsF+KAANyDeqytuC+6ilI7pkVLTpg+D7eHr5KkFkMXpGZxUNQp1jU7L0JT/EMkbuAPQ91GOnHyUqzTOMqh2eg521VZ1zWotsfJ9icuN/wAWmxzDUdXiRKKYrZw7fyywZPLZJ2gOUVs54urLLcydP5VN/kflXxC58jtO8j6qQQQAAA=="
      name="t:formdata" type="hidden"></div>
  <div class="lia-inline-ajax-feedback">
    <div class="AjaxFeedback" id="feedback_315e3c4ea46fbd"></div>
  </div>
  <input value="k6xrJiiozVeT9kcGeCJFIdXaztkEVKJQ6WHdfd9WB5I." name="lia-action-token" type="hidden">
  <input value="form_315e3c4ea46fbd" id="form_UIDform_315e3c4ea46fbd" name="form_UID" type="hidden">
  <input value="" id="form_instance_keyform_315e3c4ea46fbd" name="form_instance_key" type="hidden">
  <span class="lia-search-input-wrapper">
    <span class="lia-search-input-field">
      <span class="lia-button-wrapper lia-button-wrapper-secondary lia-button-wrapper-searchForm-action"><input value="searchForm" name="submitContextX" type="hidden"><input class="lia-button lia-button-secondary lia-button-searchForm-action"
          value="Search" id="submitContext_315e3c4ea46fbd" name="submitContext" type="submit"></span>
      <input placeholder="Search the community" aria-label="Search" title="Search" class="lia-form-type-text lia-autocomplete-input search-input lia-search-input-message" value="" id="messageSearchField_315e3c4ea46fbd_0" name="messageSearchField"
        type="text" aria-autocomplete="both" autocomplete="off">
      <div class="lia-autocomplete-container" style="display: none; position: absolute;">
        <div class="lia-autocomplete-header">Enter a search word</div>
        <div class="lia-autocomplete-content">
          <ul></ul>
        </div>
        <div class="lia-autocomplete-footer">
          <a class="lia-link-navigation lia-autocomplete-toggle-off lia-link-ticket-post-action lia-component-search-action-disable-auto-complete" data-lia-action-token="WtNMxnoiJ7yFuG73Ctsc2kUtPHeWUF52qFLKo83UYLo." rel="nofollow" id="disableAutoComplete_315e3c4ecd22ee" href="https://techcommunity.microsoft.com/t5/blogs/v2/blogarticlepage.disableautocomplete:disableautocomplete?t:ac=blog-id/ITOpsTalkBlog/article-id/2103&amp;t:cp=action/contributions/searchactions">Turn off suggestions</a>
        </div>
      </div>
      <input placeholder="Search the community" aria-label="Search" title="Search" class="lia-form-type-text lia-autocomplete-input search-input lia-search-input-tkb-article lia-js-hidden" value="" id="messageSearchField_315e3c4ea46fbd_1"
        name="messageSearchField_0" type="text" aria-autocomplete="both" autocomplete="off">
      <div class="lia-autocomplete-container" style="display: none; position: absolute;">
        <div class="lia-autocomplete-header">Enter a search word</div>
        <div class="lia-autocomplete-content">
          <ul></ul>
        </div>
        <div class="lia-autocomplete-footer">
          <a class="lia-link-navigation lia-autocomplete-toggle-off lia-link-ticket-post-action lia-component-search-action-disable-auto-complete" data-lia-action-token="D3CWVS6wcwpoRFJ8lLx5YQ6Yh7dIAmjg89tCwkYiyyk." rel="nofollow" id="disableAutoComplete_315e3c4f49052f" href="https://techcommunity.microsoft.com/t5/blogs/v2/blogarticlepage.disableautocomplete:disableautocomplete?t:ac=blog-id/ITOpsTalkBlog/article-id/2103&amp;t:cp=action/contributions/searchactions">Turn off suggestions</a>
        </div>
      </div>
      <input placeholder="Search all content" ng-non-bindable="" title="Enter a user name or rank" class="lia-form-type-text UserSearchField lia-search-input-user search-input lia-js-hidden lia-autocomplete-input"
        aria-label="Enter a user name or rank" value="" id="userSearchField_315e3c4ea46fbd" name="userSearchField" type="text" aria-autocomplete="both" autocomplete="off">
      <div class="lia-autocomplete-container" style="display: none; position: absolute;">
        <div class="lia-autocomplete-header">Enter a user name or rank</div>
        <div class="lia-autocomplete-content">
          <ul></ul>
        </div>
        <div class="lia-autocomplete-footer">
          <a class="lia-link-navigation lia-autocomplete-toggle-off lia-link-ticket-post-action lia-component-search-action-disable-auto-complete" data-lia-action-token="wI-omkT0dZWHGVYUS7fiTA2cxOWgyZwT8JUOk4eInXo." rel="nofollow" id="disableAutoComplete_315e3c4f775855" href="https://techcommunity.microsoft.com/t5/blogs/v2/blogarticlepage.disableautocomplete:disableautocomplete?t:ac=blog-id/ITOpsTalkBlog/article-id/2103&amp;t:cp=action/contributions/searchactions">Turn off suggestions</a>
        </div>
      </div>
      <input title="Enter a search word" class="lia-form-type-text NoteSearchField lia-search-input-note search-input lia-js-hidden lia-autocomplete-input" aria-label="Enter a search word" value="" id="noteSearchField_315e3c4ea46fbd_0"
        name="noteSearchField" type="text" aria-autocomplete="both" autocomplete="off">
      <div class="lia-autocomplete-container" style="display: none; position: absolute;">
        <div class="lia-autocomplete-header">Enter a search word</div>
        <div class="lia-autocomplete-content">
          <ul></ul>
        </div>
        <div class="lia-autocomplete-footer">
          <a class="lia-link-navigation lia-autocomplete-toggle-off lia-link-ticket-post-action lia-component-search-action-disable-auto-complete" data-lia-action-token="rdabZniyKWvZ1CpJ2SW9vs1Ty7Es5MwVaE4HI46Ee-g." rel="nofollow" id="disableAutoComplete_315e3c4fa4942a" href="https://techcommunity.microsoft.com/t5/blogs/v2/blogarticlepage.disableautocomplete:disableautocomplete?t:ac=blog-id/ITOpsTalkBlog/article-id/2103&amp;t:cp=action/contributions/searchactions">Turn off suggestions</a>
        </div>
      </div>
      <input class="lia-as-search-action-id" name="as-search-action-id" type="hidden">
    </span>
  </span>
  <span class="lia-cancel-search" tabindex="0">cancel</span>
</form>

Name: formPOST https://techcommunity.microsoft.com/t5/blogs/v2/blogarticlepage.searchformv32.form.form

<form enctype="multipart/form-data" class="lia-form lia-form-inline SearchForm" action="https://techcommunity.microsoft.com/t5/blogs/v2/blogarticlepage.searchformv32.form.form" method="post" id="form" name="form">
  <div class="t-invisible"><input value="blog-id/ITOpsTalkBlog/article-id/2103" name="t:ac" type="hidden"><input value="search/contributions/page" name="t:cp" type="hidden"><input
      value="eA8_FlUkSOnUJ3UeHsfiVK7J_MLmJ3FBf-C6YDeafx5hE5QaOgIxLmb_tB6FFMwNF9ybZLxB0Luk4-ugbjYSUufuBoEFg_jbx_A_wk2vOhRg8kQ5e6Z0Z_0aizNSCZKUJHcrijj-rtBli3L0CGMfQ6BwD-9bgtZgg7JVzkeDSW0J035e3oUNltXEWlJCGPPgMcPeu7LFPnggkUEkMCITw2sj7IPg9e21v-ECEIItHiULntGzXCEWAgmoNUde4jVaZ_PvKhCfwbBOBlwymRla8w8GEKxj8tWCHjKNVKeuGzK2BqUPKZG_laI0uONbboVUzemK6oJ9oDxuGpWvS47Jyp-6hNz1Xe97Y5afgVNQ1UTi5bsVfz-ZOWZRB2G2LrwGjnEKWa73MmlN4DDQz-mP9zBUQPK5UTYa9fGB5fX1JSbSciFkIkAlwPfE8_reuhKTOmCByCpxYfFUxH7LltJ7rj4U7BMnFUjKvc6cknvLlssycXGa25tJ_i_AlnI6vV85KjNebyJa6FLEiVOFKhavPkC--wJeeD7a-51TvZprjvddyAM0R55NZqpNgiQ86xuvpoJ7nD7dQ1tR39wapU9qkjC5aPwxgBq1Bn4RxG9PC6gh8GFLOAsqdI-eyqvWyFZE9pg1OD5J5ytqRVUeTsbiMZ5zwywldvhNh5pXgdJk3RTo3Fp9oPLCSyN2VqA44e4CANaeIqqEgkEBFJ_oVD6YPod2W18_a2M7Bz0jaknIvVIWtt5zdgNCdzMuXa3MRxh6ESuP6jtW7qv3i8YSKGrzSjjndnQyRlFQcTpRxlLCLs_lMoITVkM0gji3u-WgRJdol8OETlLyP15aL-J9tRmQkxDQ9lbcDyfspHTTUtC1mu2oeip2udGSj-pv9TjISoL5BB1DFPNwhWPF_QJR8cYIIGEJybXcVz9tEJMrU1Tc7tQbVNtYurZD6pmw-tkYVCVDKTh16rhMglC6DzjRXwx6b3rasOPmLEgKBjOYJsykNBaJhUIC_xReBjYM4081fgTqxxEr-Kr9hc5TK1oVNEE0NsmycEQx-H6Vlt9OzKInm5JMuMqP9AfYPoPwj0EAGKw8ynZG8YOnm_kpOUuKuyoSM6CHz4Zkp4nu9LysJ1GFc_ZdL3cEFqE6tZdEBav232n-MB_E14TSghEljAJXEHSgbkcE7o4vCOKpWeAA-BWmcuY."
      name="lia-form-context" type="hidden"><input value="BlogArticlePage:blog-id/ITOpsTalkBlog/article-id/2103:searchformv32.form:" name="liaFormContentKey" type="hidden"><input
      value="dzOv4c3RXyNwwkfp7lwVMGy6yiU=:H4sIAAAAAAAAALWRQUrDQBSGn4WuigiiN9DtRNRuVIQiKELVYHAtM+lrGk0ycWbSxI1H6QnES3Thzjt4ALeuXDiTRKlVMJG4CvO/8H/fm7l/gXa6D3sSqXBHlssjJXyWKJ9H0rKphzvFZMhFON7aJDJhoa/Kj/kbMyUFdLnwCI2pO0KiaIxSidsucbnAwGeEUYmkx3RIXXXoYzBYc1Al8frFtPO8+vjWgoU+dHI2D05piAqW+1d0TK2ARp7laKXI281iBYsF+KAANyDeqytuC+6ilI7pkVLTpg+D7eHr5KkFkMXpGZxUNQp1jU7L0JT/EMkbuAPQ91GOnHyUqzTOMqh2eg521VZ1zWotsfJ9icuN/wAWmxzDUdXiRKKYrZw7fyywZPLZJ2gOUVs54urLLcydP5VN/kflXxC58jtO8j6qQQQAAA=="
      name="t:formdata" type="hidden"></div>
  <div class="lia-inline-ajax-feedback">
    <div class="AjaxFeedback" id="feedback"></div>
  </div>
  <input value="3tKXMbXQ9253nY8V2CLrqG1pMa7VRmD8m8APq7xnrJk." name="lia-action-token" type="hidden">
  <input value="form" id="form_UIDform" name="form_UID" type="hidden">
  <input value="" id="form_instance_keyform" name="form_instance_key" type="hidden">
  <span class="lia-search-input-wrapper">
    <span class="lia-search-input-field">
      <span class="lia-button-wrapper lia-button-wrapper-secondary lia-button-wrapper-searchForm-action"><input value="searchForm" name="submitContextX" type="hidden"><input class="lia-button lia-button-secondary lia-button-searchForm-action"
          value="Search" id="submitContext" name="submitContext" type="submit"></span>
      <input placeholder="Search the community" aria-label="Search" title="Search" class="lia-form-type-text lia-autocomplete-input search-input lia-search-input-message" value="" id="messageSearchField_0" name="messageSearchField" type="text"
        aria-autocomplete="both" autocomplete="off">
      <div class="lia-autocomplete-container" style="display: none; position: absolute;">
        <div class="lia-autocomplete-header">Enter a search word</div>
        <div class="lia-autocomplete-content">
          <ul></ul>
        </div>
        <div class="lia-autocomplete-footer">
          <a class="lia-link-navigation lia-autocomplete-toggle-off lia-link-ticket-post-action lia-component-search-action-disable-auto-complete" data-lia-action-token="5F9fWGx4a4V9qHMqv89ZdB_KXigIYb1g0ElEZMXFe6c." rel="nofollow" id="disableAutoComplete_315e3c501860b9" href="https://techcommunity.microsoft.com/t5/blogs/v2/blogarticlepage.disableautocomplete:disableautocomplete?t:ac=blog-id/ITOpsTalkBlog/article-id/2103&amp;t:cp=action/contributions/searchactions">Turn off suggestions</a>
        </div>
      </div>
      <input placeholder="Search the community" aria-label="Search" title="Search" class="lia-form-type-text lia-autocomplete-input search-input lia-search-input-tkb-article lia-js-hidden" value="" id="messageSearchField_1"
        name="messageSearchField_0" type="text" aria-autocomplete="both" autocomplete="off">
      <div class="lia-autocomplete-container" style="display: none; position: absolute;">
        <div class="lia-autocomplete-header">Enter a search word</div>
        <div class="lia-autocomplete-content">
          <ul></ul>
        </div>
        <div class="lia-autocomplete-footer">
          <a class="lia-link-navigation lia-autocomplete-toggle-off lia-link-ticket-post-action lia-component-search-action-disable-auto-complete" data-lia-action-token="YfPpvlI4RL-sfHznEwffGF7PYbf33bzbVdegZjNp4aI." rel="nofollow" id="disableAutoComplete_315e3c504a55a2" href="https://techcommunity.microsoft.com/t5/blogs/v2/blogarticlepage.disableautocomplete:disableautocomplete?t:ac=blog-id/ITOpsTalkBlog/article-id/2103&amp;t:cp=action/contributions/searchactions">Turn off suggestions</a>
        </div>
      </div>
      <input placeholder="Search all content" ng-non-bindable="" title="Enter a user name or rank" class="lia-form-type-text UserSearchField lia-search-input-user search-input lia-js-hidden lia-autocomplete-input"
        aria-label="Enter a user name or rank" value="" id="userSearchField" name="userSearchField" type="text" aria-autocomplete="both" autocomplete="off">
      <div class="lia-autocomplete-container" style="display: none; position: absolute;">
        <div class="lia-autocomplete-header">Enter a user name or rank</div>
        <div class="lia-autocomplete-content">
          <ul></ul>
        </div>
        <div class="lia-autocomplete-footer">
          <a class="lia-link-navigation lia-autocomplete-toggle-off lia-link-ticket-post-action lia-component-search-action-disable-auto-complete" data-lia-action-token="x_K_c9Epode1mIcXpa8Z-qCU62iWfZOSVREh8_3VlgA." rel="nofollow" id="disableAutoComplete_315e3c50720d3e" href="https://techcommunity.microsoft.com/t5/blogs/v2/blogarticlepage.disableautocomplete:disableautocomplete?t:ac=blog-id/ITOpsTalkBlog/article-id/2103&amp;t:cp=action/contributions/searchactions">Turn off suggestions</a>
        </div>
      </div>
      <input title="Enter a search word" class="lia-form-type-text NoteSearchField lia-search-input-note search-input lia-js-hidden lia-autocomplete-input" aria-label="Enter a search word" value="" id="noteSearchField_0" name="noteSearchField"
        type="text" aria-autocomplete="both" autocomplete="off">
      <div class="lia-autocomplete-container" style="display: none; position: absolute;">
        <div class="lia-autocomplete-header">Enter a search word</div>
        <div class="lia-autocomplete-content">
          <ul></ul>
        </div>
        <div class="lia-autocomplete-footer">
          <a class="lia-link-navigation lia-autocomplete-toggle-off lia-link-ticket-post-action lia-component-search-action-disable-auto-complete" data-lia-action-token="DvJ1T-hD2l99TMYGg7IDBxMHHQDx9YeIVLYVLBNrvIs." rel="nofollow" id="disableAutoComplete_315e3c509dc653" href="https://techcommunity.microsoft.com/t5/blogs/v2/blogarticlepage.disableautocomplete:disableautocomplete?t:ac=blog-id/ITOpsTalkBlog/article-id/2103&amp;t:cp=action/contributions/searchactions">Turn off suggestions</a>
        </div>
      </div>
      <input class="lia-as-search-action-id" name="as-search-action-id" type="hidden">
    </span>
  </span>
  <span class="lia-cancel-search">cancel</span>
</form>

Text Content

We use optional cookies to improve your experience on our websites, such as
through social media connections, and to display personalized advertising based
on your online activity. If you reject optional cookies, only cookies necessary
to provide you the services will be used. You may change your selection by
clicking “Manage Cookies” at the bottom of the page. Privacy Statement
Third-Party Cookies

Accept Reject Manage cookies


Skip to main content

Microsoft

Tech Community

Home

Community Hubs

Community Hubs
 * Community Hubs Home
 * Products
 * Special Topics
 * Video Hub

Close


PRODUCTS (69)


SPECIAL TOPICS (42)


VIDEO HUB (843)


MOST ACTIVE HUBS

Microsoft Teams
Excel
Exchange
SharePoint
Windows
Office 365
Security, Compliance and Identity
Windows Server
Microsoft Edge Insider
Azure
Microsoft 365
Azure Databases
Fully managed intelligent database services.
Autonomous Systems
Create and optimise intelligence for industrial control systems.
Yammer
Connect and engage across your organization.


MOST ACTIVE HUBS

ITOps Talk
Education Sector
Microsoft Learn
Microsoft Localization
Microsoft 365 PnP
Healthcare and Life Sciences
Public Sector
Internet of Things (IoT)
Mixed Reality
Enabling Remote Work
Small and Medium Business
Humans of IT
Empowering technologists to achieve more by humanizing tech.
Green Tech
Raise awareness about sustainability in the tech sector
MVP Award Program
Find out more about the Microsoft MVP Award Program.


VIDEO HUB

Azure
Exchange
Microsoft 365
Microsoft 365 Business
Microsoft 365 Enterprise
Microsoft Edge
Microsoft Outlook
Microsoft Teams
Security
SharePoint
Windows
Browse All Community Hubs

Blogs

Blogs

Events

Events
 * Events Home
 * Microsoft Ignite
 * Microsoft Build
 * Community Events

Microsoft Learn

Microsoft Learn
 * Home
 * Community
 * Blog
 * Azure
 * Dynamics 365
 * Microsoft 365
 * Security, Compliance & Identity
 * Power Platform
 * Github
 * Teams
 * .NET


Lounge

Lounge
 * 802K Members
 * 4,442 Online
 * 2.2M Discussions

Search
Enter a search word

Turn off suggestions
Enter a search word

Turn off suggestions
Enter a user name or rank

Turn off suggestions
Enter a search word

Turn off suggestions
cancel
Turn on suggestions
Showing results for 
Show  only  | Search instead for 
Did you mean: 
Sign In

Sign In




Enter a search word

Turn off suggestions
Enter a search word

Turn off suggestions
Enter a user name or rank

Turn off suggestions
Enter a search word

Turn off suggestions
cancel
Turn on suggestions
Showing results for 
Show  only  | Search instead for 
Did you mean: 



 * Home
 * ITOps Talk
 * ITOps Talk Blog
 * Infrastructure as Code (IaC): Comparing the Tools

 * Back to Blog
 * Newer Article
 * Older Article




INFRASTRUCTURE AS CODE (IAC): COMPARING THE TOOLS

 * Subscribe to RSS Feed
 * 
 * Mark as New
 * Mark as Read
 * 
 * Bookmark
 * Subscribe
 * 
 * Email to a Friend
 * 
 * Printer Friendly Page
 * Report Inappropriate Content


By
April Edwards
Published Feb 24 2022 01:02 AM 6,476 Views
Skip to footer content
April Edwards
Microsoft
‎Feb 24 2022 01:02 AM


INFRASTRUCTURE AS CODE (IAC): COMPARING THE TOOLS

‎Feb 24 2022 01:02 AM

When you go to deploy a server or any part of our infrastructure manually, how
long does it take you? Can you do a manual deployment end to end without any
mistakes? Now, how do you scale that? This is where automation comes in, more
specifically Infrastructure as Code (IaC). 

 

In many of the companies I've worked for it would take days for a server to be
deployed, why? Because there was a ‘process’ and a physical paper checklist that
had to be followed, signed off, and checked again. Each person had to complete
their task(s) and get them signed off. To get a server deployed, you'd have to
configure the VM and the host (networking, storage, etc), each server required
an image to be deployed, patch the OS, harden the deployment, then
install/configure an application. Once that was all done… the server was ready
for sign off and handed over to the customer.  That took 3 days.

 

In some of the environments I managed, I could automate most of a complete
server/infrastructure deployment in a few hours, it was still a very manual
process, mistakes were often made. This is when I discovered Infrastructure as
Code, many ask, where do I begin? With all the  are various choices when it
comes to choosing the right tool for the job, which one is best?

 

Let’s first begin with defining what is Infrastructure as Code. Infrastructure
as Code (IaC) is the management of infrastructure (networks, virtual machines,
load balancers, and connection topology) in a descriptive model, using version
control to store the files. You can also watch this awesome one minute video
from the great Abel Wang, What is Infrastructure as Code? 

 

There are a huge number of benefits to using IaC, to name just a few: 

 * Your infrastructure can be stored in a source code repository (GitHub, Azure
   Repos, etc) adding in governance, versioning and increasing collaboration. 
 * Infrastructure becomes reproducible and you can introduce life cycling into
   your deployments (implementing CI/CD – Continuous Integration/Continuous
   Deployment) 
 * Scalability 
 * Removes human error 
 * Increase speed and consistency of your infrastructure deployments, lowering
   infrastructure administration costs. 
 * Increasing productivity of your teams 

 

Declarative vs Imperative Methods 

 

When writing you infrastructure as code it is important to understand the
difference between these two methods so that you understand the difference in
the types of templates that can be written and the way in which you will write
them.

 

Declarative languages define the desired state of the target, the system
executes what needs to happen to achieve the desired state. Effectively you
define the end state of the infrastructure, adding the resources that you need,
along with their configuration and the IaC tool will figure the rest out.

 

Imperative languages define the specific commands that must executed and in the
specific order the commands must run to achieve the desired state.

 

A declarative example would be: ‘Can I have a cup of coffee on my desk after
lunch?’ 

 

Whereas an imperative example would be: ‘Go to the coffee machine, add 1 scoop
of freshly ground beans and 400ml of water into the correct reservoir, press the
start button, allow the coffee to fill the cup. Add in 50ml of fresh 2% milk to
the cup and then deliver to my desk at precisely 1pm...’ You get the idea.

 

An imperative language requires more specific input and can fail during the
process if one of the steps is not fulfilled properly for any reason.  

 

A declarative style is great when you need to update your infrastructure or make
any changes to it. Whereas the imperative is good for a deploy and forget model,
but that isn’t always great if you’re looking to be an agile organization or
have a changing infrastructure. The choice really comes down to personal
preference and which situation fits best for your team.  

 

IaC Tooling: So many Choices! 

 

There are numerous tools that can be used for IaC, there are some questions that
I would ask yourself and your team: 

 

 * What skillsets are already present in the team around specific languages
   (i.e., C#, Golang, JSON, Typescript or none of the above – also a valid
   answer)? 
 * What platform are we deploying onto (on-prem, Azure, AWS, etc)? 

 * Does an imperative or declarative language make sense? 
 * Are you looking to provision and manage configuration? Or just provision
   infrastructure? 

I’ve listed some of the tools below, I’ll go through each one and describe some
pros and cons, hopefully leading you to pick the one that suits you and your
team the best.  

 

Azure Resource Manager (ARM) Templates

 

ARM Templates are designed specifically for deployments into Microsoft Azure. If
you are looking for a tool for on-premises environments or multiple cloud
providers, this isn’t it. ARM is the native IaC templating option for Azure. You
can deploy a resource in Azure using the Azure Portal, then download your
template so that you can do it again and repeat the process. That is an easier
way to get started, but there are some drawbacks. 

 

First, you need to learn JSON, which could be your first hurdle. Also, when you
export an ARM template there is quite a bit of boilerplate code that you need.
ARM, for many people, can be difficult to learn. There is not a way to really
know if what you’re deploying is what will get deployed (there isn’t a ‘what-if’
usage or ‘plan’ output that shows you what is about to be deployed).  ARM has
other limitations when it comes to writing IaC, such as when you get a
validation or syntax error, it can be painful to troubleshoot with ARM. ARM
templates can also grow to be very large and sometimes unwieldly. In an
environment that needs repeatability and scalability, it can cause some
issues.  

 

On the other hand, there are some great learning resources for ARM templates if
that is the path you choose: 

ARM QuickStart Templates 

Microsoft Learn – Create and deploy ARM templates

 

Pros:  

 * Easy to export a working template from something that has been deployed from
   the Azure Portal 
 * Fantastic (free) learning resources and QuickStart templates 
 * Azure native so it supports all Azure services from day 0 

Cons: 

 * Learning curve around JSON 
 * Templates can get long and unruly 
 * Doesn’t manage state of your infrastructure, changes can be breaking

 

Bicep

 

Bicep is the Domain Specific Language (DSL) that allows for declarative
deployment of Azure resources, so yes, this is an IaC tool that is native to
Azure. Anything that you can do with an ARM template you can do with Bicep (and
more!). As soon as a new resource is added into Azure, it is immediately
supported by Bicep.  Bicep requires a lot less syntax than ARM templates, you
can compare the template syntax differences here.

 

Bicep vs ARM Templates

 

 

Bicep allows for the use of modules, which means you create a module for each
grouping of resources, creating much more manageable and readable files. It
keeps your IaC from getting too big and unruly. Bicep is integrated into the
Azure CLI, making the Azure deployment experience really seamless.

 

One of my favorite features of Bicep is the ‘What-if’ operation. When you pass
the argument, it checks your current deployment and what changes would be
applied before you make them, allowing you to confirm those changes before it
applies them. Knowing what you’re about to deploy before you push the button to
deploy it is a great way to validate and ensure your results without having to
deploy it first.

 

Pros: 

 * Syntax improvements, much simpler than ARM for writing templates 
 * Modules – allows you to create more complex templates much more easily 
 * Resource dependency management is better managed with Bicep, it will
   automatically detect resource dependencies. 

Cons: 

 * Used only with deployments to Azure 

 * Limitations still exist in its capability compared to other tools 

Great learning resources with Bicep:

Get started with Bicep

Write your first Bicep Module with Microsoft Learn (and other free learning
paths around Bicep)

Barbara Forbes' Blog for Bicep Learnings 

 

Terraform: 

 

Terraform is an open-source tool that uses HCL (Hashicorp Configuration
Language), which is based on Golang, which many people find one of the most
easily learned IaC languages. Terraform comes with a lot of benefits that makes
it a popular choice. 

Terraform can be used with any cloud and on-prem resources. While it requires a
different template, you can use the same language and formatting to deliver IaC
to any environment. The reality is most organization are multi-cloud and
configured in a hybrid model, this is where Terraform shines. 

 

 

 

 

 

 

terraform {
  required_version = ">=0.12"
  
  required_providers {
    azurerm = {
      source = "hashicorp/azurerm"
      version = "~>2.0"
    }
  }
}

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "vmss" {
 name     = var.resource_group_name
 location = var.location
 tags     = var.tags
}

resource "random_string" "fqdn" {
 length  = 6
 special = false
 upper   = false
 number  = false
}

resource "azurerm_virtual_network" "vmss" {
 name                = "vmss-vnet"
 address_space       = ["10.0.0.0/16"]
 location            = var.location
 resource_group_name = azurerm_resource_group.vmss.name
 tags                = var.tags
}

resource "azurerm_subnet" "vmss" {
 name                 = "vmss-subnet"
 resource_group_name  = azurerm_resource_group.vmss.name
 virtual_network_name = azurerm_virtual_network.vmss.name
 address_prefixes       = ["10.0.2.0/24"]
}

resource "azurerm_public_ip" "vmss" {
 name                         = "vmss-public-ip"
 location                     = var.location
 resource_group_name          = azurerm_resource_group.vmss.name
 allocation_method            = "Static"
 domain_name_label            = random_string.fqdn.result
 tags                         = var.tags
}

resource "azurerm_lb" "vmss" {
 name                = "vmss-lb"
 location            = var.location
 resource_group_name = azurerm_resource_group.vmss.name

 frontend_ip_configuration {
   name                 = "PublicIPAddress"
   public_ip_address_id = azurerm_public_ip.vmss.id
 }

 tags = var.tags
}

resource "azurerm_lb_backend_address_pool" "bpepool" {
 loadbalancer_id     = azurerm_lb.vmss.id
 name                = "BackEndAddressPool"
}

resource "azurerm_lb_probe" "vmss" {
 resource_group_name = azurerm_resource_group.vmss.name
 loadbalancer_id     = azurerm_lb.vmss.id
 name                = "ssh-running-probe"
 port                = var.application_port
}

resource "azurerm_lb_rule" "lbnatrule" {
   resource_group_name            = azurerm_resource_group.vmss.name
   loadbalancer_id                = azurerm_lb.vmss.id
   name                           = "http"
   protocol                       = "Tcp"
   frontend_port                  = var.application_port
   backend_port                   = var.application_port
   backend_address_pool_id        = azurerm_lb_backend_address_pool.bpepool.id
   frontend_ip_configuration_name = "PublicIPAddress"
   probe_id                       = azurerm_lb_probe.vmss.id
}

resource "azurerm_virtual_machine_scale_set" "vmss" {
 name                = "vmscaleset"
 location            = var.location
 resource_group_name = azurerm_resource_group.vmss.name
 upgrade_policy_mode = "Manual"

 sku {
   name     = "Standard_DS1_v2"
   tier     = "Standard"
   capacity = 2
 }

 storage_profile_image_reference {
   publisher = "Canonical"
   offer     = "UbuntuServer"
   sku       = "16.04-LTS"
   version   = "latest"
 }

 storage_profile_os_disk {
   name              = ""
   caching           = "ReadWrite"
   create_option     = "FromImage"
   managed_disk_type = "Standard_LRS"
 }

 storage_profile_data_disk {
   lun          = 0
   caching        = "ReadWrite"
   create_option  = "Empty"
   disk_size_gb   = 10
 }

 os_profile {
   computer_name_prefix = "vmlab"
   admin_username       = var.admin_user
   admin_password       = var.admin_password
   custom_data          = file("web.conf")
 }

 os_profile_linux_config {
   disable_password_authentication = false
 }

 network_profile {
   name    = "terraformnetworkprofile"
   primary = true

   ip_configuration {
     name                                   = "IPConfiguration"
     subnet_id                              = azurerm_subnet.vmss.id
     load_balancer_backend_address_pool_ids = [azurerm_lb_backend_address_pool.bpepool.id]
     primary = true
   }
 }

 tags = var.tags
}

resource "azurerm_public_ip" "jumpbox" {
 name                         = "jumpbox-public-ip"
 location                     = var.location
 resource_group_name          = azurerm_resource_group.vmss.name
 allocation_method            = "Static"
 domain_name_label            = "${random_string.fqdn.result}-ssh"
 tags                         = var.tags
}

resource "azurerm_network_interface" "jumpbox" {
 name                = "jumpbox-nic"
 location            = var.location
 resource_group_name = azurerm_resource_group.vmss.name

 ip_configuration {
   name                          = "IPConfiguration"
   subnet_id                     = azurerm_subnet.vmss.id
   private_ip_address_allocation = "dynamic"
   public_ip_address_id          = azurerm_public_ip.jumpbox.id
 }

 tags = var.tags
}

resource "azurerm_virtual_machine" "jumpbox" {
 name                  = "jumpbox"
 location              = var.location
 resource_group_name   = azurerm_resource_group.vmss.name
 network_interface_ids = [azurerm_network_interface.jumpbox.id]
 vm_size               = "Standard_DS1_v2"

 storage_image_reference {
   publisher = "Canonical"
   offer     = "UbuntuServer"
   sku       = "16.04-LTS"
   version   = "latest"
 }

 storage_os_disk {
   name              = "jumpbox-osdisk"
   caching           = "ReadWrite"
   create_option     = "FromImage"
   managed_disk_type = "Standard_LRS"
 }

 os_profile {
   computer_name  = "jumpbox"
   admin_username = var.admin_user
   admin_password = var.admin_password
 }

 os_profile_linux_config {
   disable_password_authentication = false
 }

 tags = var.tags
}

 

 

 

 

 

 

Terraform builds resources, makes changes and can call existing resources using
a state file. Terraform is easily readable and uses modules to easily configure
your code and call your resources. While Terraform is a declarative language, it
does call the state file to know what it is supposed to deploy. Managing the
state file does introduce other topics (security, access, etc), but is very much
achieved using the documentation in place. Learn more about Terraform state
files here. 

 

Terraform has great features built in to validate your code, run a ‘plan’ so you
know exactly what elements are going to change before they change, and
traceability of what was deployed. Terraform shines when you want to
continuously deploy your infrastructure, it even has the ability to deploy to
different environments using workspaces. 

 

Pros: 

 * Multi-cloud capability 
 * Easy to write and understand syntax, while also easy to setup and deploy 
 * Built in features to show what is deploying before it is deployed, as well as
   validation and formatting.  

Cons: 

 * New services in Azure aren’t always available to deploy using Terraform 
 * Declarative languages require the use of dependency mapping when deploying
   (example: deploying a VM without networking first, will error out) 

Terraform on Azure Video 

Terraform on Azure Blog - covering the basics into modules and state files 

Generate your first Terraform template with NubesGen

Terraform on Azure Documentation  

 

Pulumi: 

 

Pulumi is another IaC tool that uses a declarative format to deploy your
infrastructure, the biggest differentiator with Pulumi is that it allows you to
write your IaC in the language that your organization or team knows best. Pulumi
support TypeScript, JavaScript, Python, Go and C#, which means that you write
your templates in the language that you are comfortable with.

 

Adding in another bonus, you can use the testing tools native to that language
to test your code. Testing is crucial. We not only want to deploy our
infrastructure as code to automate tasks and increase our velocity, but we also
need to reduce our human error. This is where testing is a crucial part of the
development and deployment lifecycle.  

 

Pulumi, like Terraform supports ANY cloud. It has another huge benefit: It can
coexist or convert your existing templates from Terraform, ARM, Helm/YAML, etc
into Pulumi.  

 

Pros: 

 * Pulumi allows for easy adoption with a more familiar language and allows the
   conversion of existing templates 

 * Allows for IaC adoption in a language that works for your team 

Cons: 

 * If you don’t have ANY experience in any languages, you will need to choose
   one and skill up.  

  

Video on deploying to Azure using Pulumi

  

Ansible 

 

Ansible an imperative IaC tool, while it not only provisions your
infrastructure, but it also manages the configuration of your services. The
other services above do not, another 3rd party tool would be required. Ansible
relies heavily on YAML files to define your infrastructure in the form of
Ansible Playbooks and Python for its written language. These describe your
automation tasks form deployment to ongoing state, it’s an all-in-one
solution.  

 

Ansible does not maintain state, it does not keep track of dependencies. Ansible
is fairly easy to get started with but does have less of a community feel when
looking for troubleshooting tips or self-help. 

 

Pros: 

 * Simple to learn as it’s written in an easily understood Python language,
   while the Playbooks are written in YAML 
 * Ansible is agentless, decreasing maintenance and performance degradations 

Cons:  

 * Lack of state meaning it doesn’t track dependencies. It will execute tasks
   sequentially, stopping when the task finishes, fails or encounters an
   error.  
 * Lack of enterprise support and community feel for troubleshooting. 

 

Chef: 

 

Chef is an open source IaC tool that can run on multiple platforms (Windows,
Linux, AWS, Azure, etc) and uses cookbooks and recipes to define not only your
deployment templates, but also your configuration of your environment. Chef uses
Ruby DSL, requiring a dedicated set of programming skills to learn the
language. Chef requires an infrastructure to run on, so that is a consideration
when looking at it, there is a licensing and infrastructure cost associated to
this. This also means that Chef runs on a dedicated environment, requiring an
agent on every machine that you are deploying to. 

 

Due to the fact that Chef requires a lot of other considerations outside of just
the capability of the product I am going to list the pros and cons, it very much
requires much more consideration outside of just infrastructure as code.

 

Pros:  

 * Scalable, easily handles a large infrastructure 

 * Extensive collections of configuration and module recipes 

 

Cons:  

 * Requirement to learn Ruby, be ready for a steep learning curve 
 * Complexity and overhead management, difficult to install 

  

Puppet  

 

Puppet and Chef often get roped together when comparing IaC as they’ve both been
around for some time. Puppet uses its own declarative language to deploy and
maintain system configuration, it uses manifests and modules in the form of
PuppetDSL. 

Puppet also requires an infrastructure to run on, deploying agents on every
machine that you are deploying and managing. As Puppet also requires a lot of
other considerations outside of just the capability of the product, it’s not one
that is as popular in Azure when there are more cost-effective options. 

 

Pros:  

 * Scalable, easily handles a large infrastructure 
 * Well-established support community 
 * Powerful reporting capabilities 

Cons:  

 * Requirement to learn PuppetDSL  
 * Complexity and overhead management, difficult to install 

 

In Summary 

 

Choosing an Infrastructure as Code tool is decision that requires thought, along
with comparing the pros and cons for every organization. There is no
one-size-fits-all solution for anyone nor any company. Take your time, read
through the options and find the best solution for you. Once you choose your
preferred IaC tool, make sure you start looking at how to automate not only your
infrastructure, but also your delivery process with a solid continuous
integration/continuous delivery (CI/CD) tool.  

 

Happy coding! 

 * Tags:
 * automation
   
 * Azure
   
 * Cloud
   
 * IAC
   
 * infrastructure as code
   
 * templates
   


7 Likes
Like




7 Comments
Cloudbuddies
Occasional Visitor
‎Feb 25 2022 09:10 AM
 * Mark as Read
 * Mark as New
 * 
 * Bookmark
 * 
 * Permalink
 * Print
 * Email to a Friend
 * 
 * Report Inappropriate Content

‎Feb 25 2022 09:10 AM

Thanks for the great article. Just wanted to propose an alternative to all those
tools. At Cloudbuddies we built a self-service portal that delivers and build
well architected Cloud infrastructures for AWS, GCP and soon MS Azure. No
coding, architecting, software required. More details available on our website
https://cloudbuddies.io .

0 Likes
Like




CloudMakerCEO
Occasional Visitor
‎Feb 25 2022 09:50 AM
 * Mark as Read
 * Mark as New
 * 
 * Bookmark
 * 
 * Permalink
 * Print
 * Email to a Friend
 * 
 * Report Inappropriate Content

‎Feb 25 2022 09:50 AM

Really great overview of the different IaC options. The declarative nature of
IaC is hugely powerful but the learning curve of adoption is challenging. We're
solving these challenges at https://cloudmaker.ai by giving you all the power of
IaC but the simplicity of drawing a diagram. Fully declarative, idempotent and
stateful. Would love your feedback if you had the time!

1 Like
Like




LoicMichel
Senior Member
‎Feb 28 2022 01:28 AM
 * Mark as Read
 * Mark as New
 * 
 * Bookmark
 * 
 * Permalink
 * Print
 * Email to a Friend
 * 
 * Report Inappropriate Content

‎Feb 28 2022 01:28 AM

Thank you for this list, don't you also consider Azure policy/ guest
configuration as IaC?

1 Like
Like




April Edwards
Microsoft
‎Feb 28 2022 02:33 AM
 * Mark as Read
 * Mark as New
 * 
 * Bookmark
 * 
 * Permalink
 * Print
 * Email to a Friend
 * 
 * Report Inappropriate Content

‎Feb 28 2022 02:33 AM

Thanks @LoicMichel for the question. Azure Policy is a service in Azure that
uses various languages, so it's more of an Azure service that uses native code
language (or Bicep/Terraform/etc) to Deploy. You can use various IaC languages
to deploy and maintain it, it's not its own IaC language, but a service.

1 Like
Like




LoicMichel
Senior Member
‎Feb 28 2022 05:19 AM
 * Mark as Read
 * Mark as New
 * 
 * Bookmark
 * 
 * Permalink
 * Print
 * Email to a Friend
 * 
 * Report Inappropriate Content

‎Feb 28 2022 05:19 AM

that makes sense thank you :)

0 Likes
Like




Pedro35
Frequent Visitor
‎Mar 01 2022 12:25 AM
 * Mark as Read
 * Mark as New
 * 
 * Bookmark
 * 
 * Permalink
 * Print
 * Email to a Friend
 * 
 * Report Inappropriate Content

‎Mar 01 2022 12:25 AM

Well done April, great article. Congratulations! A kind of "must read"..

You said "Bicep is integrated into the Azure CLI". What about Azure Az modules?

0 Likes
Like




April Edwards
Microsoft
‎Mar 01 2022 01:06 AM
 * Mark as Read
 * Mark as New
 * 
 * Bookmark
 * 
 * Permalink
 * Print
 * Email to a Friend
 * 
 * Report Inappropriate Content

‎Mar 01 2022 01:06 AM

Hi @Pedro35 , yes it does: https://github.com/Azure/ResourceModules

1 Like
Like





You must be a registered user to add a comment. If you've already registered,
sign in. Otherwise, register and sign in.

 * Comment

Co-Authors
April Edwards

Version history
Last update:
‎Feb 24 2022 01:03 AM
Updated by:
April Edwards


Labels
 * Azure 465
 * ITOps Talks 30




SHARE

 * Share to LinkedIn
 * Share to Facebook
 * Share to Twitter
 * Share to Email




Browse

Skip to primary navigation

WHAT'S NEW

 * Surface Pro X
 * Surface Laptop 3
 * Surface Pro 7
 * Windows 10 Apps
 * Office apps

MICROSOFT STORE

 * Account profile
 * Download Center
 * Microsoft Store support
 * Returns
 * Order tracking
 * Store locations
 * Buy online, pick up in store
 * In-store events

EDUCATION

 * Microsoft in education
 * Office for students
 * Office for schools
 * Deals for students and parents
 * Microsoft Azure in education

ENTERPRISE

 * Azure
 * AppSource
 * Automotive
 * Government
 * Healthcare
 * Manufacturing
 * Financial Services
 * Retail

DEVELOPER

 * Microsoft Visual Studio
 * Window Dev Center
 * Developer Network
 * TechNet
 * Microsoft developer program
 * Channel 9
 * Office Dev Center
 * Microsoft Garage

COMPANY

 * Careers
 * About Microsoft
 * Company News
 * Privacy at Microsoft
 * Investors
 * Diversity and inclusion
 * Accessibility
 * Security

 * Sitemap
 * Contact Microsoft
 * Privacy
 * Manage cookies
 * Terms of use
 * Trademarks
 * Safety and eco
 * About our ads
 * © 2022 Microsoft

Auto-suggest helps you quickly narrow down your search results by suggesting
possible matches as you type.

Auto-suggest helps you quickly narrow down your search results by suggesting
possible matches as you type.