Seemingly endless options abound for IT shops automating application and infrastructure deployment. And that's exactly the problem.
IT and development organizations cobble together complex tool chains that orchestrate the application lifecycle, from code development and integration to testing and production deployment.
Many tools originated to solve a particular problem, e.g., automated system configuration or code integration, but have evolved to incorporate other features in the CI/CD lifecycle, blurring the once thick line between software development tools and infrastructure deployment tools.
Feature creep and category overlap, coupled with the fact that there are no standard tool categories for the typical DevOps toolchain and both closed and open source technologies are popular, make it a challenge to understand the product landscape and select automated deployment tools with the right functionality for a particular situation. Underneath this complexity, there are definable groups of DevOps tools used at phases of the application deployment process, and guidelines for choosing a suitable set of tools.
The four horsemen of the DevOps toolchain
DevOps tools don't neatly fit into categories, but do fall generally into these four broad areas. Some products appear in more than one.
Build automation and source code management. Automation and code management tools allow software developers to collaborate and work in parallel without creating confusion. Popular tools include Git and services like GitHub, a favorite of open source projects. There are other Git service products from major cloud service providers, including Amazon Web Services (AWS) CodeCommit and Google Cloud Source Repositories; Microsoft offers Visual Studio Team Services and Atlassian has Bitbucket.
Continuous integration. CI tools automatically merge changes from multiple developers into the baseline source code repository. Jenkins, one of the most popular automated CI tools, includes many other features and extensions via plug-ins that enable users to create complex workflows. These pipelines let a DevOps organization automate the entire development lifecycle from code commit to build, test and deployment. Alternatives to Jenkins abound, including CircleCI, Codeship, TeamCity and Travis CI.
Application deployment and configuration management. These software platforms manage system installation, activation, patches and updates, as well as eventual uninstallations. As with the CI products, these automated deployment tools offer a range of features that often overlap into other DevOps tool categories. IT shops typically can augment deployment and management tools with plug-ins to expand functionality, integrating other software like build managers. Popular app deployment and configuration management tools include Red Hat Ansible, Chef, Capistrano, Puppet, Salt, Fabric -- not to be confused with the eponymous Twitter mobile development platform -- AWS OpsWorks, Google Cloud Deployment Manager and Microsoft Azure Automation.
Infrastructure deployment. Working closely with configuration management systems, automated infrastructure deployment tools treat Infrastructure as Code (IaC) and enable the declarative description and instantiation of bare-metal and virtual hardware stacks. Like other automation software, IaC tools ensure consistency between instances, speed up code delivery by transforming discrete manual processes into repeatable programs, and improve efficiency in a way that can lower costs. HashiCorp makes two products for automated deployment: Terraform, which is the production-scale successor to HashiCorp's developer-focused Vagrant tool, and Packer, which focuses on container image automation. Other popular options include Chef Habitat for containerized apps and AWS CloudFormation. Due to considerable feature overlap, many application configuration and automated deployment tools -- Ansible, Chef, Puppet -- can perform infrastructure automation once appropriate client-side modules are installed in machine images.
How to select the best automated deployment tools
Ideally, an IT shop selects an automated deployment tool in the context of its overall DevOps process and toolchain strategy. Due to feature creep and the overlap among various products, DevOps shops have many ways to solve a given problem. It is at once a diverse and a confusing selection of products.
Think holistically about the entire DevOps CI/CD software stack. IT and developers must cooperate -- which is your DevOps mandate anyway -- on a strategy to take an application from source code to deployment on a private or public cloud service(s). It will call for multiple tools. For example, Made Tech, a consultancy specializing in agile software delivery, uses Terraform for infrastructure orchestration, Ansible for provisioning and configuration, Jenkins for the CI code pipeline and a Makefile as the glue connecting each step of the process together.
Select automated deployment tools that support the languages developers work in, and that work well with the infrastructure stacks already in place for production. If developers on a specific project already use Jenkins, for example, see if it can support other teams before evaluating CI tool alternatives.
If however, the DevOps budget is modest and there isn't enough expertise or time to learn complex new tools, seek out products that are easy to set up and configure. In this scenario, Codeship or TeamCity might make for a better fit than Jenkins.
Consider the syntax that the tool uses. For example, Ansible uses YAML, a relatively straightforward, JSON-like language, but one that may not be familiar to everyone on a DevOps team. In contrast, Chef is primarily written in and uses Ruby, a syntax already familiar to many developers and IT admins, for its domain specific language (DSL) for configuration recipes.
Will the application deploy on infrastructure as a service (IaaS)? Default to the native infrastructure automation tool for that IaaS environment. AWS users should closely evaluate OpsWorks, CodePipeline, CodeDeploy and CodeCommit services for the application lifecycle. Microsoft Windows and Azure users may favor the company's Visual Studio Team Services and Azure Automation using PowerShell. While convenient and tightly integrated with the underlying cloud infrastructure and application services, the caveat with this approach is that it ties the development pipeline to one vendor.
The automation code is portable, however, mitigating lock-in risk. For example, CodePipeline integrates with GitHub and Jenkins and uses JSON to define the pipeline structure, while OpsWorks is essentially Chef as a service, meaning that automation code developed for a cloud-based pipeline could be redeployed to other platforms with little or no modification.
Plan for cross-cloud compatibility when building an automated deployment pipeline. Larger organizations already committed to a hybrid or multicloud infrastructure strategy especially should absorb the short-term pain of learning new DSLs and configuring tools to handle any environment, whether on-premises bare-metal servers or public cloud services.
Push Technology CTO Andy Piper says automated tests are best
AWS automated deployment tools avoid manual errors
Microsoft has a built-in automated deployment option