🦔

Argo CDのGetting Startedをシェルスクリプト化した

2022/08/02に公開

1. はじめに

Argo CD公式ドキュメントに記載されているGetting Startedの内容をシェルスクリプト化し、Argo CDをインストール&初期設定してマニフェストを適用する部分を自動化しました。

2. なぜシェルスクリプト化したのか?

私はできるだけ本番運用に近い形でKubernetesと戯れたいと思い、勉強の都度、EKSクラスターを立ててArgo CDをインストールしています。Argo CDのインストールとその設定自体は大した作業ではないのですが、毎回やるのも面倒だなと思い、1コマンドで実現できるようにシェルスクリプト化しました!
ちなみに、もっと面倒なEKSクラスター(EKS on EC2の構成)を構築する部分のIaC化(CDK for Go)については、こちらの記事にまとめていますので興味があればご参照ください^^

3. シェルスクリプト

シェルスクリプトの全体は以下のようになっています。
(実行ログをわかりやすくする工夫をしていますが、完璧に作り込んでいるわけではありませんので、その点はご容赦ください😉)

#!/usr/bin/env bash

# 1. kubeconfigを更新する
aws eks update-kubeconfig --region your-aws-region --name your-cluster-name --profile your-profile
echo -e "\n"

# 2. Argo CDをインストールする
ns_argocd=`kubectl get ns -o json | jq -r '.items[] | .metadata.name' | grep argocd`
if [ -z "$ns_argocd" ]; then
  kubectl create namespace argocd
else
  echo -e "Namespace of argocd already exists\n"
fi

svc_argocd=`kubectl get svc -n argocd -o json | jq -r '.items[] | .metadata.name' | grep argocd-applicationset-controller`
if [ -z "$svc_argocd" ]; then
  echo -e "Start to apply ArgoCD manifest.\n"
  kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
  echo -e "\nApplying ArgoCD manifest"
  count=0
  while [ -z "$svc_argocd" ]; do
    count=`expr $count + 1`
    if [ $count -gt 10 ]; then
      echo -e "Timed out to apply ArgoCD manifest\n"
      break
    fi

    echo -n "."
    sleep 1
    svc_argocd=`kubectl get svc -n argocd -o json | jq -r '.items[] | .metadata.name' | grep argocd-applicationset-controller`
  done
  echo -e "\nSuccessfully applied ArgoCD manifest\n"
  kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'
  echo -e "Successfully changed ArgoCD server to LoadBalancer type\n"
else
  echo -e "ArgoCD manifest has already been applied\n"
fi

# 3. Argo CDのドメインを取得する
external_ip=`kubectl get svc argocd-server -n argocd -o json 2>/dev/null | jq -r '.status.loadBalancer.ingress[].hostname' 2>/dev/null`
if [[ -z $external_ip ]]; then
  echo -e "\nWaiting to start argocd-server"
  count=0
  while [[ -z $external_ip ]]; do
    count=`expr $count + 1`
    if [ $count -gt 10 ]; then
      echo -e "Timed out waiting for argocd-server to start"
      break
    fi

    echo -n "."
    sleep 1
    external_ip=`kubectl get svc argocd-server -n argocd -o json 2>/dev/null | jq -r '.status.loadBalancer.ingress[].hostname' 2>/dev/null`
  done
fi
echo -e "\n"

# 4. Argo CDの初期ユーザー名を設定する
initial_user="admin"

# 5. adminユーザーの初期パスワードを取得する
initial_password=`kubectl -n argocd get secret/argocd-initial-admin-secret -o jsonpath="{.data.password}" 2>/dev/null | base64 -d; echo`
if [[ -z $initial_password ]]; then
  echo -e "\nWaiting to start secret/argocd-initial-admin-secret"
  count=0
  while [[ -z $initial_password ]]; do
    count=`expr $count + 1`
    if [ $count -gt 20 ]; then
      echo -e "Timed out waiting for secret/argocd-initial-admin-secret to start"
      break
    fi

    echo -n "."
    sleep 1
    initial_password=`kubectl -n argocd get secret/argocd-initial-admin-secret -o jsonpath="{.data.password}" 2>/dev/null | base64 -d; echo`
  done
fi

