2017-10-18 35 views
11

मेरे पास अब तक यह है लेकिन मुझे कुछ चीजें याद आ रही हैं जैसे क्रॉन जॉब स्क्रिप्ट किया गया। इसे रूट के रूप में नहीं करना चाहते हैं। तो मुझे लगता है कि एक ही समय में पहले उपयोगकर्ता को स्थापित करने के लिए कुछ और किया जा सकता है। लिपि को बेवकूफ होने की आवश्यकता होगी (अगर इसे पहले उसी तर्क के साथ चलाया जाता है तो कुछ भी बदलने के जोखिम के बिना बार-बार चलाया जा सकता है)।एक नए Ubuntu 16.04 सर्वर पर एसएसएल के साथ एक नया nginx उदाहरण स्क्रिप्ट करने का सही तरीका क्या है?

singledomaincertnginx.sh:

#!/bin/bash 
if [ -z "$3" ]; then 
     echo use is "singledomaincertnginx.sh <server-ssh-address> <ssl-admin-email> <ssl-domain>" 
     echo example: "singledomaincertnginx.sh [email protected] [email protected] some-sub-domain.mydomain.com" 
     exit 
fi 
ssh $1 "cat > ~/wks" << 'EOF' 
#!/bin/bash 
echo email: $1 
echo domain: $2 
sudo add-apt-repository -y ppa:certbot/certbot 
sudo apt-get update 
sudo apt-get upgrade -y 
sudo apt-get install -y software-properties-common 
sudo apt-get install -y python-certbot-nginx 
sudo apt-get install -y nginx 
sudo sed -i "s/server_name .*;/server_name $2;/" /etc/nginx/sites-available/default 
sudo systemctl restart nginx.service 
if [[ -e /etc/letsencrypt/live/$2/fullchain.pem ]]; then 
    sudo certbot -n --nginx --agree-tos -m "$1" -d "$2" 
fi 
if [[ ! sudo crontab -l | grep certbot ]]; then 
    # todo: add cron job to renew: 15 3 * * * /usr/bin/certbot renew --quiet 
EOF 
ssh $1 "chmod +x ~/wks" 
ssh -t $1 "bash -x -e ~/wks $2 $3" 
+3

Ansible का उपयोग क्यों नहीं? –

+1

ठीक लग रहा है, समस्या कहां है? – aggsol

+0

यहां-डॉक के अंदर 'फाई' गायब होने के अलावा, अच्छा लग रहा है। हो सकता है कि आपके $ 1 "$ 1" के डीबीएल-उद्धरण के अनुरूप हो? वास्तव में बुलेट प्रूफ होने के लिए, शायद कुछ डीबीएल-जांच जोड़ें कि प्रत्येक चरण काम किया जाता है। आप सभी 'एपीटी-गेट' को '&& '(वास्तव में सभी चरणों) (हां, पागल) और/या लॉग फाइलों की जांच कर सकते हैं जो वास्तव में हुआ है, या Std-err को कैप्चर करें और सुनिश्चित करें कि खाली है, आदि। या आप इसे चीजों के "समाप्त अंत" से देख सकते हैं और एक परीक्षण जोड़ सकते हैं जो आपके "एसएसएल के साथ nginx उदाहरण" साबित करता है। (उपरोक्त सभी मान्य क्यू)। सौभाग्य! – shellter

उत्तर

1

ऐसा करने के कई तरीके हैं और वे माना जा सकता है "उचित" परिदृश्य के आधार पर।

एक तरह से बूट समय पर यह करने के लिए एडब्ल्यूएस का उपयोग कर के मामले में cloud-init का उपयोग किया जा सकता है, परीक्षण के लिए जब बनाने उदाहरण आप अपने कस्टम स्क्रिप्ट जोड़ सकते हैं:

enter image description here

यह running commands on launch of your instance की अनुमति देगा, यदि आप इस प्रक्रिया को स्वचालित करना चाहते हैं (कोड जैसे आधारभूत संरचना) उदाहरण के लिए आप terraform

