Score:5

ฉันจะแทนที่ playbook var ได้อย่างไรหากตั้งค่าเป็น host_vars ใน Ansible

ธง us

server1 อยู่ในกลุ่ม it_serversแต่ฉันต้องการใช้ ansible_connection: ท้องถิ่น. วิธีนี้สามารถทำได้หาก ansible_connection ถูกกำหนดไว้ใน playbook และ host_vars?

--
- โฮสต์: it_servers
  วาร์:
    ansible_connection: aws_ssm
  บทบาท:
    - จิงซ์
    - มายเอสคิวแอล

ของฉัน host_vars/server1.yml ไฟล์

ansible_connection: ท้องถิ่น
Score:6
ธง br

ถาม: "จะแทนที่ 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] => 
  ข้อความ:
  - ท้องถิ่น
  - จุ๊
  - จุ๊
Score:0
ธง in

คุณสามารถใช้ได้ delegate_to: localhost สำหรับงาน

Score:0
ธง in
Max

Ansible ใช้ลำดับความสำคัญของตัวแปร และคุณอาจใช้มันได้ ต่อไปนี้คือลำดับความสำคัญจากน้อยไปมาก (ตัวแปรที่อยู่ในรายการสุดท้ายจะแทนที่ตัวแปรอื่นๆ ทั้งหมด):

ค่าบรรทัดคำสั่ง (เช่น -u my_user ซึ่งไม่ใช่ตัวแปร)

ค่าเริ่มต้นของบทบาท (กำหนดไว้ใน role/defaults/main.yml) 1

ไฟล์สินค้าคงคลังหรือกลุ่มสคริปต์ vars 2

สินค้าคงคลัง group_vars/ทั้งหมด 3

สมุดคู่มือ group_vars/all 3

สินค้าคงคลัง group_vars/* 3

สมุดคู่มือ group_vars/* 3

ไฟล์สินค้าคงคลังหรือโฮสต์สคริปต์ vars 2

พื้นที่โฆษณา host_vars/* 3

เพลย์บุ๊ค host_vars/* 3

ข้อมูลโฮสต์ / แคช set_facts 4

เล่นวาร์

เล่น vars_prompt

เล่น vars_files

บทบาท vars (กำหนดใน role/vars/main.yml)

block vars (เฉพาะงานใน block)

vars งาน (เฉพาะงาน)

include_vars

set_facts / vars ที่ลงทะเบียน

พารามิเตอร์บทบาท (และ include_role)

รวมพารามิเตอร์

vars พิเศษ (เช่น -e "user=my_user")(ชนะก่อนเสมอ)

อธิบายได้ดีกว่าที่นี่: https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา