我有一个我希望在指定目标系统组时只运行 的剧本。虽然我可以通过
指定一个小组(在这个例子中,它可以' staging')ansible-playbook ./playbooks/setup.yml -l staging
如果-l staging
被删除,还有其他组可以运行。我意识到我可以为- hosts: "*"
更改为相应组的每个组制作另一个剧本,但所有其余的剧本都是相同的。有没有办法在不重复/复制面食的情况下做到这一点?
有关其他上下文,请参阅我当前的设置路径结构
.
├── ansible.cfg
├── inventory
│ ├── group_vars
│ ├── host_vars
│ └── hosts
├── playbooks
│ └── setup.yml
└── roles
├── common
│ ├── README.md
│ ├── defaults
│ │ └── main.yml
│ ├── meta
│ │ └── main.yml
│ ├── tasks
│ │ ├── main.yml
│ │ └── redhat.yml
│ └── templates
├── ...
│
└── ...
这是setup.yml
内容的粗略轮廓
---
- hosts: "*"
vars_prompt:
- name: ...
prompt: "..."
default: false
private: no
- name: "bar_a"
prompt: "..."
default: false
private: no
...
roles:
- { role: foobar, foo: 'bar', foo_a: bar_a}
以下是我的ansible.cfg
文件
[defaults]
inventory = inventory
roles_path = roles:$PROJECT_HOME/roles
forks = 10
timeout = 15
host_key_checking = False
#log_path=./log/ansible.log
retry_files_enabled = False
callback_whitelist = profile_tasks
transport = smart
gathering = smart
fact_caching = jsonfile
fact_caching_connection = ./.factcache
fact_caching_timeout = 86400
[ssh_connection]
ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s -o ForwardAgent=yes
pipelining = true
答案 0 :(得分:1)
我收到的当前最佳答案是我错误地认为,并且当前接受的实现我之后的方法是使用多个库存文件。每个人都有自己的一组相似的组。
首先:更改库存设置以模仿
.
├── ansible.cfg
├── inventory
│ ├── default
│ │ ├── ...
│ │ └── hosts
│ └── staging
│ ├── ...
│ └── hosts
:
第二次:更新ansible.cfg
文件以反映新的默认广告资源文件
[defaults]
inventory = inventory/default
...
第三:将默认主机文件(../inventory/defaults/hosts
)更新为此
# intentionally empty
第四:然后拨打电话指定备用库存文件(而不是其他组)
ansible-playbook ./playbooks/setup.yml -i inventory/staging
注意:尝试在未指定广告资源的情况下运行Playbook(即:ansible-playbook ./playbooks/setup.yml
)将根据需要提前/突然结束
注意:使用i
(备用库存文件)而非l
(指定组)
答案 1 :(得分:0)
拆分阶段并将库存分成不同的文件有很多优点,但是有一个用例和一个体面的方法可以选择一个组或主机在执行时运行,就像你描述的那样。
一种方法是将组名作为变量传递 - 在我使用的Ansible环境中,我们有一个约定,即playbooks对变量subset
运行,我们将其传递给{在playbook调用中{1}}(shortform:--extra-vars
)参数。因此,要调用剧本,请运行命令行-e
。
大多数Playbooks只希望再次运行特定的逻辑主机组,因此为了保持该限制,您可以使用Ansible patterns来指定两个组的交集,例如:ansible-playbook -i inventory/staging -e subset=my-group playbook.yml
。这样可以避免尝试在Linux主机上安装IIS,同时保持灵活性,以便在playbook调用时选择要运行的内容......
作为旁注,由set_fact模块won't work here设置的变量。这是因为Ansible解释器在确定哪些主机可以进行整场比赛时,不会解释属于各个主机的变量。