Tôi có điều này cho đến nay nhưng tôi thiếu một vài những thứ như nhận được cron job scripted.
Dưới đây là một cách để hoàn thành (và đúng) những gì bạn bắt đầu:
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
Dưới đây là một cách khác tôi thích bởi vì nó không cần phải biết đường dẫn của crontabs:
if ! sudo crontab -l | grep certbot; then
sudo crontab -l | { cat; echo "15 3 * * * /usr/bin/certbot renew --quiet"; } | sudo crontab -
fi
Điều tôi thấy thiếu là cách tệp giấy chứng nhận /etc/letsencrypt/live/$domain/fullchain.pem
được tạo. Bạn có cung cấp điều đó bằng các cách khác, hoặc bạn có cần trợ giúp với phần đó không?
Không muốn làm điều này dưới dạng gốc.
Hầu hết các bước liên quan đến việc chạy apt-get
, và cho rằng bạn đã yêu cầu root. Có lẽ bạn có nghĩa là bạn không muốn làm gia hạn bằng cách sử dụng gốc. Một số dịch vụ hoạt động như một người dùng chuyên dụng thay vì root, nhưng nhìn qua documentation of certbot Tôi chưa thấy bất cứ điều gì như thế. Vì vậy, có vẻ như một thực tế phổ biến để làm gia hạn với gốc, để thêm lệnh gia hạn vào crontab của root có vẻ tốt với tôi.
tôi sẽ cải thiện một vài điều trong kịch bản để làm cho nó mạnh mẽ hơn:
Các tham số vị trí $1
, $2
và vân vân nằm rải rác xung quanh rất dễ bị mất theo dõi, điều này có thể dẫn đến sai sót . Tôi sẽ cho họ tên riêng.
Xác thực đối số dòng lệnh if [ -z "$3" ]
yếu, tôi sẽ thực hiện điều đó nghiêm ngặt hơn như if [ $# != 3 ]
.
Khi tập lệnh từ xa được tạo, bạn hãy gọi nó bằng bash -e
, cách tốt để bảo vệ. Nhưng nếu kịch bản được gọi bởi một cái gì đó khác mà không có -e
, các biện pháp bảo vệ sẽ không có ở đó. Nó sẽ là tốt hơn để xây dựng mà tự vệ vào kịch bản chính nó với set -e
. Tôi sẽ đi xa hơn và sử dụng set -euo pipefail
thậm chí còn nghiêm ngặt hơn. Và tôi cũng sẽ đặt nó trong kịch bản bên ngoài.
Hầu hết các lệnh trong tập lệnh từ xa yêu cầu sudo
. Đối với một điều đó là tẻ nhạt để viết. Đối với một lệnh khác, nếu một lệnh kết thúc mất một thời gian dài sao cho phiên sudo
hết hạn, bạn có thể phải nhập lại mật khẩu gốc lần thứ hai, điều này sẽ gây phiền toái, đặc biệt là nếu bạn bước ra để ngắt cà phê. Nó sẽ là tốt hơn để yêu cầu phải luôn luôn chạy như là người chủ, bằng cách thêm một kiểm tra trên uid của người dùng thực hiện.
Vì bạn chạy tập lệnh từ xa với bash -x ~/wks ...
thay vì chỉ ~/wks
, bạn không cần phải thực thi nó với chmod
, do đó, bước đó có thể bị xóa.
Đưa trên cùng (và sau đó một số), tôi sẽ viết như thế này:
#!/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"
Tại sao không sử dụng Ansible? –
Có vẻ ổn, vấn đề ở đâu? – aggsol
ngoại trừ thiếu 'fi' bên trong tài liệu ở đây, có vẻ tốt. Có thể phù hợp với dbl-quoting của bạn của '" $ 1 "'? Để được thực sự chống đạn, có thể thêm một số kiểm tra dbl rằng mỗi bước được làm việc. Bạn có thể chuỗi tất cả các 'apt-get' cùng với '&&' s (thực sự tất cả các bước) (có, điên) và/hoặc kiểm tra các tệp nhật ký mà công cụ đã thực sự xảy ra hoặc chụp Std-err và đảm bảo nó là trống rỗng, vv HOẶC bạn có thể nhìn vào nó từ "kết thúc hoàn thành" của sự vật và thêm một thử nghiệm chứng minh "nginx dụ với SSL" của bạn đang làm việc theo yêu cầu. (Tất cả các câu hỏi hợp lệ ở trên). Chúc may mắn! – shellter