यदि किसी कारण से आपके पास पहले से ही उदाहरण है और चल रहा है और केवल मांग पर अपडेट करना चाहते हैं लेकिन एसएसएच का उपयोग नहीं करना चाहते हैं, तो आप एलडी saltstack का उपयोग करें।

, के बारे में "Idempotency" Ansible भी ऐसा करने के लिए एक बहुत अच्छा उपकरण हो सकता बात कर रहे ansible glossary से:

कोई कार्रवाई idempotent है अगर एक बार यह प्रदर्शन करने का परिणाम के परिणाम के रूप बिल्कुल वैसा ही है किसी भी हस्तक्षेप कार्यों के बिना इसे बार-बार प्रदर्शन करना।

ऐसे कई टूल हैं जो आपको यह प्राप्त करने में मदद कर सकते हैं, केवल एक चीज है जो आपकी आवश्यकताओं/परिदृश्य को बेहतर तरीके से अनुकूलित करती है।

1

आप कुछ इस तरह के लिए देख रहे: अंत में

if [[ "$(grep '/usr/bin/certbot' /var/spool/cron/crontabs/$(whoami))" = "" ]] 
then 
    echo "15 3 * * * /usr/bin/certbot renew --quiet" >> /var/spool/cron/crontabs/$(whoami) 
fi 

और फाई

आप भी उनकी तरह श्रृंखलाबद्ध द्वारा इतना sudo कर से बचने कर सकते में:

sudo bash -c 'add-apt-repository -y ppa:certbot/certbot;apt-get update;apt-get upgrade -y;apt-get install -y software-properties-common python-certbot-nginx nginx;sed -i "s/server_name .*;/server_name $2;/" /etc/nginx/sites-available/default;systemctl restart nginx.service' 
1

यदि आप सूडो के साथ ऐसा कर रहे हैं तो आप इसे रूट

के रूप में कर रहे हैं imple बात ansible में करने के लिए, सबसे अच्छा क्रॉन जॉब करने के लिए वहाँ

यह करने के लिए इस है:

CRON_FILE = "/ etc/cron.d/certbot"

अगर [! -फ $ CRON_FILE]; तो

गूंज '15 3 * * */usr/bin/certbot --quiet नवीनीकृत '> $ CRON_FILE

फाई

2

मैं अब तक इस है, लेकिन मैं के एक जोड़े याद कर रहा हूँ क्रॉन नौकरी स्क्रिप्ट की तरह चीजें।

if ! sudo crontab -l | grep certbot; then 
    echo "15 3 * * * /usr/bin/certbot renew --quiet" | sudo tee -a /var/spool/cron/crontabs/root >/dev/null 
fi 

यहाँ है एक और तरीका है मैं पसंद है क्योंकि यह crontabs के रास्ते में पता करने की जरूरत नहीं है:

if ! sudo crontab -l | grep certbot; then 
    sudo crontab -l | { cat; echo "15 3 * * * /usr/bin/certbot renew --quiet"; } | sudo crontab - 
fi 

यहाँ पूरा करने के लिए एक ही रास्ता (और सही) आप क्या शुरू कर दिया

मुझे कुछ याद आ रही है यह है कि सर्टिफिकेट फ़ाइल /etc/letsencrypt/live/$domain/fullchain.pem कैसे बनाई जाती है। क्या आप इसे अन्य माध्यमों से प्रदान करते हैं, या क्या आपको उस हिस्से के साथ मदद चाहिए?

इसे रूट के रूप में नहीं करना चाहते हैं।

चरणों में से अधिकांश apt-get, चल शामिल है और उस के लिए आप पहले से ही जड़ आवश्यकता होती है। शायद आप का मतलब है कि आप रूट का उपयोग करके नवीनीकरण नहीं करना चाहते हैं। कुछ सेवाएं रूट के बजाय समर्पित उपयोगकर्ता के रूप में काम करती हैं, लेकिन documentation of certbot के माध्यम से देखकर मैंने ऐसा कुछ नहीं देखा है। तो रूट, के साथ नवीकरण करने के लिए यह एक सामान्य प्रथा प्रतीत होता है, इसलिए रूट के क्रोंटब में नवीनीकरण कमांड जोड़ने से मुझे ठीक लगता है।

