我的Playbook中的前两个任务是在localhost
上运行的,并配置了run_once: yes
。但是,它们仍然针对我的库存文件中的第一个条目执行:
$ ansible-playbook -i hosts add_user.yaml
ticket number: 678
Junos commit comment: test change
Junos configuration file: users.conf
PLAY [Apply configuration-template to Juniper devices.] ************************
TASK [Update CVS] **************************************************************
changed: [10.10.10.111 -> localhost]
TASK [Create directory /home/users/ansible/678 for conf diffs and debugging logs] ***
changed: [10.10.10.111 -> localhost]
TASK [Change Junipers configuration] *******************************************
changed: [10.10.10.112] => (item=/home/user/playbooks/users.conf)
changed: [10.10.10.111] => (item=/home/user/playbooks/10.10.10.111/users.conf)
PLAY RECAP *********************************************************************
10.10.10.111 : ok=3 changed=3 unreachable=0 failed=0
10.10.10.112 : ok=1 changed=1 unreachable=0 failed=0
$
如PLAY RECAP
所示,10.10.10.111
执行了三项任务。有没有更优雅的方式来做到这一点?我想一个选项是将localhost
添加到广告资源文件,然后运行条件类似于when: inventory_hostname == "localhost"
的前两个任务和带有when: inventory_hostname =! "localhost"
的第三个任务?但是,在对库存文件中的条目运行任务之前,是否可以运行此类内务处理任务?
答案 0 :(得分:1)
您可以将您的剧本分成两部分,如下所示:
---
- hosts: localhost
vars_prompt:
- name: "ticket_number"
prompt: "ticket number"
private: no
tasks:
- set_fact:
ticket_number: "{{ ticket_number }}"
# housekeeping tasks
- hosts: servers
tasks:
- debug:
var: hostvars.localhost.ticket_number
# servers config tasks
编辑:我添加了一个vars_prompt
与set_fact
相结合,以显示如何使用hostvars
从一个游戏访问另一个游戏。