市场上有许多配置管理工具可用于创建完全自动化和完全配置的基础架构,其中强大的工具之一是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作业:
注意:要在Jenkins shell中使用sudo命令,您可能需要在本地系统上配置sudoers文件。
作业完成时,发送邮件:
因此,在这个模块中,我们将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代码:
现在,创建另一个与运行Terraform代码创建的第一个实例完全相同的实例。
现在,如果您进行了配置,EFS文件系统会自动附加到我们要启动的新实例。
在这两个实例中,我们将代码从Github克隆到/var/www/html的第一个实例。因此,我们的网站已启动并正在运行。
但是,如果我们尝试从第二个实例访问该网站,它是可以访问的。这是因为我们在第二个实例中也在/var/www/html处附加了EFS文件系统。
这是源代码的链接:
https://github.com/cankush625...