Prerequisites
AWS Account
Terraform Cloud Account
Preconfigured access in
~/.terraformrc
. Get the token from https://app.terraform.io by going to Settings → Teams → Team API Token. Generate a new token and create the file~/.terraformrc
Code Block credentials "app.terraform.io" { token = "iz5o8MNxgBBPwQ...." }
# | Step | |||
---|---|---|---|---|
1 | Setup |
|
| ||
2 | Create IAM User & Role |
|
export AWS_ACCESS_KEY_ID="ASIAWRO3..." export AWS_SECRET_ACCESS_KEY="6gLd..." export AWS_SESSION_TOKEN="IQoJpZ2l..." # only used for live session key
The script creates:
|
| ||
3 | Create Ops Kubernetes Cluster |
|
|
|
The script creates:
| ||
4 | Import the Kubernetes Cluster connection config | Make sure you have |
an AWS profile set in your ~/
Find the name of the Kubernetes cluster and update the local config with it
| ||||||||||||
5 | Install Nginx |
| ||||||||||
6 | Install Jenkins | Use the helm chart for installing Jenkins onto the Kubernetes cluster created above.
Wait for Jenkins to start up. To view the Jenkins admin password:
Set up a cloud-provisioned Jenkins node as defined in the Kubernetes plugin config in Jenkins. | ||||||||||
7 | Install Ansible Tower (AWX) | Create the AWX DB by connecting to the RDS PostgreSQL instance created via Terraform.
|
Install AWX with the Kustomize |
command.
|
Watch for the script failing and if it does run it again (timing issue due to the creation of the AWX RBAC) | ||
8 | Update DNS record (optional) |
|
|
Now Jenkins and AWX should be available via http://ops.d1.test. |
9
Terraform Cloud workspaces
We need to maintain two workspaces - one for the Fabric Kubernetes cluster and one for the openIDL applications.
To create the workspaces use the tool located in senofi/openidl-devops:
Go to openidl-devops/aws-infrastructure/environments/<env-folder>/terraform-cloud
and run
Code Block |
---|
terragrunt plan |
If everything looks ok, execute terragrunt apply
. This should create two workspaces and a var set in Terraform Cloud.
Create a new KMS key (symetric, encrypt/decrypt) in the AWS console. The name is not important but use a meaningful name that will associate it with this environment. Use it to populate the property in the next step
Go to openidl-devops/automation/terraform-cloud
and update configuration.properties
Make sure that the varset name
Create SSH keys
Code Block |
---|
ssh-keygen -t rsa -f app_eks_worker_nodes_ssh_key.pem ssh-keygen -t rsa -f blk_eks_worker_nodes_ssh_key.pem ssh-keygen -t rsa -f bastion_ssh_key.pem |
Populate the variable set by executing the following command in openidl-devops/automation/terraform-cloud
Code Block |
---|
pip install -r requirements.txt python populate-variable-set.py |
Copy the contents of the public keys and populate them in Terraform Cloud UI under Variable Sets → <the newly created varset>
10
Configure Jenkins
Set Jenkins node label ‘openidl’ in Kubernetes Cloud by going to Manage Jenkins → Manage Nodes and Clouds → Configure Clouds. Make sure that under Pod Template details the labels field contains the value ‘openidl’.
Also, remove the prepopulated ‘sleep’ command if it is set on the pod template:
Create the Terraform Job Template
Terraform Token Secret - Login to Jenkins go to Manage Jenkins → Manage Credentials → Stores scoped to Jenkins (Jenkins) → Global Credentials (unrestricted) → Add credentials
Choose Kind as secret text, enter secret text like Token in “secret” field and name the secret ID as unique since it will be used in pipeline code.
Git Credentials - Add a new credential
Terraform Job
Go to Jenkins → New Item. Use a name such as
Terraform Job
Select job type as PIPELINE and proceed.
Select Definition as Pipeline Script from SCM
Select SCM as Git
Key in the Infrastructure code repository (openidl-gitops) URL.
Select the Git credential created above
Specify the relevant branch “refs/heads/<branch-name>”.
Set script path to
jenkins-jobs/jenkinsfile-tf
11
Run Terraform Job
Run the Jenkins Terraform Job
Open the console log for the job. Once the job asks for an input accept and choose the apply option
The job runs a second plan into the Kubernetes workspace in Terraform Cloud. When asked - accept and apply the changes
Go to the AWS Console and find EKS (Elastic Kubernetes Service). Choose the blk cluster and go to Add-Ons. Find the EBS plugin and add it to the list. The plugin makes sure volumes could be created in Kubernetes
AWX Setup
Prerequisites:
AWX is installed and operational
AWS infrastructure is provisioned
Configuration is done and available at a private git repository
Credentials information is defined and available
aws iam user
git private repo deploy key
bastion ssh private key
hds db access
fabric console user and password
Bastion machine (gateway) host address is available
Steps:
...
Step
...
Notes
...
User
...
Checklist
...
Create new Organization
...
Create new organization with the org_id
...
admin
...
Setup new org AWX user
...
Create new user named with the org name, assing admin permissions to the created organization above
...
admin
...
Setup org project
...
Create new project named with the org name, use openidl ansible git url and the appropriate branch.
...
org user
...
Setup inventory
...
Create new Inventory named with the org name (bastion-org_id).
Add host using the bastion machine addrress
Add group named ansible_provisioners
Add the bastion host to the group
...
org user
...
Create Credentials
...
Create the credential types as specified below (see credentails table)
...
admin
...
Create AWX job tempaltes
...
Create the AWX job tempaltes as specified below (see AWX job tempaltes table)
...
org user
Credentials:
...
Credential
...
Description
...
Definition/Type
...
Checklist
...
aws-git-actions
...
A AWS credential used to access AWS APIs. The IAM user is created during the AWS provisioning step. This user usually should have access to AWS resources and the provisioned k8s clusters (hlf and applications k8s). The user is usually named suffixed with git-actionsadmin. External AWS id is usually git-actions.
The user is used by the playbooks to perform the deployment and setup actions.
...
git-config
...
Git credentials (used to pull configuration from the private repository)
...
bastion
...
Bastion Machine SSH credential.
This machine is boostrapped during the AWS infrastructucture provisioning step. It is used as a remote agent for the ansible playbooks. It is the entry point (gateway) to access the AWS infrastructure in order to setup and deploy the network.
...
Machine - an existing standard credenatial in AWX
...
hds-access
...
Access information for application HDS DB.
This credetnails is injected by the playbooks to configure the openIDL applications for access to the local carrier HDS database. The ansible playbooks don’t use it to establish connection to the HDS and perform operations.
...
fabric-console
...
Fabric Operator Console access default user / password.
Used by the playbooks to inject default user and password for the fabric consle deployment. Make sure the generate a strong password as it will secure properly the access to the node HLF managed.
The playbooks also use this credentail to connect to the consle for the purpose of performing operations on the HLF nodes.
Take a note of that credential as the provided user and password will be requried to login to the fabric operator console.
...
AWX Job Templates:
Playbook
Template Name
Credential
Description
Checklist
ansible/environment-setup.yaml
<env_id>-<org_id>-environment-setup
aws-git-actions
bastion
git-config
Install open source tools on the bastion host.
Setup the access to the cloud APIs
ansible/deploy-fabric-ingress.yml
<env_id>-<org_id>-deploy-fabric-ingress
aws-git-actions
bastion
git-config
Deploy Ingress controllers (classes) and cloud load balancers for the HLF k8s cluster
ansible/deploy-vault.yml
<env_id>-<org_id>-deploy-vault
aws-git-actions
bastion
git-config
Deploy Vault raft cluster for storing HLF identities (application and HLF nodes admins)
ansible/deploy-fabric-operator.yml
<env_id>-<org_id>-deploy-fabric-operator
aws-git-actions
bastion
git-config
Deploy HLF fabric operator
ansible/deploy-fabric-console.yml
<env_id>-<org_id>-deploy-fabric-console
aws-git-actions
bastion
git-config
fabric-console
Deploy HLF operator console
ansible/deploy-openidl-app-identities.yml
<env_id>-<org_id>-deploy-app-identities
aws-git-actions
bastion
git-config
fabric-console
Registers and enrolls the openidl application identities used to transact on the openidl fabric network
ansible/deploy-openidl-app-ingress.yml
<env_id>-<org_id>-deploy-app-ingress
aws-git-actions
bastion
git-config
Deploys the application ingress controller and class. Creates the applications load balancers for the applications k8s cluster.
ansible/deploy-mongodb.yml
<env_id>-<org_id>-deploy-mongodb
aws-git-actions
bastion
git-config
Deploys mongoDB as application database
ansible/deploy-openidl-app-config.yaml
<env_id>-<org_id>-deploy-app-config
aws-git-actions
bastion
git-config
fabric-console
hds-access (carrier node)
Generates and deploys the application config as secrets
ansible/deploy-openidl-app.yaml
<env_id>-<org_id>-deploy-app
aws-git-actions
bastion
git-config