åºäºÂVaultçÂÂæÂÂæÂÂä¿¡æ¯ä¿Âæ¤
èÂÂæ¯
å¨åºÂç¨ç¨ÂåºÂçÂÂé Âç½®ä¸Âï¼ÂæÂÂä¸Â类信æ¯æ¯Âè¾ÂæÂÂæÂÂï¼Âæ¯Âå¦Âæ°æ®åºÂçÂÂç¨æ·åÂÂ/å¯Âç ÂãÂÂäºÂå¹³å°ç AK/SKãÂÂÃ¥ÂÂ秠API keysãÂÂÃ¥ÂÂ类账å·/å¯Âç ÂçÂÂï¼Âè¿ÂäºÂä¿¡æ¯çÂÂæ³Âé²ä¼Â带æ¥严éÂÂçÂÂå®Âå ¨é®é¢ÂãÂÂ
ç¶èÂÂå¨å®Âé çÂÂ产活å¨ä¸Âï¼Âè¿ÂäºÂæÂÂæÂÂä¿¡æ¯çÂÂ管çÂÂæÂÂå¾Â大çÂÂæ¼Âæ´Âï¼ÂÃ¥ÂÂå¨å¾Â大çÂÂæ³Âé²é£Âé©ï¼Â
- 代ç ÂæÂÂé Â置以æÂÂæÂÂå½¢å¼Âè®°å½ÂæÂÂæÂÂä¿¡æ¯ï¼ÂÃ¥ÂÂæ¾å¨代ç Âä»ÂåºÂä¸Âï¼ÂçÂÂè³误ä¸Âä¼ å° GitHubï¼Â
- æÂÂæÂÂä¿¡æ¯çÂÂçÂÂæÂÂãÂÂÃ¥ÂÂÃ¥ÂÂãÂÂä¿Â管ãÂÂé¨署堨æµÂç¨Âç»Âå¤Â人ä¹ÂæÂÂï¼Â缺ä¹ÂæÂÂæÂÂçÂÂ管æ§æÂÂ段ï¼Â
- æÂÂæÂÂä¿¡æ¯çÂÂæÂÂä¹ÂÃ¥ÂÂé¿æÂÂæÂÂæÂÂï¼Â没æÂÂèªå¨轮转æºå¶ï¼Âå 大äºÂæ³Âé²é£Âé©åÂÂå½±åÂÂç¨Â度ãÂÂ
æÂÂæÂÂä¿¡æ¯ä¿Âæ¤æ¯ç½Âç»Âå®Â堨工ä½ÂçÂÂä¸Â个éÂÂè¦Âé¨åÂÂãÂÂ
æÂÂæÂÂä¿¡æ¯ä¿Âæ¤
æÂÂæÂÂä¿¡æ¯ä¿Âæ¤æ¯ä¸Â个æ¯Âè¾Âå¤ÂæÂÂçÂÂç³»ç»Âæ§工ä½Âï¼Â主è¦Âå æ¬以ä¸Âå 个é¨åÂÂï¼Â
- è¦ÂæÂÂä¸Â个ä¸Âé¨çÂÂå¹³å°æÂ¥æÂÂ管æÂÂæÂÂä¿¡æ¯ï¼Âæ¾ÂÂéÂÂç¨ HashiCorp å ¬å¸å¼ÂæºÂç Vault 工堷
- åºÂç¨ç¨ÂåºÂè¦Âä¸Â该平å°éÂÂæÂÂï¼Âä»Âå¹³å°è·åÂÂæÂÂæÂÂä¿¡æ¯ï¼Â并å®ÂæÂÂç»Âç§ÂÃ¥ÂÂ轮转çÂÂæÂÂä½Â
- é¨署工堷è¦Âä¸Â该平å°éÂÂæÂÂï¼Â为åºÂç¨ç¨ÂåºÂ注堥ç»å½Âå¹³å°æÂÂéÂÂçÂÂ身份åÂÂæ®
Vault æ¯ä¸Â个强大çÂÂæÂÂæÂÂä¿¡æ¯管çÂÂ工堷ï¼Âèª带äºÂå¤Âç§Â认è¯Âå¼ÂæÂÂÃ¥ÂÂå¯Âç Âå¼ÂæÂÂï¼Â并éÂÂè¿ÂæÂÂ件æºå¶å Â许èªå®Âä¹Âå¼ÂæÂÂï¼Âå¯åºÂç¨äºÂå¤Âç§Â常è§ÂçÂÂæÂÂæÂÂä¿¡æ¯ä¿Âæ¤åºæ¯ï¼Âå ·ä½Âç¨æ³Âæ¾ÂÂä¸ÂÃ¥ÂÂä»Âç»Âï¼Â请åÂÂèÂÂVaultå®Âæ¹æÂÂæ¡£ãÂÂè³äºÂé¨署åÂÂå¸Â工堷丠Vault çÂÂéÂÂæÂÂï¼Âä¸ÂæÂÂ使ç¨çÂÂé¨署工堷åÂÂÃ¥ÂÂå¸ÂæµÂ水线æÂÂå ³ï¼Âæ¯Â个堬å¸ä¸Âå°½ç¸åÂÂï¼Âæ¾ÂÂä¹Âä¸ÂÃ¥ÂÂ详ç»Âå±Âå¼ÂãÂÂ
æ¾ÂÂ主è¦Âæ¢讨åºÂç¨ç¨ÂåºÂ丠Vault çÂÂéÂÂæÂÂï¼Â以æ°æ®åºÂÃ¥ÂÂæ®为ä¾Âï¼Âä»Âç»ÂåºÂç¨ç¨ÂåºÂå¦Âä½Âå®Âå ¨å°仠Vault è·åÂÂæÂÂæÂÂä¿¡æ¯ï¼Â并è¿Âä¸ÂæÂ¥å®Âç°èªå¨轮转ãÂÂ
åºÂç¨éÂÂæÂÂæ¹æ¡Â
åºÂç¨ç¨ÂåºÂ丠Vault çÂÂéÂÂæÂÂå¯以éÂÂç¨ç´æÂ¥æ¹å¼Âï¼Âå³å¼ÂÃ¥ÂÂè èªè¡Âç¼ÂÃ¥ÂÂ代ç Âå®Âç°ç»å½Â认è¯ÂãÂÂToken ç»Âç§ÂãÂÂè¿ÂæÂÂÃ¥ÂÂç»å½Â以åÂÂæÂÂæÂÂä¿¡æ¯çÂÂè·åÂÂãÂÂç»Âç§ÂÃ¥ÂÂ轮转çÂÂé»è¾Âï¼Âè¿Âç§ÂéÂÂæÂÂæ¹å¼Â对åºÂç¨ç¨ÂåºÂæÂÂè¾Âå¤ÂçÂÂ代ç Â侵堥ï¼Âå®Âç°æÂÂæ¬è¾Âé«ÂãÂÂ
Vault å®Âæ¹æÂÂä¾ÂäºÂä¸Âç§Â对åºÂç¨ç¨ÂåºÂ代ç Âä½Â侵堥çÂÂè³æ 侵堥çÂÂéÂÂæÂÂæ¹æ¡Âï¼Âå³ Vault Agentï¼Âå®Âå®Âç°äºÂ丠Vault Server çÂÂæÂÂæÂÂ交äºÂé»è¾Âï¼Â并ä¸Âè¿Âå¯以éÂÂè¿Â模æ¿åÂÂè½å°Âè·åÂÂçÂÂæÂÂæÂÂä¿¡æ¯渲æÂÂæÂÂæΡé Âç½®æÂÂ件ï¼ÂåºÂç¨ç¨ÂåºÂåªéÂÂè¦Â读åÂÂ该é Âç½®æÂÂ件å³å¯ãÂÂ
æ¾ÂÂéÂÂç¨åº亠Agent çÂÂé´æÂ¥éÂÂæÂÂæ¹æ¡Âï¼ÂAgent è´Âè´£ç»彠Vault 并管ç Token ç»Âç§ÂÃ¥ÂÂè¿ÂæÂÂÃ¥ÂÂç»å½Âï¼Âæ ¹æ®é Â置模æ¿æÂÂ件仠Vault è·åÂÂæÂÂéÂÂçÂÂæÂÂæÂÂä¿¡æ¯ï¼Â渲æÂÂæÂÂæΡé Âç½®æÂÂ件ï¼Â管çÂÂæÂÂæÂÂä¿¡æ¯çÂÂç»Âç§ÂÃ¥ÂÂ轮转ï¼Â并æ´æ°æΡé Âç½®æÂÂ件ï¼ÂåºÂç¨ç¨ÂåºÂåªéÂÂ读åÂÂæΡé Âç½®æÂÂ件è·åÂÂæÂÂæÂÂä¿¡æ¯ï¼Â并æÂÂç»ÂçÂÂå¬该æÂÂ件ï¼Âå½ÂæÂÂ件åÂÂÃ¥ÂÂæ¶è¿Âè¡Âå¨æÂÂæ´æ°ãÂÂè¿Âæ¯ä¸Âç§Âå®Â堨解è¦çÂÂé´æÂ¥éÂÂæÂÂæ¹å¼Âï¼Âå¦Âä¸Âå¾æÂÂ示ãÂÂ
Ã¥ÂÂå¤Âå·¥ä½Â
1. Ã¥ÂÂ建堷æ CRUD æÂÂéÂÂçÂÂæ°æ®åºÂè§Âè²
# é¦Âå Âå¯ç¨æ°æ®åºÂå¯Âç Âå¼ÂæÂÂ$ vault secrets enable database# Ã¥ÂÂ建 MySQL æ°æ®åºÂé Âç½®$ export MYSQL_URL=x.x.x.x:3306$ vault write database/config/mydb \ààààplugin_name=mysql-database-plugin \ààààconnection_url="{{username}}:{{password}}@tcp($MYSQL_URL)/" \ààààallowed_roles="mydb-crud" \ààààusername="root" \ààààpassword="******"# 说æÂÂï¼Â该ç¨æ·éÂÂè¦Âå ·æÂÂç¨æ·管çÂÂæÂÂéÂÂï¼Âæ¤å¤Âç´æ¥使ç¨ root# Ã¥ÂÂ建 mydb-crud è§Âè²ï¼Âå ·æÂÂå¢Âå æ¹æÂ¥å®Âæ´æÂÂéÂÂï¼Â$ vault write database/roles/mydb-crud \ààààdb_name=mydb \ààààcreation_statements="CREATE USER '{{name}}'@'%' IDENTIFIED BY '{{password}}'; GRANT SELECT, INSERT, DELETE, UPDATE ON mydb.* TO '{{name}}'@'%';" \ààààdefault_ttl="2m" \ààààmax_ttl="10m"# 说æÂÂï¼Â为æ¹便æµÂè¯Âï¼Âæ¤夠TTL 设置è¾Âå°Âï¼Âå®Âé 使ç¨æ¶éÂÂè¦Âè¯Âä¼°åÂÂçÂÂçÂÂå¼# æµÂè¯Âè·å mydb-crud è§Âè²çÂÂÃ¥ÂÂæ®ï¼Â并æÂ¥çÂÂéªÂè¯Â$ vault read database/creds/mydb-crud$ vault list sys/leases/lookup/database/creds/mydb-crud# é¦Âå Âå¯ç¨æ°æ®åºÂå¯Âç Âå¼Âæ $ vault secrets enable database # Ã¥ÂÂ建 MySQL æ°æ®åºÂé Âç½® $ export MYSQL_URL=x.x.x.x:3306 $ vault write database/config/mydb \ ààààplugin_name=mysql-database-plugin \ ààààconnection_url="{{username}}:{{password}}@tcp($MYSQL_URL)/" \ ààààallowed_roles="mydb-crud" \ ààààusername="root" \ ààààpassword="******" # 说æÂÂï¼Â该ç¨æ·éÂÂè¦Âå ·æÂÂç¨æ·管çÂÂæÂÂéÂÂï¼Âæ¤å¤Âç´æ¥使ç¨ root # Ã¥ÂÂ建 mydb-crud è§Âè²ï¼Âå ·æÂÂå¢Âå æ¹æÂ¥å®Âæ´æÂÂéÂÂï¼ $ vault write database/roles/mydb-crud \ ààààdb_name=mydb \ ààààcreation_statements="CREATE USER '{{name}}'@'%' IDENTIFIED BY '{{password}}'; GRANT SELECT, INSERT, DELETE, UPDATE ON mydb.* TO '{{name}}'@'%';" \ ààààdefault_ttl="2m" \ ààààmax_ttl="10m" # 说æÂÂï¼Â为æ¹便æµÂè¯Âï¼Âæ¤夠TTL 设置è¾Âå°Âï¼Âå®Âé 使ç¨æ¶éÂÂè¦Âè¯Âä¼°åÂÂçÂÂçÂÂå¼ # æµÂè¯Âè·å mydb-crud è§Âè²çÂÂÃ¥ÂÂæ®ï¼Â并æÂ¥çÂÂéªÂ诠$ vault read database/creds/mydb-crud $ vault list sys/leases/lookup/database/creds/mydb-crud# é¦Âå Âå¯ç¨æ°æ®åºÂå¯Âç Âå¼Âæ $ vault secrets enable database # Ã¥ÂÂ建 MySQL æ°æ®åºÂé Âç½® $ export MYSQL_URL=x.x.x.x:3306 $ vault write database/config/mydb \ ààààplugin_name=mysql-database-plugin \ ààààconnection_url="{{username}}:{{password}}@tcp($MYSQL_URL)/" \ ààààallowed_roles="mydb-crud" \ ààààusername="root" \ ààààpassword="******" # 说æÂÂï¼Â该ç¨æ·éÂÂè¦Âå ·æÂÂç¨æ·管çÂÂæÂÂéÂÂï¼Âæ¤å¤Âç´æ¥使ç¨ root # Ã¥ÂÂ建 mydb-crud è§Âè²ï¼Âå ·æÂÂå¢Âå æ¹æÂ¥å®Âæ´æÂÂéÂÂï¼ $ vault write database/roles/mydb-crud \ ààààdb_name=mydb \ ààààcreation_statements="CREATE USER '{{name}}'@'%' IDENTIFIED BY '{{password}}'; GRANT SELECT, INSERT, DELETE, UPDATE ON mydb.* TO '{{name}}'@'%';" \ ààààdefault_ttl="2m" \ ààààmax_ttl="10m" # 说æÂÂï¼Â为æ¹便æµÂè¯Âï¼Âæ¤夠TTL 设置è¾Âå°Âï¼Âå®Âé 使ç¨æ¶éÂÂè¦Âè¯Âä¼°åÂÂçÂÂçÂÂå¼ # æµÂè¯Âè·å mydb-crud è§Âè²çÂÂÃ¥ÂÂæ®ï¼Â并æÂ¥çÂÂéªÂ诠$ vault read database/creds/mydb-crud $ vault list sys/leases/lookup/database/creds/mydb-crud
2. Ã¥ÂÂ建堷æÂÂä¸Âè¿°æ°æ®åºÂæÂÂéÂÂç AppRole
# å¯ç¨ Approle 认è¯Âå¼ÂæÂÂ$ vault auth enable approle# Ã¥ÂÂ建æÂÂéÂÂçÂÂçÂÂ¥ mydb-policy$ vault policy write mydb-policy -<<EOF#è·åÂÂÃ¥ÂÂæ®çÂÂæÂÂéÂÂpath "database/creds/mydb-crud" {ààcapabilities = [ "read" ]}#ç»Âç§ÂÃ¥ÂÂæ®çÂÂæÂÂéÂÂpath "sys/leases/+/database/creds/mydb-crud/*"à{àcapabilities = [ "update" ]}EOF# Ã¥ÂÂ建堷æ mydb-policy æÂÂéÂÂç AppRole$ vault write auth/approle/role/myapp token_policies="mydb-policy" \ààààtoken_ttl=2m token_max_ttl=10m# æÂ¥çÂÂÃ¥ÂÂ建ç AppRole$ vault read auth/approle/role/myapp# å¯ç¨ Approle 认è¯Âå¼Âæ $ vault auth enable approle # Ã¥ÂÂ建æÂÂéÂÂçÂÂçÂÂ¥ mydb-policy $ vault policy write mydb-policy -<<EOF #è·åÂÂÃ¥ÂÂæ®çÂÂæÂÂé path "database/creds/mydb-crud" { ààcapabilities = [ "read" ] } #ç»Âç§ÂÃ¥ÂÂæ®çÂÂæÂÂé path "sys/leases/+/database/creds/mydb-crud/*"à{ àcapabilities = [ "update" ] } EOF # Ã¥ÂÂ建堷æ mydb-policy æÂÂéÂÂç AppRole $ vault write auth/approle/role/myapp token_policies="mydb-policy" \ ààààtoken_ttl=2m token_max_ttl=10m # æÂ¥çÂÂÃ¥ÂÂ建ç AppRole $ vault read auth/approle/role/myapp# å¯ç¨ Approle 认è¯Âå¼Âæ $ vault auth enable approle # Ã¥ÂÂ建æÂÂéÂÂçÂÂçÂÂ¥ mydb-policy $ vault policy write mydb-policy -<<EOF #è·åÂÂÃ¥ÂÂæ®çÂÂæÂÂé path "database/creds/mydb-crud" { ààcapabilities = [ "read" ] } #ç»Âç§ÂÃ¥ÂÂæ®çÂÂæÂÂé path "sys/leases/+/database/creds/mydb-crud/*"à{ àcapabilities = [ "update" ] } EOF # Ã¥ÂÂ建堷æ mydb-policy æÂÂéÂÂç AppRole $ vault write auth/approle/role/myapp token_policies="mydb-policy" \ ààààtoken_ttl=2m token_max_ttl=10m # æÂ¥çÂÂÃ¥ÂÂ建ç AppRole $ vault read auth/approle/role/myapp
3. è·å AppRole 身份åÂÂæ®@RoleID å SecretID ï¼Â
# è·å RoleID$ vault read -field=role_id auth/approle/role/myapp/role-id >~/.roleid# è·å SecretID$vault write -f -field=secret_id auth/approle/role/myapp/secret-id >~/.secretid# è·å RoleID $ vault read -field=role_id auth/approle/role/myapp/role-id >~/.roleid # è·å SecretID $vault write -f -field=secret_id auth/approle/role/myapp/secret-id >~/.secretid# è·å RoleID $ vault read -field=role_id auth/approle/role/myapp/role-id >~/.roleid # è·å SecretID $vault write -f -field=secret_id auth/approle/role/myapp/secret-id >~/.secretid
ç¶åÂÂç±é¨署åÂÂå¸Â工堷尠RoleID å SecretID 注堥å°åºÂç¨ç¨ÂåºÂæÂÂå¨æÂÂå¡å¨çÂÂ约å®Âä½Âç½®æÂÂ件ä¸ÂãÂÂ
ç»å½Â认è¯Â
Agent ç Auto_Auth Ã¥ÂÂè½å®Âç°äºÂç»å½Â认è¯ÂãÂÂToken ç»Âç§ÂÃ¥ÂÂè¿ÂæÂÂÃ¥ÂÂç»å½ÂçÂÂé»è¾Âï¼Âå Â许æÂÂå®Â认è¯Âæ¹æ³Âå Token ä¿ÂÃ¥ÂÂä½Âç½®ãÂÂè¿ÂéÂÂéÂÂç¨ AppRole 认è¯Âï¼ÂéÂÂè¦ÂæÂÂå® RoleID å SecretID 两个æÂÂ件çÂÂä½Âç½®ï¼Âç±é¨署åÂÂå¸Â工堷注堥ï¼ÂãÂÂ
auto-auth é Âç½®åÂÂå¦Âä¸ÂæÂÂ示ï¼Â
auto_auth {method {type = "approle"config = {role_id_file_path = "/vault/config/approle/roleid"secret_id_file_path = "/vault/config/approle/secretid"remove_secret_id_file_after_reading = false}}sink "file" {config = {path = "/tmp/.vault-token-via-agent"}}}auto_auth { method { type = "approle" config = { role_id_file_path = "/vault/config/approle/roleid" secret_id_file_path = "/vault/config/approle/secretid" remove_secret_id_file_after_reading = false } } sink "file" { config = { path = "/tmp/.vault-token-via-agent" } } }auto_auth { method { type = "approle" config = { role_id_file_path = "/vault/config/approle/roleid" secret_id_file_path = "/vault/config/approle/secretid" remove_secret_id_file_after_reading = false } } sink "file" { config = { path = "/tmp/.vault-token-via-agent" } } }
è·åÂÂæ°æ®åºÂÃ¥ÂÂæ®
Agent ç Template Ã¥ÂÂè½å¯以根æ®æÂÂå®Âä½Âç½®çÂÂ模æ¿æÂÂ件è·åÂÂæÂÂéÂÂçÂÂæÂÂæÂÂä¿¡æ¯ï¼Âå¡«å  ãÂÂ渲æÂÂæÂÂé Âç½®æÂÂ件ï¼Âä¿ÂÃ¥ÂÂå¨æÂÂå®Âä½Âç½®ï¼Âå½Â渲æÂÂåºçÂÂç»ÂæÂÂæÂÂ件åÂÂçÂÂÃ¥ÂÂÃ¥ÂÂæ¶è¿Âå¯以æ§è¡Âç»Âå®ÂçÂÂå½令ãÂÂ
template ç¸堳çÂÂé Âç½®åÂÂå¦Âä¸ÂæÂÂ示ï¼Â
template_config {exit_on_retry_failure = true}template {error_on_missing_key = truesource = "/vault/config/appconf/config.ctmpl"destination = "/vault/config/appconf/config.yaml.tmp"exec {command = ["dd", "if=/vault/config/appconf/config.yaml.tmp", "of=/vault/config/appconf/config.yaml" ]timeout = "5s"}}template_config { exit_on_retry_failure = true } template { error_on_missing_key = true source = "/vault/config/appconf/config.ctmpl" destination = "/vault/config/appconf/config.yaml.tmp" exec { command = ["dd", "if=/vault/config/appconf/config.yaml.tmp", "of=/vault/config/appconf/config.yaml" ] timeout = "5s" } }template_config { exit_on_retry_failure = true } template { error_on_missing_key = true source = "/vault/config/appconf/config.ctmpl" destination = "/vault/config/appconf/config.yaml.tmp" exec { command = ["dd", "if=/vault/config/appconf/config.yaml.tmp", "of=/vault/config/appconf/config.yaml" ] timeout = "5s" } }
éÂ
Â置模æ¿æÂÂ件config.ctmpl
éÂÂè¿Â模æ¿è¯Âè¨ÂæÂÂå®ÂæÂÂæÂÂä¿¡æ¯çÂÂå ä½Â符åÂÂè·åÂÂè·¯å¾Âï¼Âç» Agent 渲æÂÂÃ¥ÂÂçÂÂæÂÂåºÂç¨ç¨ÂåºÂè½è¯Âå«çÂÂéÂ
Âç½®æÂÂ件config.yaml
ãÂÂéÂ
Â置模æ¿æÂÂ件çÂÂç¸åÂ
³çÂÂ段å¦Âä¸ÂæÂÂ示ï¼Â
# config.ctmpldatabase:mysql:{{- with secret "database/creds/mydb-crud" }}username: {{ .Data.username }}password: {{ .Data.password }}{{- end }}address : x.x.x.x:3306dbname : mydboptions : charset=utf8mb4&parseTime=True&loc=Local# config.ctmpl database: mysql: {{- with secret "database/creds/mydb-crud" }} username: {{ .Data.username }} password: {{ .Data.password }} {{- end }} address : x.x.x.x:3306 dbname : mydb options : charset=utf8mb4&parseTime=True&loc=Local# config.ctmpl database: mysql: {{- with secret "database/creds/mydb-crud" }} username: {{ .Data.username }} password: {{ .Data.password }} {{- end }} address : x.x.x.x:3306 dbname : mydb options : charset=utf8mb4&parseTime=True&loc=Local
åºÂç¨ç¨ÂåºÂ读åÂÂæΡéÂ
Âç½®æÂÂ件config.yaml
å³å¯è·åÂÂæ°æ®åºÂÃ¥ÂÂæ®ï¼Âä¸ÂéÂÂè¦Â丠Vault è¿Âè¡Â交äºÂï¼Âå®Âç°äºÂ丠Vault çÂÂå®ÂÃ¥Â
¨è§£è¦ãÂÂ
使ç¨æ°æ®åºÂÃ¥ÂÂæ®
堳亠Golang åºÂç¨ç¨ÂåºÂå¦Âä½Â读åÂÂé Âç½®æÂÂ件å¯以åÂÂèÂÂãÂÂæµ è°ÂGolangé Â置管çÂÂãÂÂè¿Âç¯ÂæÂÂç« ãÂÂ
è¿ÂéÂÂä» ç»Âåº使ç¨æ°æ®åºÂÃ¥ÂÂæ®ç¸堳çÂÂ代ç ÂçÂÂ段ï¼Âå¦Âä¸Âï¼Â
var (mysqlUsername stringmysqlPassword stringmysqlAddress stringmysqlDBname stringmysqlOptions string)func initConfig() {mysqlUsername = Config.Database.MySQL.UsernamemysqlPassword = Config.Database.MySQL.PasswordmysqlAddress = Config.Database.MySQL.AddressmysqlDBname = Config.Database.MySQL.DBnamemysqlOptions = Config.Database.MySQL.Options}func connectMySQL() (*gorm.DB, error) {msyqlDSN := fmt.Sprintf("%s:%s@tcp(%s)/%s?%s", mysqlUsername,mysqlPassword, mysqlAddress, mysqlDBname, mysqlOptions)return gorm.Open(mysql.Open(msyqlDSN), &gorm.Config{})}var ( mysqlUsername string mysqlPassword string mysqlAddress string mysqlDBname string mysqlOptions string ) func initConfig() { mysqlUsername = Config.Database.MySQL.Username mysqlPassword = Config.Database.MySQL.Password mysqlAddress = Config.Database.MySQL.Address mysqlDBname = Config.Database.MySQL.DBname mysqlOptions = Config.Database.MySQL.Options } func connectMySQL() (*gorm.DB, error) { msyqlDSN := fmt.Sprintf("%s:%s@tcp(%s)/%s?%s", mysqlUsername, mysqlPassword, mysqlAddress, mysqlDBname, mysqlOptions) return gorm.Open(mysql.Open(msyqlDSN), &gorm.Config{}) }var ( mysqlUsername string mysqlPassword string mysqlAddress string mysqlDBname string mysqlOptions string ) func initConfig() { mysqlUsername = Config.Database.MySQL.Username mysqlPassword = Config.Database.MySQL.Password mysqlAddress = Config.Database.MySQL.Address mysqlDBname = Config.Database.MySQL.DBname mysqlOptions = Config.Database.MySQL.Options } func connectMySQL() (*gorm.DB, error) { msyqlDSN := fmt.Sprintf("%s:%s@tcp(%s)/%s?%s", mysqlUsername, mysqlPassword, mysqlAddress, mysqlDBname, mysqlOptions) return gorm.Open(mysql.Open(msyqlDSN), &gorm.Config{}) }
æ°æ®åºÂÃ¥ÂÂæ®èªå¨轮转
Agent ä» Vault è·åÂÂæ°æ®åºÂÃ¥ÂÂæ®åÂÂï¼Âä¼Âå¨åÂ
¶TTL
å°æÂÂÃ¥ÂÂè¿Âè¡Âç»Âç§Âï¼Âå½Âå Max-TTL
éÂÂå¶æ æ³Âç»Âç§Âæ¶ï¼Âä¼Âèªå¨轮转ï¼ÂéÂÂæ°è·åÂÂä¸Âç»Âæ°çÂÂÃ¥ÂÂæ®ï¼Â并æ´æ°å¨æΡéÂ
Âç½®æÂÂ件ä¸ÂãÂÂ
åºÂç¨ç¨ÂåºÂçÂÂ匰æΡé Âç½®æÂÂ件çÂÂÃ¥ÂÂÃ¥ÂÂæ¶ï¼ÂéÂÂè¦Â读åÂÂæ°çÂÂÃ¥ÂÂæ®ï¼Â并è¿Âè¡Âå¨æÂÂå 载ãÂÂé Âç½®å¨æÂÂæ´æ°çÂÂå ·ä½Âæ¹æ³Âå¯以åÂÂèÂÂãÂÂæµ è°ÂGolangé Â置管çÂÂãÂÂè¿Âç¯ÂæÂÂç« ãÂÂ
è¿ÂéÂÂä» ç»Âåºé Âç½®å¨æÂÂå 载ç¸堳çÂÂ示ä¾Â代ç Âï¼Âå¦Âä¸Âï¼Â
var db *gorm.DBvar dbLocker sync.Mutexfunc reconnectMySQL() {// get new mysql credscreds := getNewMySQLCreds()if creds.Username == mysqlUsername && creds.Password == mysqlPassword {log.Println("MySQL creds not changed, skip mysql reconnection.")return}dbLocker.Lock()defer dbLocker.Unlock()// re-connect mysql with new credsmysqlUsername = creds.UsernamemysqlPassword = creds.Passwordd, err := connectMySQL()if err != nil {log.Println("MySQL connect failed:", err)return}// setupDatabase(d)db = d}var db *gorm.DB var dbLocker sync.Mutex func reconnectMySQL() { // get new mysql creds creds := getNewMySQLCreds() if creds.Username == mysqlUsername && creds.Password == mysqlPassword { log.Println("MySQL creds not changed, skip mysql reconnection.") return } dbLocker.Lock() defer dbLocker.Unlock() // re-connect mysql with new creds mysqlUsername = creds.Username mysqlPassword = creds.Password d, err := connectMySQL() if err != nil { log.Println("MySQL connect failed:", err) return } // setupDatabase(d) db = d }var db *gorm.DB var dbLocker sync.Mutex func reconnectMySQL() { // get new mysql creds creds := getNewMySQLCreds() if creds.Username == mysqlUsername && creds.Password == mysqlPassword { log.Println("MySQL creds not changed, skip mysql reconnection.") return } dbLocker.Lock() defer dbLocker.Unlock() // re-connect mysql with new creds mysqlUsername = creds.Username mysqlPassword = creds.Password d, err := connectMySQL() if err != nil { log.Println("MySQL connect failed:", err) return } // setupDatabase(d) db = d }
说æÂÂï¼Âä¸Â述示ä¾Â代ç ÂéÂÂè¿ÂéÂÂ建gorm.DB
对象æÂ¥æ´æ°æ°æ®åºÂÃ¥ÂÂæ®ï¼Âæ¯ä¸Âç§Âå¯è¡ÂçÂÂæ¹å¼Âï¼Âä½Âæ¯æ¯Âè¾Âç²Âæ´ï¼Âä¼Â导è´è¿ÂæÂ¥éÂÂ建ï¼Âå¨ä¸Âå¡é«Âå³°æÂÂæ¶å¯è½ä¼Âå½±åÂÂæÂÂå¡æ§è½ï¼Âå¨çÂÂ产ä¸Â建议寻æ±Âæ´ä¼ÂéÂÂ
ãÂÂå¹³æ»ÂçÂÂå®Âç°æ¹å¼ÂãÂÂ大家æÂÂ好çÂÂå®Âç°æÂÂæÂÂè·¯å¯以å¨è¯Â论åºçÂÂè¨ÂÃ¥ÂÂ享ãÂÂ
æ»ç»Â
æ¾ÂÂæ¢讨äºÂåº亠Vault çÂÂæÂÂæÂÂä¿¡æ¯ä¿Âæ¤æ¹æ¡Âï¼ÂéÂÂç¹ä»Âç»ÂäºÂåºÂç¨ç¨ÂåºÂéÂÂè¿ Agent 丠Vault é´æÂ¥éÂÂæÂÂçÂÂæ¹æ³Âï¼Â以æ°æ®åºÂÃ¥ÂÂæ®为ä¾Âï¼Âå ·ä½Â说æÂÂäºÂåºÂç¨ç¨ÂåºÂå¦Âä½Âå®Âå ¨å°仠Vault è·åÂÂæÂÂæÂÂä¿¡æ¯ï¼Â并è¿Âä¸ÂæÂ¥å®Âç°èªå¨轮转ãÂÂ