在Red Hat AMI-7.5上自动执行与网络接口相关的配置

时间:2018-08-29 14:12:28

标签: amazon-web-services amazon-ec2 redhat amazon-cloudformation

我创建了一个ENI,我需要使用云形成将它作为辅助ENI动态地附加到我的EC2实例上。当我使用Red Hat AMI时,我必须继续手动配置RHEL,其中包括以下帖子中提到的步骤。

https://www.linux.com/blog/configuring-linux-sudoers-file

有人可以告诉我如何使用云形成使所有这些自动化。有没有办法使用云形成模板中的用户数据来完成所有这些工作?另外,即使我重新启动ec2实例,我也需要确保配置仍然保留(当前配置在重新启动后会被删除。)

2 个答案:

答案 0 :(得分:0)

尽管它不是完全自动化的,但是您可以执行以下操作以确保在每次重新启动ec2实例后(仅适用于RHEL实例)启动ENI。如果有人有更好的建议,请分享。

vi /etc/systemd/system/create.service

在下面添加内容

[Unit]
Description=XYZ
After=network.target

[Service]
ExecStart=/usr/local/bin/my.sh

[Install]
WantedBy=multi-user.target

更改权限并启用服务

chmod a+x /etc/systemd/system/create.service
systemctl enable /etc/systemd/system/create.service

下面的shell脚本在rhel上为ENI进行配置

vi /usr/local/bin/my.sh

在内容下方添加

#!/bin/bash
my_eth1=`curl http://169.254.169.254/latest/meta-data/network/interfaces/macs/0e:3f:96:77:bb:f8/local-ipv4s/`
echo "this is the value--" $my_eth1 "hoo"
GATEWAY=`ip route | awk '/default/ { print $3 }'`
printf "NETWORKING=yes\nNOZEROCONF=yes\nGATEWAYDEV=eth0\n" >/etc/sysconfig/network
printf "\nBOOTPROTO=dhcp\nDEVICE=eth1\nONBOOT=yes\nTYPE=Ethernet\nUSERCTL=no\n" >/etc/sysconfig/network-scripts/ifcfg-eth1
ifup eth1

ip route add default via $GATEWAY dev eth1 tab 2

ip rule add from $my_eth1/32 tab 2 priority 600 

启动服务

systemctl start create.service

您可以通过-

检查脚本是否运行正常
journalctl -u create.service -b

答案 1 :(得分:0)

仍然需要弄清楚从Linux中添加辅助ENI的方法,但这是我编写的Python脚本,用于让实例找到相应的ENI并将其附加到自身。基本上,该脚本通过为ENI和实例获取预定义的命名标签来工作,然后将两者结合在一起。

进行此设置的先决条件是:

  • 实例上的IAM角色,以允许访问存储脚本的S3存储桶
  • 在用户数据部分中安装pip和AWS CLI

curl -O https://bootstrap.pypa.io/get-pip.py python get-pip.py pip install awscli --upgrade aws configure set default.region YOUR_REGION_HERE pip install boto3 sleep 180

sleep 180命令的注意事项:我在自动缩放组中的实例上交换了ENI。这样一来,其他实例就可以额外花费3分钟关闭并丢弃ENI,以便新实例可以接起它。对于您的用例来说可能是必需的,也可能不是必需的。

  • 用户数据中的AWS CLI命令将文件下载到实例上(以下示例)

aws s3api get-object --bucket YOURBUCKETNAME --key NAMEOFOBJECT.py /home/ec2-user/NAMEOFOBJECT.py

# coding: utf-8
import boto3
import sys
import time
client = boto3.client('ec2')


# Get the ENI ID

eni = client.describe_network_interfaces(
    Filters=[
        {
            'Name': 'tag:Name',
            'Values': ['Put the name of your ENI tag here']
        },
    ]
)

eni_id = eni['NetworkInterfaces'][0]['NetworkInterfaceId']

# Get ENI status

eni_status = eni['NetworkInterfaces'][0]['Status']
print('Current Status: {}\n'.format(eni_status))

# Detach if in use

if eni_status == 'in-use':
    eni_attach_id = eni['NetworkInterfaces'][0]['Attachment']['AttachmentId']
    eni_detach = client.detach_network_interface(
    AttachmentId=eni_attach_id,
    DryRun=False,
    Force=False
    )
    print(eni_detach)

# Wait until ENI is available

print('start\n-----')

while eni_status != 'available':
    print('checking...')

    eni_state = client.describe_network_interfaces(
        Filters=[
            {
                'Name': 'tag:Name',
                'Values': ['Put the name of your ENI tag here']
            },
        ]
    )

    eni_status = eni_state['NetworkInterfaces'][0]['Status']
    print('ENI is currently: ' + eni_status + '\n')
    if eni_status != 'available':
        time.sleep(10)

print('end')

# Get the instance ID

instance = client.describe_instances(
    Filters=[
        {
            'Name': 'tag:Name',
            'Values': ['Put the tag name of your instance here']
        },
        {
            'Name': 'instance-state-name',
            'Values': ['running']
        }
    ]
)

instance_id = instance['Reservations'][0]['Instances'][0]['InstanceId']

# Attach the ENI

response = client.attach_network_interface(
    DeviceIndex=1,
    DryRun=False,
    InstanceId=instance_id,
    NetworkInterfaceId=eni_id
)