我知道有一个列表标记,将list-hosts和list-tasks选项烘焙到ansible-playbook命令中,没有list-args,这将非常有用,但是也许这意味着我使用了ansible错误? devop工程师如何管理可播放剧本的“ api”?也许只是一个递归grep命令来列出不是这样的注册变量的非标准args
grep -or "{{[a-zA-Z_ ]\+}}" roles/. | grep -v "ansible" | grep -v "item"
更好。
例如,我有一个要放在“ showstopper”设备上的程序,但是我用extra_args指定了版本,如果不指定版本,就不会安装。 >
- name: download showstopper from artifactory
local_action: get_url url=https://example.net/artifactory/generic-release-local/com/cdw/mans/silo/showstopper/showstopper-{{ showstopper_version }}.noarch.rpm dest=/tmp validate_certs=no
run_once: true
when: showstopper_version is defined
- name: copy showstopper to silo
copy: src=/tmp/showstopper-{{ showstopper_version }}.noarch.rpm dest=/tmp
when: showstopper_version is defined
- name: Install showstopper
yum: name=/tmp/showstopper-{{ showstopper_version }}.noarch.rpm state=present
notify:
- start cron
when: showstopper_version is defined
以我打算运行的方式运行它时效果很好,但是当我想在另一台计算机上运行它的两个月后,我忘记指定了showtopper_version和我建造的最后几台机器没有配置就退出了。
#1 楼
如果确实需要额外的变量,则可以在角色顶部添加assert
语句,以在未定义它们时阻止其执行:┌─[jamesph@geror] - [~/temp] - [Sat Jan 13, 09:40]
└─[$]> cat assert.yml
- hosts: localhost
vars:
foo: False
tasks:
- assert:
that:
- "foo is defined"
- "bar is defined"
┌─[jamesph@geror] - [~/temp] - [Sat Jan 13, 09:40]
└─[$]> ansible-playbook assert.yml
[WARNING]: Unable to parse /etc/ansible/hosts as an inventory source
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: Could not match supplied host pattern, ignoring: all
[WARNING]: provided hosts list is empty, only localhost is available
PLAY [localhost] *************************************************************************************
TASK [Gathering Facts] *******************************************************************************
ok: [localhost]
TASK [assert] ****************************************************************************************
fatal: [localhost]: FAILED! => {
"assertion": "bar is defined",
"changed": false,
"evaluated_to": false
}
to retry, use: --limit @/Users/jamesph/temp/assert.retry
PLAY RECAP *******************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=1
#2 楼
一些不时需要的可选参数和可选参数
http://docs.ansible.com/ansible/latest/playbooks_variables。 html#variables-defined-in-inventory
好吧,因此,如果您要编写具有合理的默认值的可再发行角色
,请将其置于role / x / defaults / main .yml文件。这意味着
角色将带来一个默认值,但是Ansible中的任何内容都会
覆盖它。这只是默认设置。这就是为什么它说“默认值”的原因:)请参见
角色以获取有关此的更多信息:的角色是
绝对使用的角色,并且不会被
清单所覆盖,您应该像这样将其放置在role / x / vars / main.yml中,并且库存值不能覆盖它。 -e不过,仍然会:
总而言之,请始终设置合理的默认值,例如一种存在的软件版本,而不是使用不存在的一个或空变量,并且如果存在常量,则将其放在vars目录中。
可以检查许多银河剧本:
https://github.com/geerlingguy/ansible-role-nginx
https://github.com/shelleg/ansible-role-gradle
https://galaxy.ansible.com/030/firefox/
评论
好的,那么将“ When”与extra_args一起使用可能是一种难闻的气味。当我确实指定了这些额外的args并且我不想默认执行它们时,我只是想做一些事情。我猜这两种方法都有默认值,并且当值是默认值时不做那些事情,那我要做的就是找出默认的Yamls
–彼得·特纳(Peter Turner)
17年12月27日在22:14
您能否添加代码段,例如确切的when语句?您能否从功能上进行解释,例如如果系统ubuntu和这个版本,那么这个,否则这个。
– 030
17-12-27在22:19
我添加了代码,但是我认为您使用指定默认软件版本的方法可以使他满意,这节省了我的麻烦。
–彼得·特纳(Peter Turner)
17年12月27日在23:11
可以使用group_vars和host_vars覆盖默认变量。
– 030
17-12-27在23:46