นี่คือสิ่งที่ฉันทำถ้าansible_user
แตกต่างสำหรับ 'การเรียกใช้ครั้งแรก' ของ playbook (ตัวอย่างเช่นถ้าคุณมีroot
ผู้ใช้เพียงคนเดียวและคุณจะตั้งค่าผู้ใช้ใหม่ด้วยคีย์ SSH):
- เก็บรหัสผ่าน
ansible_pass
ตามที่คุณต้องการหากคุณใช้การเข้าสู่ระบบรหัสผ่าน (อย่าลืมใช้ Vault) นี่ควรเป็นรหัสผ่านของผู้ใช้ที่คุณใช้สำหรับ 'เรียกใช้ครั้งแรก' ของ playbook
- ตั้งค่า
ansible_user
ชื่อผู้ใช้ของผู้ใช้ที่คุณต้องการใช้หลังจากเรียกใช้ครั้งแรกเมื่อคุณตั้งค่าผู้ใช้อย่างถูกต้องบนเซิร์ฟเวอร์
- ตั้งค่าตัวแปรของ
ansible_user_first_run
ผู้ใช้ที่คุณกำลังจะใช้สำหรับ 'การทำงานครั้งแรกของ PlayBook root
ตัวอย่างเช่น
- ใช้คำสั่งท้องถิ่นเพื่อพยายามเชื่อมต่อกับเซิร์ฟเวอร์ด้วยคีย์ SSH ที่ถูกต้องโดยใช้
ignore_errors
และchanged_when: False
- หากสิ่งนั้นล้มเหลวให้อัพเดต
ansible_user
เป็นค่าของansible_user_first_run
นี่คือรหัส:
---
- name: Check if connection is possible
command: ssh -o User={{ ansible_user }} -o ConnectTimeout=10 -o PreferredAuthentications=publickey -o PubkeyAuthentication=yes {{ inventory_hostname }} echo "Worked"
register: result
connection: local
ignore_errors: yes
changed_when: False
- name: If no connection, change user_name
connection: local
set_fact:
ansible_user: "{{ ansible_user_first_run }}"
when: result|failed
หมายเหตุ: มันควรค่าแก่การตั้งค่าtransport = ssh
เนื่องจาก paramiko อาจล้มเหลวในการลงชื่อเข้าใช้เซิร์ฟเวอร์โดยไม่คาดคิดในการกำหนดค่าบางอย่าง (เช่นเมื่อเซิร์ฟเวอร์ตั้งค่าไม่ให้รับรหัสผ่านและคุณลองใช้รหัสผ่านเป็นครั้งแรก การขนส่งด้วย SSH นั้นเร็วกว่าดังนั้นมันก็คุ้มค่าอยู่ดี
หมายเหตุเพิ่มเติม: หากคุณใช้วิธีนี้คุณจะต้องระบุgather_facts: false
ในไฟล์คำจำกัดความของ playbook เพื่อให้การรวบรวม / การรวบรวมข้อมูลข้อเท็จจริงไม่ทำงานโดยอัตโนมัติก่อนที่คุณจะถึงขั้นตอนการทดสอบรหัสผ่าน หากคุณต้องการข้อเท็จจริงใด ๆ คุณจะต้องโทรหาsetup
บทบาทของคุณอย่างชัดเจนก่อนที่จะเข้าถึงข้อมูลใด ๆ ที่มีอยู่ตามปกติในสถานที่เช่นansible_devices
ฯลฯ วิธีที่ดีวิธีหนึ่งในการทำเช่นนี้คือการโทรsetup
ด้วยwhen
ประโยคที่ตรวจสอบเพื่อดูว่า ความจริงที่คุณกำลังใช้นั้นว่างเปล่าหรือไม่ก่อนที่คุณจะเรียกมันว่าในบทบาทของคุณ