乐趣区

关于ansible:将-Ansible-和-Jenkins-与-Terraform-集成以构建强大的基础架构

市场上有许多配置管理工具可用于创立齐全自动化和齐全配置的基础架构, 其中弱小的工具之一是 Ansible。

Ansible 是一个开源工具,能够用它来进行软件供给、配置管理和应用程序部署。它可接管一个新创建的服务器实例并依据称为 Playbook 剧本来装置、配置所需的软件。

装置 Ansible

请参阅此页面以获取无关在首选操作系统上装置 Ansible 的具体指南。

新个性

  • 增加了一种在主机操作系统上保留.pem 私钥的办法
  • Ansible playbook 用于配置内部卷
  • 应用 Jenkins 进行继续集成

让咱们开始增加代码以将.pem 密钥文件保留到本地计算机。这样,通过应用这个密钥,咱们就能够应用 SSH 登录到近程实例。

保留.pem 密钥文件

以下代码会将主动生成的 EC2 私钥保留为咱们本地机器中的.pem 文件。

resource "tls_private_key" "ec2_private_key" {
    algorithm = "RSA"
    rsa_bits  = 4096
    provisioner "local-exec" {command = "echo'${tls_private_key.ec2_private_key.private_key_pem}'> ~/Desktop/${var.key_name}.pem"
    }
}

在这里,私钥文件将保留在桌面目录中。然而,默认状况下,此文件会以公共拜访权限保留在本地计算机上。当初,要应用此密钥登录 EC2 实例,咱们须要将密钥设为公有。咱们能够通过授予.pem 密钥文件较少的权限来实现这一点。

resource "null_resource" "key-perm" {
    depends_on = [tls_private_key.ec2_private_key,]
    provisioner "local-exec" {command = "chmod 400 ~/Desktop/${var.key_name}.pem"
    }
}

当初,咱们的密钥已胜利保留到本地机器并筹备好用于登录。

Ansible-playbook 自动化配置

在之前的版本中,咱们应用了一个 shell 脚本文件(task1/vol.sh)来主动配置内部卷。然而,配置服务器最无效的办法是应用配置管理工具。Ansible 提供了一种编写 playbook 剧本的办法来为咱们配置服务器。
让咱们看一下 ansible-playbook,它将配置内部卷以使其能够应用。这个剧本被命名为 master.yml

- hosts: all
  become: true
tasks:
- name: Install httpd
  command: yum install httpd -y
  become: yes
  become_method: sudo
  become_user: root
- name: Start httpd
  command: systemctl start httpd
  become: yes
  become_method: sudo
  become_user: root
- name: Enable httpd
  command: systemctl enable httpd
  become: yes
  become_method: sudo
  become_user: root
- name: Install git
  command: yum install git -y
  become: yes
  become_method: sudo
  become_user: root
- name: Create a new primary partition with a size of 1GiB
  parted:
  device: /dev/xvdc
  number: 1
  state: present
  part_end: 500MiB
- name: Format the partition, mount it to the /var/www/html
  shell: |
  mkfs -t ext4 /dev/xvdc1
  mount /dev/xvdc1 /var/www/html
- name: Copy the code from github to the /var/www/html
  shell: |
  cd /var/www/html
  git clone https://github.com/cankush625/Web.git

让咱们理解这个文件的作用。
在 terraform 代码中会应用以下命令执行此 playbook 剧本:

// Configuring the external volume
resource "null_resource" "setupVol" {
    depends_on = [aws_volume_attachment.myWebVolAttach,]
//
    provisioner "local-exec" {command = "ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook -u ec2-user --private-key ~/Desktop/${var.key_name}.pem -i'${aws_instance.myWebOS.public_ip},'master.yml"
    }
}

它将应用提供给 ansible-playbook 命令的 IP 地址、.pem 密钥和用户名登录到近程实例。在这里,咱们与 EC2 实例建设了连贯。
当初,它将进入实例(近程操作系统)并开始逐行执行工作。在这里,须要留神的一件事是咱们以 root 用户(超级用户)身份执行命令。
在 EC2 实例外部,它将首先装置 httpd 服务,启动该服务并启用它。之后,它将装置 git。
因为,咱们曾经附加了新卷(dev/xvdc),为了使这个卷可用,咱们须要在这个卷中创立分区。咱们将大小为 500MiB 的分区设置为 dev/xvdc1。
之后,咱们将此分区格式化为 ext4 并将其挂载到 /var/www/html 文件夹,这是咱们与 httpd 服务一起应用的默认文件夹。
最初,咱们将当前目录更改为 /var/www/html 并在此处克隆带有网站代码的 git 存储库。因为咱们的内部卷(长久存储)挂载到 /var/www/html 文件夹,因而从 Github 克隆的代码会主动保留到内部卷并通过 /var/www/html 目录拜访。

运行 terraform 代码:

首先,咱们将应用 terraform init 命令下载代码所需的插件。
之后,咱们将应用 terraform apply 命令运行代码。

正如咱们在上图中看到的,ansible-playbook 将在 EC2 实例(近程操作系统)中逐行执行。

上图显示 ok=8,这意味着咱们给 ansible-playbook 的所有 8 个工作都已胜利实现,心愿咱们的服务器或卷依照咱们的须要进行配置。
让咱们检查一下咱们的卷是否配置正确。查看这一点的最佳办法之一是运行咱们部署的网站。

