ทำรายการตัวแปร Ansible ทั้งหมดสำหรับโฮสต์หรือกลุ่มด้วยคำสั่ง ad hoc?


25

ตัวแปรที่มาจากแหล่งต่าง ๆ เป็นตัวอย่างที่เป็นไปได้ในการจัดเตรียม host_vars และ group_vars โดยการสร้างไฟล์ YAML ในโฟลเดอร์ย่อยที่มีชื่อhost_varsและgroup_varsตามลำดับของโฟลเดอร์ที่มีไฟล์สินค้าคงคลัง

ฉันสามารถแสดงรายการทั้งหมดของตัวแปรเบิ้ลจะรู้เกี่ยวกับกลุ่มหรือโฮสต์ภายใน PlayBook หรือไม่? หมายเหตุ: ฉันพยายามansible -m debug -e 'var=hostvars' hostและansible -m debug -e '- debug: var=hostvars'ไม่มีประโยชน์

คำแนะนำ: ansible <group|host> -m setupจะไม่ได้คำตอบที่ถูกต้องในขณะที่มันไม่ได้รวมตัวแปรทั้งหมดที่มาจากแหล่งอื่น ๆ (มีเพียง{ "ansible_facts" : { ... } }. ในความเป็นจริงมันไม่ได้รวมตัวแปรให้โดยสคริปต์สินค้าคงคลังแบบไดนามิก (ผ่าน_metaและอื่น ๆ )

รุ่น Ansible: 1.9.1

คำตอบ:


26

ansible -m debug -a "var=hostvars[inventory_hostname]"ดูเหมือนว่าจะทำงาน แหล่งที่มาของตัวแปรที่ถูกต้อง ( host_vars, group_vars, _metaในสินค้าคงคลังแบบไดนามิก, ฯลฯ ) จะถูกนำทั้งหมดเข้าบัญชี

ด้วยสคริปต์คลังโฆษณาแบบไดนามิกhosts.sh:

#!/bin/sh
if test "$1" = "--host"; then
        echo {}
else
        cat <<EOF
{
  "ungrouped": [ "x.example.com", "y.example.com" ],
  "group1": [ "a.example.com" ],
  "group2": [ "b.example.com" ],
  "groups": {
    "children": [ "group1", "group2" ],
    "vars": { "ansible_ssh_user": "user" }
  },
  "_meta": {
    "hostvars": {
      "a.example.com": { "ansible_ssh_host": "10.0.0.1" },
      "b.example.com": { "ansible_ssh_host": "10.0.0.2" }
    }
  }
}
EOF
fi

คุณสามารถได้รับ:

$ chmod +x hosts.sh
$ ansible -i hosts.sh a.example.com -m debug -a "var=hostvars[inventory_hostname]"
a.example.com | success >> {
    "var": {
        "hostvars": {
            "ansible_ssh_host": "10.0.0.1", 
            "ansible_ssh_user": "user", 
            "group_names": [
                "group1", 
                "groups"
            ], 
            "groups": {
                "all": [
                    "x.example.com", 
                    "y.example.com", 
                    "a.example.com", 
                    "b.example.com"
                ], 
                "group1": [
                    "a.example.com"
                ], 
                "group2": [
                    "b.example.com"
                ], 
                "groups": [
                    "a.example.com", 
                    "b.example.com"
                ], 
                "ungrouped": [
                    "x.example.com", 
                    "y.example.com"
                ]
            }, 
            "inventory_hostname": "a.example.com", 
            "inventory_hostname_short": "a"
        }
    }
}

ด้วย ansible 2.0.2ดูเหมือนว่ามันจะไม่ทำงานอีกต่อไป ผลลัพธ์คือlocalhost | SUCCESS => { "hostvars": "<ansible.vars.hostvars.HostVars object at 0x7f320943da10>" }
Zulakis

แนะนำให้แก้ไข"var=hostvars[inventory_hostname]"บน ansible> 2.0
stuart-warren

สำหรับ 1.9.4 จะไม่ส่งคืนสิ่งที่ส่งคืนโดยansible my.hostname.example.com -m setup -i ../my/inventory/hosts.example -u root
akostadinov

1
สิ่งนี้ใช้ได้กับฉันansible host-name -m debug -a "var=[var_name]" -i inventory/testing/hosts
Montaro

2

FYI: นี้โครงการ GitHub แสดงให้เห็นวิธีการแสดงรายการ 90% ของตัวแปรทั่วทุกครอบครัว ฉันพบว่ามันมีประโยชน์ทั่วโลกมากกว่าคำสั่งโฮสต์เดียว README มีคำแนะนำสำหรับการสร้างรายงานสินค้าคงคลังอย่างง่าย มันมีคุณค่ายิ่งกว่าในการใช้งานเมื่อสิ้นสุด playbook เพื่อดูข้อเท็จจริงทั้งหมด ในการแก้ไขข้อบกพร่องลักษณะการทำงานให้ใช้ register:


2

การเพิ่มเคล็ดลับเล็ก ๆ ให้กับคำตอบที่ดีจริง ๆ ข้างต้นหากคุณต้องการกระตุ้นให้คุณเขียนโปรแกรม

ใช้คำตอบที่มีอยู่สำหรับโฮสต์ :

ansible -m debug myhost -a "var=hostvars[inventory_hostname].ansible_version"

แต่ ansible_factsว่างเปล่าเพราะdebugไม่ได้เรียกใช้setupโมดูล ดังนั้นคุณต้องลองอะไรพิเศษเช่นjqหลังจากตัดแต่งเอาต์พุตเพื่อให้ json ใช้งานได้

ansible -m setup myhost | sed 's#.*SUCCESS =>##' | jq .ansible_facts.ansible_all_ipv4_addresses

ฉันคิดว่าผู้คนอาจพบว่าสิ่งนี้มีประโยชน์เมื่อตรวจสอบกำแพงยักษ์ของข้อความที่กลับมาในข้อเท็จจริงที่เข้าใจยากเมื่อคุณต้องการสิ่งหนึ่งเช่น jq .ansible_facts.ansible_devices.vda.size

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.