我有一个 Ansible 角色,我想根据特定条件在特定主机上执行。
我想填写hosts
Ansible Tower 调查问卷。这是我的剧本:
- name: HTTP Response Deploy Automation
hosts: "{% if geo == 'LHR' %}'dblhr002' {% elif geo == 'SJC' %}'dbsjc003' {% endif %}"
gather_facts: true
roles:
- http-response-deploy
选择 LHR 时出现以下错误:
[WARNING]: Could not match supplied host pattern, ignoring: 'dblhr002'
需要注意的是,当我选择省略主机名周围的引号时,它不起作用。
TLDR;需要从 Ansible 实现以下条件:
if geo == "LHR":
hosts: dblhr002
if geo == "SJC":
hosts: dbsjc003
答案1
只要dblhr002
清单中列出,您提供的内容就可以正常工作。主机模式仅匹配现有主机,它们不会将新主机添加到清单中。
ec2-user@pandora ~ $ cat test.yml
- hosts: "{% if geo == 'LHR' %}'dblhr002' {% elif geo == 'SJC' %}'dbsjc003' {% endif %}"
gather_facts: false
tasks:
- debug:
ec2-user@pandora ~ $ ANSIBLE_INVENTORY_ENABLED=host_list ansible-playbook ~/test.yml -e geo=LHR -i dblhr002,
PLAY [dblhr002] ****************************************************************
TASK [debug] *******************************************************************
ok: [dblhr002] => {
"msg": "Hello world!"
}
PLAY RECAP *********************************************************************
dblhr002 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
如果需要动态添加主机,请add_host
在单独的游戏中使用该任务。
- hosts: localhost
gather_facts: false
tasks:
- add_host:
name: "{{ host_map[geo] }}"
groups: target_host
vars:
host_map:
LHR: dblhr002
SJC: dbsjc003
- hosts: target_host
gather_facts: false
tasks:
- debug: