เอกสารราชการ ( https://docs.saltproject.io/en/latest/ref/cache/all/salt.cache.etcd_cache.html#module-salt.cache.etcd_cache ) แสดงการกำหนดค่าตัวอย่างนี้:
etcd.host: 127.0.0.1
etcd.พอร์ต: 2379
etcd.โปรโตคอล: http
etcd.allow_reconnect: จริง
etcd.allow_redirect: เท็จ
etcd.srv_domain: ไม่มี
etcd.read_timeout: 60
etcd.ชื่อผู้ใช้: ไม่มี
etcd.password: ไม่มี
etcd.cert: ไม่มี
etcd.ca_cert: ไม่มี
ในกรณีของฉันโดยเฉพาะ ฉันมีคลัสเตอร์ etcd ที่มีการตรวจสอบสิทธิ์ PKI (ตามใบรับรอง TLS) เอกสารประกอบของโมดูลเกลือไม่ได้ระบุเจาะจงเกี่ยวกับกรณีการใช้งานนั้น มันบอกเพียงว่า:
เอกสารที่เกี่ยวข้องสามารถพบได้ในเอกสาร python-etcd
ในความเป็นจริง "เอกสารที่เกี่ยวข้อง" นั้นคลุมเครือมากที่นี่ https://python-etcd.readthedocs.io/en/latest/#create-a-client-object - ไม่ใช่เอกสารจริงเป็นเพียงรายการตัวอย่างเล็กน้อย:
นำเข้า ฯลฯ
ลูกค้า = etcd.Client() # สิ่งนี้จะสร้างไคลเอนต์กับเซิร์ฟเวอร์ etcd ที่ทำงานบน localhost บนพอร์ต 4001
ลูกค้า = etcd.Client (พอร์ต = 4002)
ลูกค้า = etcd.Client (โฮสต์ = '127.0.0.1', พอร์ต = 4003)
ลูกค้า = etcd.Client(host='127.0.0.1', port=4003, allow_redirect=False) # จะไม่ให้คุณรันคำสั่งที่ละเอียดอ่อนบนเครื่องที่ไม่ใช่ตัวนำ ค่าเริ่มต้นคือ true
ลูกค้า = etcd.Client (
โฮสต์='127.0.0.1',
พอร์ต = 4003,
allow_reconnect=จริง
โปรโตคอล='https',)
แน่นอนว่าสิ่งนี้จะไม่ทำงานกับคลัสเตอร์ etcd ที่เหมาะสม อย่างไรก็ตาม ซอร์สโค้ดเปิดเผยว่าสามารถระบุรายชื่อโฮสต์ได้:
https://github.com/jplana/python-etcd/blob/master/src/etcd/client.py#L74
เริ่มต้นไคลเอนต์
อาร์กิส:
โฮสต์ (ผสม):
หากเป็นสตริง IP ที่จะเชื่อมต่อ
ถ้าทูเพิล ((โฮสต์, พอร์ต), (โฮสต์, พอร์ต), ...)
แต่ฉันไม่มีความคิดว่าจะใส่ทูเพิลของทูเพิลลงในไฟล์ปรับแต่งค่าเกลือได้อย่างไร นี่คือสิ่งที่ฉันได้ลอง:
แคช: etcd
etcd.host: [('salt1.lacinet', 2739), ('salt2.lacinet', 2739)]
etcd.โปรโตคอล: https
etcd.allow_reconnect: จริง
etcd.allow_redirect: เท็จ
etcd.srv_domain: ไม่มี
etcd.read_timeout: 60
etcd.ชื่อผู้ใช้: root
etcd.password: ไม่มี
etcd.cert: ('/etc/salt/etcd/root.key.pem', '/etc/salt/etcd/root.cert.pem')
etcd.ca_cert: '/etc/salt/etcd/ca.cert.pem'
แต่ส่งผลให้เกิดข้อผิดพลาด:
[ข้อผิดพลาด] ไม่พบโฮสต์ etcd จากไม่มี: ไม่มีชื่อการสืบค้น DNS อยู่: _etcd._tcp.None., _etcd._tcp.None.lacinet
[ข้อผิดพลาด ] ไม่สามารถรับรายการเครื่องจาก https://['salt1.lacinet', 'salt2.lacinet']:2379/v2: LocationParseError("ไม่สามารถแยกวิเคราะห์: https://['salt1.lacinet', 'salt2.lacinet']:2379/v2/เครื่อง")
[ERROR ] ข้อผิดพลาดในฟังก์ชัน _pillar:
Traceback (การโทรครั้งล่าสุดล่าสุด):
ไฟล์ "/usr/lib/python3/dist-packages/etcd/client.py", บรรทัด 296 ในเครื่อง
ตอบกลับ = self.http.request(
ไฟล์ "/usr/lib/python3/dist-packages/urllib3/request.py", บรรทัด 75 ในคำขอ
ส่งคืน self.request_encode_url(
ไฟล์ "/usr/lib/python3/dist-packages/urllib3/request.py", บรรทัด 97 ใน request_encode_url
ส่งคืน self.urlopen (เมธอด, url, **extra_kw)
ไฟล์ "/usr/lib/python3/dist-packages/urllib3/poolmanager.py", บรรทัด 318, ใน urlopen
คุณ = parse_url(url)
ไฟล์ "/usr/lib/python3/dist-packages/urllib3/util/url.py", บรรทัด 392 ใน parse_url
ส่งคืน six.raise_from (LocationParseError (source_url), ไม่มี)
ไฟล์ "<string>" บรรทัดที่ 3 ใน Raise_from
urllib3.exceptions.LocationParseError: ไม่สามารถแยกวิเคราะห์: https://["('salt1.lacinet'", '2739)', "('salt1.lacinet'", '2739)']:2379/v2/machines
ข้อผิดพลาดนั้นน่าสงสัยมาก:
แยกวิเคราะห์ล้มเหลว: https://["('salt1.lacinet'", '2739)', "('salt1.lacinet'", '2739)']:2379/v2/machines
ฉันสงสัยว่ารายการโฮสต์ไม่ได้รับการยอมรับว่าเป็นรายการหรือทูเพิล แต่เป็นสตริง
จากข้อผิดพลาดนี้ อาจเป็นไปได้ว่าแคชมินเนี่ยนของ Salt-master ไม่รองรับโฮสต์ etcd หลายตัว แต่นั่นจะ "น่าสนใจ" มาก เนื่องจากเหตุผลหลักของการติดตั้ง etcd คือการจัดหาที่เก็บคีย์-ค่า HA สำหรับต้นแบบเกลือหลายตัว จะมีประโยชน์อะไรหากสามารถใช้เซิร์ฟเวอร์ etcd เดียวเท่านั้น
ฉันน่าจะมีปัญหากับการรับรองความถูกต้องตามใบรับรอง TLS เช่นกัน เพราะมันใช้ทูเพิลด้วย (หรือควรตามที่ระบุใน https://github.com/jplana/python-etcd/blob/master/src/etcd/client.py#L90 ):
ใบรับรอง (ผสม): หากเป็นสตริง ใบรับรองไคลเอ็นต์ ssl ทั้งหมด;
ถ้าเป็นทูเพิล ชื่อไฟล์ใบรับรองและคีย์
ca_cert (str): ใบรับรอง ca หากกดจะเป็นการเปิดใช้งาน
การตรวจสอบ
ไม่ชัดเจนว่าจะระบุชื่อไฟล์กี่ไฟล์ในการกำหนดค่าได้อย่างไร ยังไม่ชัดเจนว่าการกำหนดค่า ca_cert เป็นเส้นทางของไฟล์ใบรับรอง หรือเป็นสตริงใบรับรอง PEM เอง ไม่มีการบันทึกสิ่งนี้ไว้ที่ใด (หรือฉันหาไม่พบ)
ใครช่วยบอกฉันหน่อยได้ไหมว่าจะใช้คลัสเตอร์ TLS-auth etcd ที่เหมาะสมกับ salt-master เป็น minion cache ได้อย่างไร เป็นไปได้ไหม?