# 6. Argo CDへログインする
if [ -n "$initial_password" ]; then
  echo -e "\nLogin to Argo CD" 
  accessable_to_argocd=`nslookup -type=ns $external_ip | grep "Authoritative answers can be found from"`
  count=0
  while [ -z "$accessable_to_argocd" ]; do
    count=`expr $count + 1`
    if [ $count -gt 90 ]; then
      echo -e "Timed out to login to Argo CD"
      break
    fi

    echo -n "."
    sleep 1
    accessable_to_argocd=`nslookup -type=ns $external_ip | grep "Authoritative answers can be found from"`
  done
  argocd login "$external_ip" --username admin --password "$initial_password" --insecure

  # 7. adminユーザーの初期パスワードを更新する
  new_password=`openssl rand -base64 6`
  echo -e "\nChange your login password to $new_password"
  argocd account update-password --account admin --current-password "$initial_password" --new-password "$new_password" --insecure
  echo -e "\n"

  # 8. 初期パスワードを格納していたSecretリソースを削除する
  kubectl --namespace argocd delete secret/argocd-initial-admin-secret
  echo -e "\n"
else
  :
fi

# 9. Argo CDのドメイン・ユーザー名・パスワードを表示する
echo "*********************************************************************************************"
echo "External IP      : $external_ip"
echo "Initial User     : $initial_user"
echo "Initial Password : $initial_password"
echo "New Password     : $new_password"
echo "*********************************************************************************************"
echo -e "\n"

# 10. アプリケーションをデプロイする
kubectl apply -f ./your_application.yaml

4. ちょっと解説

シェルスクリプトのコメントに振っている番号順に概要を説明していきます。

4-1. kubeconfigを更新する

AWS CLI update-kubeconfigコマンドでkubeconfigを更新しています。your-aws-regionyour-cluster-nameyour-profileはご自身の値に書き換えてください。

4-2. Argo CDをインストールする

まず、argocdというネームスペースがまだ存在しない場合は作成します。次に、argocd-applicationset-controllerというServiceリソースが存在していなければ(=まだArgo CDがインストールされていなければ)、Argo CDをインストールします。そして、argocd-serverというServiceリソースをLoadBalancerタイプに変更し、外部アクセスを可能とします。

4-3. Argo CDのドメインを取得する

Argo CDをインストールしてからargocd-serverが起動するまでに多少時間がかかるので、ここでは、1秒ごとに最大10秒までArgo CDドメインの取得を試みています。コマンドの後ろに2>/dev/nullを追加しているのは、標準エラーの内容を破棄して実行ログの見栄えを良くするためです。ループの中で標準エラーが出力されるのは鬱陶しいですので^^

4-4. Argo CDの初期ユーザー名を設定する

adminとしてログインするので、ここでは代入しているだけですね。

4-5. adminユーザーの初期パスワードを取得する

adminユーザーの初期パスワードはargocd-initial-admin-secretというSecretリソースの中に記録されているので、この値を取得しています。ここでも、argocd-initial-admin-secretが起動するのに時間がかかるので、1秒ごとに最大20秒まで初期パスワードの取得を試みています。

4-6. Argo CDへログインする

adminユーザーの初期パスワードが存在する場合はArgo CDへログインします。このスクリプトの最後で初期パスワードを格納しているSecretを削除するので、初期パスワードが存在するということはこのスクリプトの実行は初めてということになるからです。ここでも、Argo CDのDNSが起動するまでに時間がかかるためArgo CDのドメインが有効になるのを1秒ごとに確認し、有効になった後でログインを試みています。

4-7. adminユーザーの初期パスワードを更新する

opensslコマンドを利用してランダムな文字列を生成し、パスワードをこれに置き換えています。

4-8. 初期パスワードを格納していたSecretリソースを削除する

パスワードを更新したため、初期パスワードを格納していたargocd-initial-admin-secretが不要になり、これを削除しています。

4-9. Argo CDのドメイン・ユーザー名・パスワードを表示する

以上で取得したドメイン・ユーザー名・パスワードをわかりやすく表示しています。

4-10. アプリケーションをデプロイする

最後に、アプリケーションをデプロイして完了です🎉

5. シェルスクリプトの実行結果

上述のスクリプトを実行した結果をサンプルとして貼っておきます。

myname%@mynamenoMacBook-Air ~/mypath
→ argocd/bootstrap/init.sh
Enter MFA code for arn:aws:iam::xxxxxxxxxxxx:mfa/myuser: 
Updated context arn:aws:eks:my-region:xxxxxxxxxxxx:cluster/my-cluster-name in /Users/myname/.kube/config


