我有很多不时使用的剧本,不时会忘记一些必选和可选的参数。

我知道有一个列表标记,将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