我创建了一个ENI,我需要使用云形成将它作为辅助ENI动态地附加到我的EC2实例上。当我使用Red Hat AMI时,我必须继续手动配置RHEL,其中包括以下帖子中提到的步骤。
https://www.linux.com/blog/configuring-linux-sudoers-file
有人可以告诉我如何使用云形成使所有这些自动化。有没有办法使用云形成模板中的用户数据来完成所有这些工作?另外,即使我重新启动ec2实例,我也需要确保配置仍然保留(当前配置在重新启动后会被删除。)
答案 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和实例获取预定义的命名标签来工作,然后将两者结合在一起。
进行此设置的先决条件是:
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 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
)