市场上有许多配置管理工具可用于创立齐全自动化和齐全配置的基础架构,其中弱小的工具之一是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: truetasks:- 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 volumeresource "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: truetasks:- 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...