ad hoc 명령으로 호스트 또는 그룹에 사용할 수있는 변수를 모두 나열 하시겠습니까?


25

변수는 다양한 소스에서 나옵니다. 예를 들어 인벤토리 파일이 들어있는 폴더 host_varsgroup_vars각각의 하위 폴더에 YAML 파일을 생성하여 host_vars 및 group_vars를 제공 할 수 있습니다.

Ansible 플레이 북 내의 그룹이나 호스트에 대해 알고 있는 모든 변수를 어떻게 나열 할 수 있습니까? 참고 : 나는 시도 하고 아무 소용이.ansible -m debug -e 'var=hostvars' hostansible -m debug -e '- debug: var=hostvars'

힌트 : ansible <group|host> -m setup하지 가 않기 때문에 정확한 답 하지 다른 소스에서 오는 모든 변수를 포함 (만 포함 { "ansible_facts" : { ... } }사실조차를 통해 동적 인벤토리 스크립트 (에 의해 제공되는 변수를 포함하지 않는다. _meta등 등).

가능한 버전 : 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

참고 : github 프로젝트는 모든 호스트에서 변수의 90 %를 나열하는 방법을 보여줍니다. 단일 호스트 명령보다 전체적으로 더 유용하다는 것을 알았습니다. README에는 간단한 재고 보고서 작성 지침이 포함되어 있습니다. 플레이 팩의 끝에서 이것을 실행하여 모든 팩트를 보는 것이 훨씬 더 중요합니다. 작업 동작을 디버그하려면 register를 사용하십시오.


2

프로그래밍 방식으로 찌르기를 원한다면 위의 좋은 대답에 작은 팁을 추가하십시오.

hostvars에 대한 기존 답변을 사용하십시오 .

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

그러나 모듈을 실행하지 않기 때문에 ansible_facts 가 비어 있습니다. 따라서 출력을 잘라서 유효한 json으로 만들려면 추가로 시도해야합니다 .debugsetupjq

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.