问:Playbook 运行一个脚本运行一个 playbook...它可以工作,但它有点 hacky
答:FWIW。可以使用 json_query 并避免脚本。例如
- hosts: all
gather_facts: false
tasks:
- set_fact:
my_host: "{{ hostvars|dict2items|json_query(query)|first }}"
vars:
query: "[?value.ansible_host == '{{ my_host_ip }}' ].key"
run_once: true
- add_host:
hostname: "{{ my_host }}"
groups: my_group
run_once: true
- hosts: my_group
gather_facts: false
tasks:
- debug:
var: inventory_hostname
问:“很遗憾,我正在从 AWX 运行 ansible-playbook,因此不允许使用包装脚本。”
答:可以从剧本中运行脚本。例如下面的剧本
- hosts: all
gather_facts: false
tasks:
- set_fact:
my_host: "{{ lookup('pipe', playbook_dir ~ '/script.sh ' ~ my_host_ip) }}"
delegate_to: localhost
run_once: true
- add_host:
hostname: "{{ my_host }}"
groups: my_group
run_once: true
- hosts: my_group
gather_facts: false
tasks:
- debug:
var: inventory_hostname
给予
$ ansible-playbook -e 'my_host_ip=10.1.0.53' play.yml
PLAY [all] ********************
TASK [set_fact] ***************
ok: [test_01 -> localhost]
TASK [add_host] ***************
changed: [test_01]
PLAY [my_group] ***************
TASK [debug] ************
ok: [test_03] => {
"inventory_hostname": "test_03"
}
(使脚本仅打印主机名。)
问:我可以通过使用主机别名将 playbook 运行限制在单个主机上:
$ ansible-playbook playbook.yml --limit foo-host
但我不能通过从 ansible_host 变量中提及主机的 IP 地址来限制运行
$ ansible-playbook playbook.yml --limit 1.2.3.4
答:ansible-inventory 和 jq 能够解析主机。例如脚本
#!/bin/bash
my_host="$(ansible-inventory --list | jq '._meta.hostvars | to_entries[] | select (.value.ansible_host=="'"$1"'") | .key')"
my_host="$(echo $my_host | sed -e 's/^"//' -e 's/"$//')"
echo host: $my_host
ansible-playbook -l $my_host play.yml
有库存
test_01 ansible_host=10.1.0.51
test_02 ansible_host=10.1.0.52
test_03 ansible_host=10.1.0.53
和 playbook.yml
- hosts: all
gather_facts: false
tasks:
- debug:
var: inventory_hostname
给予
$ ./script.bash 10.1.0.53
host: test_03
PLAY [all] **********
TASK [debug] ************
ok: [test_03] => {
"inventory_hostname": "test_03"
}