咱们的网站已胜利拜访并正确显示所有内容。这意味着,咱们的服务器已应用 ansible-playbook 正确配置。

应用 Jenkins 进行继续集成:

为 Jenkins 作业创立 webhook:

须要有一个 Webhook 能力与 Jenkins 作业建设连贯,并在对 Github 存储库进行更改时触发该 Jenkins 作业。

webhook 后面的绿色勾号示意 webhook 和 Jenkins 之间的连贯曾经建设。

创立并配置 Jenkins 作业:

创立一个作业:

设置 SCM:

在运行的 terraform 代码:

留神:要在 Jenkins shell 中应用 sudo 命令,您可能须要在本地零碎上配置 sudoers 文件。
作业实现时,发送邮件:

当咱们将更改提交到 Github 存储库时:

咱们的工作将主动被触发并开始执行 terraform 代码。

因而,在这个模块中,咱们将 terraform 代码与 Ansible 集成以进行配置管理,最初,咱们与 Jenkins 集成以创立继续集成 pipeline。
这是源代码的链接:
https://github.com/cankush625…

更新为 EFS

Amazon EFS 文件系统跨 AWS Region 中的多个 AZ 存储数据和元数据。能够同时从多个设施拜访 EFS 文件系统,并且咱们可能同时编辑 EFS 文件系统中的文件。
在这里,咱们将从晚期我的项目中删除 EBS,转而应用 EFS 文件系统。
因而,让咱们从为应用 EFS 增加 terraform 代码开始。

创立 EFS

resource "aws_efs_file_system" "myWebEFS" {
    creation_token = "myWebFile"
    tags = {Name = "myWebFileSystem"}
}

挂载 EFS

resource "aws_efs_mount_target" "mountefs" {file_system_id  = "${aws_efs_file_system.myWebEFS.id}"
    subnet_id       = "subnet-2f0b3147"
    security_groups = ["${aws_security_group.allow_tcp_nfs.id}",]
}

配置 EC2 和 EFS

resource "null_resource" "setupVol" {
    depends_on = [aws_efs_mount_target.mountefs,]
    //
    provisioner "local-exec" {command = "ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook -u ec2-user --private-key ~/Desktop/${var.key_name}.pem -i'${aws_instance.myWebOS.public_ip},'master.yml -e'file_sys_id=${aws_efs_file_system.myWebEFS.id}'"
    }
}

在这里,在下面的命令中,咱们传递了一个名为 file_sys_id 的变量,它具备 EFS 文件系统 ID。这个变量将在 master.yml 中配置管理时应用。

配置文件

master.yml 文件:

- hosts: all
  become: true
tasks:
- name: Install httpd
  command: yum install httpd -y
  become: yes
  become_method: sudo
  become_user: root
- name: Start httpd
  command: systemctl start httpd
  become: yes
  become_method: sudo
  become_user: root
- name: Enable httpd
  command: systemctl enable httpd
  become: yes
  become_method: sudo
  become_user: root
- name: Install git
  command: yum install git -y
  become: yes
  become_method: sudo
  become_user: root
- name: Install AWS EFS tools utilities
  command: yum install -y amazon-efs-utils
  become: yes
  become_method: sudo
  become_user: root
- name: Mounting EFS at /var/www/html
  command: mount -t efs {{file_sys_id}}:/ /var/www/html
  become: yes
  become_method: sudo
  become_user: root
- name: Edit fstab so EFS automatically loads on reboot
  command: echo {{file_sys_id}}:/ /var/www/html efs defaults,_netdev 0 0 >> /etc/fstab
  become: yes
  become_method: sudo
  become_user: root
- name: Copy the code from github to the /var/www/html
  shell: |
  cd /var/www/html
  git clone https://github.com/cankush625/Web.git

在装置了所需的包(如咱们之前看到的 httpd、git)之后,当初,该文件将装置另一个包以应用 EFS,即 amazon-efs-utils。
之后,咱们将在 /var/www/html 上挂载 EFS 文件系统并编辑 fstab,以便 EFS 在重新启动时主动加载。
在最初一步中,此文件从 Github 克隆 /var/www/html 中的网站代码。而且,因为咱们在 /var/www/html 上装置了 EFS 文件系统,咱们的代码被保留在 EFS 中,当初任何实例(近程操作系统)都能够通过 EFS 拜访此代码,咱们也能够对其进行批改。
让咱们运行代码:

执行 Terraform 代码:

胜利执行后,此代码将创立并挂载 EFS 文件系统。

当初,创立另一个与运行 Terraform 代码创立的第一个实例完全相同的实例。

当初,如果您进行了配置,EFS 文件系统会主动附加到咱们要启动的新实例。

当初,咱们有两个正在运行的实例。

在这两个实例中,咱们将代码从 Github 克隆到 /var/www/html 的第一个实例。因而,咱们的网站已启动并正在运行。

然而,如果咱们尝试从第二个实例拜访该网站,它是能够拜访的。这是因为咱们在第二个实例中也在 /var/www/html 处附加了 EFS 文件系统。

这是源代码的链接:
https://github.com/cankush625…

退出移动版