ฉันเชื่อว่าวิธีแก้ไขปัญหาต่อไปนี้ควรใช้งานได้ในกรณีของคุณ ฉันใช้มันในสถานการณ์ที่คล้ายคลึงกับเซิร์ฟเวอร์สำรองกลางและไคลเอนต์สำรองข้อมูลหลายตัว
ฉันมีบทบาท (สมมุติว่า " db_replication_master ") เชื่อมโยงกับเซิร์ฟเวอร์ที่ได้รับการเชื่อมต่อ:
- role: db_replication_master
db_slaves: ['someserver', 'someotherserver']
db_slave_user: 'someuser' # in case you have different users
db_master_user: 'someotheruser'
extra_pubkeys: ['files/id_rsa.pub'] # other keys that need access to master
จากนั้นเราสร้างงานจริงในบทบาทdb_replication_master :
- name: create remote accounts ssh keys
user:
name: "{{ db_slave_user }}"
generate_ssh_key: yes
delegate_to: "{{ item }}"
with_items: db_slaves
- name: fetch pubkeys from remote users
fetch:
dest: "tmp/db_replication_role/{{ item }}.pub"
src: "~{{db_slave_user}}/.ssh/id_rsa.pub"
flat: yes
delegate_to: "{{ item }}"
with_items: db_slaves
register: remote_pubkeys
changed_when: false # we remove them in "remove temp local pubkey copies" below
- name: add pubkeys to master server
authorized_key:
user: "{{ db_master_user }}"
key: "{{ lookup('file', item) }}"
with_flattened:
- extra_pubkeys
- "{{ remote_pubkeys.results | default({}) | map(attribute='dest') | list }}"
- name: remove temp local pubkey copies
local_action: file dest="tmp/db_replication_role" state=absent
changed_when: false
ดังนั้นโดยพื้นฐานแล้วเรา:
- การสร้าง ssh-keys แบบไดนามิกบนทาสเหล่านั้นที่ยังไม่มีอยู่
- จากนั้นเรากำลังใช้delegate_toเพื่อเรียกใช้โมดูลfetchบนทาสและดึง ssh pubkeys ของพวกเขาไปยังโฮสต์ที่ใช้งานได้และบันทึกผลลัพธ์ของการดำเนินการนี้ในตัวแปรเพื่อให้เราสามารถเข้าถึงรายการไฟล์ที่ดึงมาจริง
- หลังจากนั้นเราจะดำเนินการผลักดัน ssh pubkeys (รวมถึง pubkeys พิเศษใด ๆ ที่จัดให้) ตามปกติไปยังโหนดหลักที่มีโมดูลauthorized_keys (เราใช้ตัวกรอง jinja2 สองตัวเพื่อขุด filepaths จากตัวแปรในงานด้านบน)
- ในที่สุดเราก็ลบไฟล์ pubkey ที่แคชในเครื่องที่โฮสต์ที่ใช้งานได้
ข้อ จำกัด ของการมีผู้ใช้เดียวกันในโฮสต์ทั้งหมดอาจจะสามารถแก้ไขได้ แต่จากสิ่งที่ฉันได้รับจากคำถามของคุณนั่นอาจไม่ใช่ปัญหาสำหรับคุณ (มันเกี่ยวข้องกับสถานการณ์การสำรองข้อมูลของฉันเล็กน้อย) แน่นอนคุณสามารถกำหนดประเภทคีย์ (rsa, dsa, ecdsa และอื่น ๆ ) ได้เช่นกัน
อัปเดต : โอ๊ะฉันจะเขียนโดยใช้คำศัพท์เฉพาะสำหรับปัญหาของฉันไม่ใช่ของคุณ! ควรเข้าท่ามากกว่านี้