namespace/argocd created
Start to apply ArgoCD manifest.

customresourcedefinition.apiextensions.k8s.io/applications.argoproj.io created
customresourcedefinition.apiextensions.k8s.io/applicationsets.argoproj.io created
customresourcedefinition.apiextensions.k8s.io/appprojects.argoproj.io created
serviceaccount/argocd-application-controller created
serviceaccount/argocd-applicationset-controller created
serviceaccount/argocd-dex-server created
serviceaccount/argocd-notifications-controller created
serviceaccount/argocd-redis created
serviceaccount/argocd-repo-server created
serviceaccount/argocd-server created
role.rbac.authorization.k8s.io/argocd-application-controller created
role.rbac.authorization.k8s.io/argocd-applicationset-controller created
role.rbac.authorization.k8s.io/argocd-dex-server created
role.rbac.authorization.k8s.io/argocd-notifications-controller created
role.rbac.authorization.k8s.io/argocd-server created
clusterrole.rbac.authorization.k8s.io/argocd-application-controller created
clusterrole.rbac.authorization.k8s.io/argocd-server created
rolebinding.rbac.authorization.k8s.io/argocd-application-controller created
rolebinding.rbac.authorization.k8s.io/argocd-applicationset-controller created
rolebinding.rbac.authorization.k8s.io/argocd-dex-server created
rolebinding.rbac.authorization.k8s.io/argocd-notifications-controller created
rolebinding.rbac.authorization.k8s.io/argocd-redis created
rolebinding.rbac.authorization.k8s.io/argocd-server created
clusterrolebinding.rbac.authorization.k8s.io/argocd-application-controller created
clusterrolebinding.rbac.authorization.k8s.io/argocd-server created
configmap/argocd-cm created
configmap/argocd-cmd-params-cm created
configmap/argocd-gpg-keys-cm created
configmap/argocd-notifications-cm created
configmap/argocd-rbac-cm created
configmap/argocd-ssh-known-hosts-cm created
configmap/argocd-tls-certs-cm created
secret/argocd-notifications-secret created
secret/argocd-secret created
service/argocd-applicationset-controller created
service/argocd-dex-server created
service/argocd-metrics created
service/argocd-notifications-controller-metrics created
service/argocd-redis created
service/argocd-repo-server created
service/argocd-server created
service/argocd-server-metrics created
deployment.apps/argocd-applicationset-controller created
deployment.apps/argocd-dex-server created
deployment.apps/argocd-notifications-controller created
deployment.apps/argocd-redis created
deployment.apps/argocd-repo-server created
deployment.apps/argocd-server created
statefulset.apps/argocd-application-controller created
networkpolicy.networking.k8s.io/argocd-application-controller-network-policy created
networkpolicy.networking.k8s.io/argocd-dex-server-network-policy created
networkpolicy.networking.k8s.io/argocd-redis-network-policy created
networkpolicy.networking.k8s.io/argocd-repo-server-network-policy created
networkpolicy.networking.k8s.io/argocd-server-network-policy created

Applying ArgoCD manifest
.
Successfully applied ArgoCD manifest

service/argocd-server patched
Successfully changed ArgoCD server to LoadBalancer type


Waiting to start argocd-server
..


Waiting to start secret/argocd-initial-admin-secret
.....
Login to Argo CD
.....................................................'admin:login' logged in successfully
Context 'a6854b4f776f1437fb1c32d966c566b3-1676847073.my-region.elb.amazonaws.com' updated

Change your login password to M2d6DseQ
Password updated
Context 'a6854b4f776f1437fb1c32d966c566b3-1676847073.my-region.elb.amazonaws.com' updated


secret "argocd-initial-admin-secret" deleted


*********************************************************************************************
External IP      : a6854b4f776f1437fb1c32d966c566b3-1676847073.my-region.elb.amazonaws.com
Initial User     : admin
Initial Password : kwKK6Pu33Cd1lMB1
New Password     : M2d6DseQ
*********************************************************************************************


application.argoproj.io/myapplication created

6. まとめ

本記事では、Argo CD公式ドキュメントに記載されているGetting Startedの内容をシェルスクリプト化しました。Kubernetes環境を勉強の都度構築している方々にとっては、環境構築の効率が上がってちょっと便利になるかもです。

Discussion