मैं स्क्रिप्ट में चीजों के एक जोड़े में सुधार होगा यह और अधिक मजबूत बनाने के लिए:

  • स्थितीय मापदंडों $1, $2 और इतने पर चारों ओर बिखरे हुए, का ट्रैक खो करने के लिए आसान कर रहे हैं जो त्रुटियों का कारण बन सकता । मैं उन्हें उचित नाम दूंगा।

  • कमांड लाइन तर्क सत्यापन if [ -z "$3" ] कमजोर है, मैं इसे if [ $# != 3 ] के रूप में अधिक सख्त बना दूंगा।

  • रिमोट स्क्रिप्ट उत्पन्न होने के बाद, आप इसे bash -e के साथ कॉल करते हैं, जो सुरक्षा के लिए अच्छा है। लेकिन अगर -e के बिना किसी और चीज द्वारा स्क्रिप्ट को बुलाया जाता है, तो सुरक्षा वहां नहीं होगी। set -e के साथ स्क्रिप्ट में स्वयं को सुरक्षित रखना बेहतर होगा। मैं आगे जाऊंगा और set -euo pipefail का उपयोग करूंगा जो कि और भी सख्त है। और मैं इसे बाहरी लिपि में भी डाल दूंगा।

  • रिमोट स्क्रिप्ट में अधिकांश आदेशों को sudo की आवश्यकता होती है। एक चीज के लिए जो लिखने के लिए कठिन है। दूसरे के लिए, यदि एक कमांड लंबे समय तक समाप्त होता है तो sudo सत्र समाप्त हो जाता है, तो आपको दूसरी बार रूट पासवर्ड दोबारा करना पड़ सकता है, जो परेशान होगा, खासकर यदि आप कॉफी ब्रेक के लिए बाहर निकलते हैं। निष्पादन उपयोगकर्ता के यूआईडी पर चेक जोड़कर हमेशा रूट के रूप में चलाने की आवश्यकता होगी।

  • जब से तुम bash -x ~/wks ... के बजाय सिर्फ ~/wks के साथ दूरदराज के स्क्रिप्ट चलाने, वहाँ है, यह chmod के साथ निष्पादन योग्य बनाने के लिए इतना है कि कदम छोड़ा जा सकता है आवश्यकता नहीं है।

एक साथ (और फिर कुछ) लाना ऊपर, मैं इस तरह लिखना होगा:

#!/bin/bash 

set -euo pipefail 

if [ $# != 3 ]; then 
    echo "Usage: $0 <server-ssh-address> <ssl-admin-email> <ssl-domain>" 
    echo "Example: singledomaincertnginx.sh [email protected] [email protected] some-sub-domain.mydomain.com" 
    exit 1 
fi 

remote=$1 
email=$2 
domain=$3 

remote_script_path=./wks 

ssh $remote "cat > $remote_script_path" << 'EOF' 
#!/bin/bash 

set -euo pipefail 

if [[ "$(id -u)" != 0 ]]; then 
    echo "This script must be run as root. (sudo $0)" 
    exit 1 
fi 

email=$1 
domain=$2 

echo email: $email 
echo domain: $domain 

add-apt-repository -y ppa:certbot/certbot 
apt-get update 
apt-get upgrade -y 
apt-get install -y software-properties-common 
apt-get install -y python-certbot-nginx 
apt-get install -y nginx 
sed -i "s/server_name .*;/server_name $domain;/" /etc/nginx/sites-available/default 
systemctl restart nginx.service 
#service nginx restart 

if [[ -e /etc/letsencrypt/live/$domain/fullchain.pem ]]; then 
    certbot -n --nginx --agree-tos -m $email -d $domain 
fi 

if ! crontab -l | grep -q certbot; then 
    crontab -l | { 
     cat 
     echo 
     echo "15 3 * * * /usr/bin/certbot renew --quiet" 
     echo 
    } | crontab - 
fi 
EOF 

ssh -t $remote "sudo bash -x $remote_script_path $email $domain" 
संबंधित मुद्दे