2016-01-11 45 views
5

Tôi có vài trường hợp trên GCE mà tôi không thực sự cần địa chỉ tĩnh, nhưng tôi vẫn cần phải làm cho chúng có thể truy cập thông qua tên dns. Vì địa chỉ IP bên ngoài tạm thời thay đổi mỗi khi một cá thể được khởi động lại, tôi nghĩ rằng tôi có thể sử dụng một số loại tập lệnh khởi động để cập nhật mục nhập dns cho cá thể đó trong Google Cloud DNS (giống như các đoạn mã).Cách cập nhật Google Cloud DNS với IP tạm thời cho một trường hợp

Tôi đã bỏ lỡ điều gì đó và có cách nào dễ dàng hơn để ánh xạ địa chỉ IP bên ngoài tạm thời thành bản ghi dns qua gcloud không?

Nếu không, bất kỳ gợi ý nào về cách viết tập lệnh như vậy sẽ được đánh giá cao!

Trả lời

5

Giả định sau cho rằng bạn đang sử dụng Google Cloud DNS cho foo.bar.com (ví dụ: dns name "foo.bar.com.") Với tên vùng "foo-bar-com" trong cùng một dự án với VM và VM của bạn có tùy chọn cấu hình "Ví dụ này có quyền truy cập API đầy đủ cho tất cả các dịch vụ của Google Cloud". đã chọn. Máy ảo của bạn sẽ được gọi là "my-vm.foo.bar.com" trong DNS.

Tôi chắc chắn điều này có thể được sửa đổi thích hợp để hoạt động với DNS trong một dự án khác và/hoặc nhiều quyền hạn chế hơn.

Có thể đáng chú ý: điều này giả định bạn đang sử dụng 'Google Cloud DNS' chứ không phải (chỉ) 'Google Domains', nếu bạn đang sử dụng công cụ đăng ký sau (để lưu trữ DNS của mình và không phải là công ty đăng ký) họ có hỗ trợ trực tiếp cho địa chỉ IP động tổng hợp với một số dyndns như cơ chế cập nhật (nhưng chúng bị giới hạn trong một loạt các cách khác). Cũng lưu ý rằng để giao dịch thành công, đã có bản ghi với đúng IP và TTL đúng (tức là lần đầu tiên bạn chạy điều này, bạn có thể xóa bất kỳ mục nhập nào bằng tay qua giao diện người dùng và chạy mã này với dns_del đã nhận xét).

#!/bin/bash 

ttlify() { 
    local i 
    for i in "[email protected]"; do 
    [[ "${i}" =~ ^([0-9]+)([a-z]*)$ ]] || continue 
    local num="${BASH_REMATCH[1]}" 
    local unit="${BASH_REMATCH[2]}" 
    case "${unit}" in 
        weeks|week|wee|we|w) unit=''; num=$[num*60*60*24*7];; 
          days|day|da|d) unit=''; num=$[num*60*60*24];; 
        hours|hour|hou|ho|h) unit=''; num=$[num*60*60];; 
     minutes|minute|minut|minu|min|mi|m) unit=''; num=$[num*60];; 
     seconds|second|secon|seco|sec|se|s) unit=''; num=$[num];; 
    esac 
    echo "${num}${unit}" 
    done 
} 

dns_start() { 
    gcloud dns record-sets transaction start -z "${ZONENAME}" 
} 

dns_info() { 
    gcloud dns record-sets transaction describe -z "${ZONENAME}" 
} 

dns_abort() { 
    gcloud dns record-sets transaction abort -z "${ZONENAME}" 
} 

dns_commit() { 
    gcloud dns record-sets transaction execute -z "${ZONENAME}" 
} 

dns_add() { 
    if [[ -n "$1" && "$1" != '@' ]]; then 
    local -r name="$1.${ZONE}." 
    else 
    local -r name="${ZONE}." 
    fi 
    local -r ttl="$(ttlify "$2")" 
    local -r type="$3" 
    shift 3 
    gcloud dns record-sets transaction add  -z "${ZONENAME}" --name "${name}" --ttl "${ttl}" --type "${type}" "[email protected]" 
} 

dns_del() { 
    if [[ -n "$1" && "$1" != '@' ]]; then 
    local -r name="$1.${ZONE}." 
    else 
    local -r name="${ZONE}." 
    fi 
    local -r ttl="$(ttlify "$2")" 
    local -r type="$3" 
    shift 3 
    gcloud dns record-sets transaction remove -z "${ZONENAME}" --name "${name}" --ttl "${ttl}" --type "${type}" "[email protected]" 
} 

lookup_dns_ip() { 
    host "$1" | sed -rn '[email protected]^.* has address @@p' 
} 

my_ip() { 
    ip -4 addr show dev eth0 | sed -rn '[email protected]^ inet ([0-9.]+).*@\[email protected]' 
} 

doit() { 
    ZONE=foo.bar.com 
    ZONENAME=foo-bar-com 
    dns_start 
    dns_del my-vm 5min A `lookup_dns_ip "my-vm.${ZONE}."` 
    dns_add my-vm 5min A `my_ip` 
    dns_commit 
} 
+0

cảm ơn bạn rất nhiều, tôi sẽ thử ngay bây giờ! – s3ncha

1

Đã một thời gian kể từ khi bạn đăng câu hỏi này, nhưng tôi sẽ đăng câu trả lời của tôi ở đây để tham khảo trong tương lai.

Tôi đã có nhu cầu tương tự và tôi không muốn sử dụng gcloud CLI.

tôi đã tạo ra một kịch bản python đơn giản mà hiện khá nhiều giống như kịch bản bash trên không, nhưng sử dụng Apache LibcloudGoogle Cloud chứng chỉ API (tài khoản dịch vụ và key).

Bạn có thể tìm mã trong GitHub.

Các vấn đề liên quan