ถาม: "จะแทนที่ playbook var ได้อย่างไรหากตั้งค่าเป็น host_vars ใน Ansible"
ตอบ: ลองดูที่ ตัวแปรลำดับความสำคัญ. ลำดับความสำคัญของ เล่นวาร์ คือ 12 มีความเป็นไปได้อีก 10 วิธีในการแทนที่ เล่นวาร์แต่ไม่มีตัวเลือกใดที่จะให้คุณเลือกแทนที่ตัวแปรสำหรับโฮสต์เดียว
คุณจะต้องลบการประกาศของ ansible_connection: aws_ssm
จาก playbook หากคุณต้องการเปลี่ยนสำหรับโฮสต์เดียว สถานที่ที่ดีที่สุดสำหรับ กลุ่ม ประกาศการเชื่อมต่อคือ group_vars (ลำดับความสำคัญ 3-7) และสถานที่ที่ดีที่สุดในการแทนที่ group_vars สำหรับโฮสต์เดียวคือ host_vars (ลำดับความสำคัญ 8-10) ตัวอย่างเช่น
เปลือก> เจ้าภาพแมว
[aws1]
server1 ansible_connection=local # precedence 8.
เซิร์ฟเวอร์2
เซิร์ฟเวอร์3
[aws1:vars]
ansible_connection=aws_ssm # ลำดับความสำคัญ 3.
มีหลายอย่างรวมกัน host_vars และ group_vars เพื่อให้บรรลุสถานการณ์นี้ แต่ถ้าคุณตั้งค่าตัวแปรไว้ที่ เล่นวาร์ (ลำดับความสำคัญ 12) คุณไม่สามารถแทนที่สำหรับโฮสต์เดียวได้อีกต่อไป
ตัวแปรไดนามิก
เป็นไปได้ที่จะประกาศตัวแปรแบบไดนามิก ตัวอย่างเช่น
ansible_connection: "{{ 'ท้องถิ่น'
ถ้า Inventory_hostname == 'เซิร์ฟเวอร์ 1'
อื่น
'aws_ssm' }}"
สิ่งนี้จะทำงานในทุกระดับความสำคัญ แต่เนื่องจากขี้เกียจประเมิน มันไม่มีประสิทธิภาพมาก ตัวแปรจะได้รับการประเมินทุกครั้งที่อ้างอิง
'สร้าง' ตัวแปรไดนามิก
หากคุณจำเป็นต้องใช้ตัวแปรไดนามิก 'instantiate' จริง ๆ เพื่อหลีกเลี่ยงการประเมินซ้ำ มันหมายความว่าอะไร? ตัวอย่างเช่น กำหนดพื้นที่โฆษณา (ใน YAML เพื่อให้อ่านง่ายขึ้น)
เปลือก> เจ้าภาพแมว
ทั้งหมด:
เจ้าภาพ:
เซิร์ฟเวอร์ 1:
ansible_host: localhost
ansible_python_interpreter: /usr/bin/python3.8
เซิร์ฟเวอร์ 2:
ansible_host: 10.1.0.62
ansible_user: ผู้ดูแลระบบ
ansible_python_interpreter: /usr/local/bin/python3.8
เซิร์ฟเวอร์ 3:
ansible_host: 10.1.0.63
ansible_user: ผู้ดูแลระบบ
ansible_python_interpreter: /usr/local/bin/python3.8
เด็ก:
เซิร์ฟเวอร์:
เจ้าภาพ:
เซิร์ฟเวอร์ 1:
เซิร์ฟเวอร์ 2:
เซิร์ฟเวอร์ 3:
หนังสือเล่น
- โฮสต์: เซิร์ฟเวอร์
วาร์:
ansible_connection: "{{ 'ท้องถิ่น'
ถ้า Inventory_hostname == 'เซิร์ฟเวอร์ 1'
อื่น
'ssh' }}"
งาน:
- แก้ปัญหา:
ข้อความ: "{{ ansible_play_hosts|
map('extract', hostvars, 'ansible_connection') }}"
run_once: จริง
- แก้ปัญหา:
var: ansible_connection
ให้
เล่น [เซิร์ฟเวอร์] *********************************************** *******
TASK [รวบรวมข้อเท็จจริง] *********************************************
ตกลง: [เซิร์ฟเวอร์ 1]
ตกลง: [เซิร์ฟเวอร์ 2]
ตกลง: [เซิร์ฟเวอร์ 3]
งาน [แก้ไขข้อบกพร่อง] *********************************************** *********
ตกลง: [เซิร์ฟเวอร์ 1] =>
msg: '[AnsibleUndefined, AnsibleUndefined, AnsibleUndefined]'
งาน [แก้ไขข้อบกพร่อง] *********************************************** *********
ตกลง: [เซิร์ฟเวอร์ 1] =>
ansible_connection: ท้องถิ่น
ตกลง: [server2] =>
ansible_connection: ssh
ตกลง: [server3] =>
ansible_connection: ssh
การเชื่อมต่อทำงานตามที่คาดไว้ แต่ตัวแปร ansible_connection ไม่รวมอยู่ใน โฮสต์วาร์. ใช้โมดูล set_fact และ 'สร้าง' ตัวแปร เช่น
- set_fact:
ansible_connection: "{{ ansible_connection }}"
- แก้ปัญหา:
ข้อความ: "{{ ansible_play_hosts|
map('extract', hostvars, 'ansible_connection') }}"
run_once: จริง
ให้
งาน [set_fact] *********************************************** ******
ตกลง: [เซิร์ฟเวอร์ 1]
ตกลง: [เซิร์ฟเวอร์ 2]
ตกลง: [เซิร์ฟเวอร์ 3]
งาน [แก้ไขข้อบกพร่อง] *********************************************** *********
ตกลง: [เซิร์ฟเวอร์ 1] =>
ข้อความ:
- ท้องถิ่น
- จุ๊
- จุ๊