如何使用 Consul Agent CLI 创建新的 KV 条目,但前提是它们尚不存在?
How do I use the Consul Agent CLI to create new KV entries but only if they don't already exist?
我在 docker-compose.yml 文件中有一个玩具领事。它填充了另一项服务 运行s 并退出。
version: '3.4'
services:
consul:
image: consul
consul-seed:
build:
context: consul/seed
environment:
HELLO: WORLD
consul/seed
包含一个 运行 是 Python 脚本的 Dockerfile。
FROM python:3-latest
RUN python3 -m pip install python-consul # Actually, this is via a requirements.txt. But for simplicity, this works too.
COPY seed.py ./
CMD python3 seed.py
python 脚本只是读取一些环境变量并用它们填充 Consul 的 KV。
#!/usr/bin/env python3
import os
import consul
seed_keys=["HELLO"]
consul = consul.Consul()
for key in seed_keys:
value = os.environ.get(key, "")
if consul.kv.put(key=key, value=value, cas=0):
print("{}={}".format(key, value))
else:
print("! {}={}".format(key, value))
行得通!当我这样做时:consul kv get HELLO
,内容是WORLD
。重要的是,种子脚本不会覆盖任何已经有键的值(表明 cas
选项被尊重并且种子脚本应该是安全的 运行 使用“真正的”Consul实例而不是玩具那个)。
$ docker exec -ti consul /bin/sh
/ # consul kv get HELLO
WORLD
/ # consul kv put HELLO wOrLd
Success! Data written to: HELLO
/ # consul kv get HELLO
wOrLd
但是,如果我尝试使用 Consul CLI 为一个值设定种子,它会抱怨 CAS 选项。
$ docker exec -ti consul /bin/sh
/ # consul kv get HELLO
wOrLd
/ # consul kv delete HELLO
Success! Deleted key: HELLO
/ # consul kv put -cas HELLO world
Must specify -modify-index with -cas!
/ # consul kv put -cas 0 HELLO world
Error! Too many arguments (expected 1 or 2, got 3)
/ # consul kv put -cas -modify-index 0 HELLO world
Must specify -modify-index with -cas!
/ # consul kv put -cas -modify-index 1 HELLO world
Error! Did not write to HELLO: CAS failed
/ # consul kv get HELLO
Error! No key exists at: HELLO
如何使用代理 CLI 创建新的 KV 条目,但前提是它们尚不存在?
我正在使用:
$ docker pull consul
Using default tag: latest
latest: Pulling from library/consul
Digest: sha256:0e660ca8ae28d864e3eaaed0e273b2f8cd348af207e2b715237e869d7a8b5dcc
Status: Image is up to date for consul:latest
docker.io/library/consul:latest
$ docker image ls consul
REPOSITORY TAG IMAGE ID CREATED SIZE
consul latest 941109e2896d 4 weeks ago 122MB
$ docker run --rm -ti consul consul --version
Consul v1.8.0
Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents)
我是 Consul 的产品经理。这是我们 CLI 中的错误。我们已提交 https://github.com/hashicorp/consul/issues/8330 以跟踪解决此问题。
同时,您可以直接使用 HTTP API 或通过 SDK 有条件地设置不存在的密钥。
我在 docker-compose.yml 文件中有一个玩具领事。它填充了另一项服务 运行s 并退出。
version: '3.4'
services:
consul:
image: consul
consul-seed:
build:
context: consul/seed
environment:
HELLO: WORLD
consul/seed
包含一个 运行 是 Python 脚本的 Dockerfile。
FROM python:3-latest
RUN python3 -m pip install python-consul # Actually, this is via a requirements.txt. But for simplicity, this works too.
COPY seed.py ./
CMD python3 seed.py
python 脚本只是读取一些环境变量并用它们填充 Consul 的 KV。
#!/usr/bin/env python3
import os
import consul
seed_keys=["HELLO"]
consul = consul.Consul()
for key in seed_keys:
value = os.environ.get(key, "")
if consul.kv.put(key=key, value=value, cas=0):
print("{}={}".format(key, value))
else:
print("! {}={}".format(key, value))
行得通!当我这样做时:consul kv get HELLO
,内容是WORLD
。重要的是,种子脚本不会覆盖任何已经有键的值(表明 cas
选项被尊重并且种子脚本应该是安全的 运行 使用“真正的”Consul实例而不是玩具那个)。
$ docker exec -ti consul /bin/sh
/ # consul kv get HELLO
WORLD
/ # consul kv put HELLO wOrLd
Success! Data written to: HELLO
/ # consul kv get HELLO
wOrLd
但是,如果我尝试使用 Consul CLI 为一个值设定种子,它会抱怨 CAS 选项。
$ docker exec -ti consul /bin/sh
/ # consul kv get HELLO
wOrLd
/ # consul kv delete HELLO
Success! Deleted key: HELLO
/ # consul kv put -cas HELLO world
Must specify -modify-index with -cas!
/ # consul kv put -cas 0 HELLO world
Error! Too many arguments (expected 1 or 2, got 3)
/ # consul kv put -cas -modify-index 0 HELLO world
Must specify -modify-index with -cas!
/ # consul kv put -cas -modify-index 1 HELLO world
Error! Did not write to HELLO: CAS failed
/ # consul kv get HELLO
Error! No key exists at: HELLO
如何使用代理 CLI 创建新的 KV 条目,但前提是它们尚不存在?
我正在使用:
$ docker pull consul
Using default tag: latest
latest: Pulling from library/consul
Digest: sha256:0e660ca8ae28d864e3eaaed0e273b2f8cd348af207e2b715237e869d7a8b5dcc
Status: Image is up to date for consul:latest
docker.io/library/consul:latest
$ docker image ls consul
REPOSITORY TAG IMAGE ID CREATED SIZE
consul latest 941109e2896d 4 weeks ago 122MB
$ docker run --rm -ti consul consul --version
Consul v1.8.0
Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents)
我是 Consul 的产品经理。这是我们 CLI 中的错误。我们已提交 https://github.com/hashicorp/consul/issues/8330 以跟踪解决此问题。
同时,您可以直接使用 HTTP API 或通过 SDK 有条件地设置不存在的密钥。