【问题标题】:How can I create a role that includes tasks that should not run by default如何创建包含默认情况下不应运行的任务的角色
【发布时间】:2017-07-11 11:17:57
【问题描述】:

我的角色中的大多数任务都应该在包含该角色的任何时间运行,但是,有几个任务我只想在显式调用时运行。

例如,在我的roles/elastic/tasks/main.yml 文件中,我有很多确保目录存在的任务配置logstash 和elasticsearch。

现在我想创建一组新的任务来初始化 elasticsearch。即它删除现有数据并创建/重新创建架构。

我知道标签,但如果角色运行时不包含标签,我不希望所有任务都意外运行。

为了运行剧本,我使用ansible-playbook logserver.yml

logserver.yml 看起来像这样:

- hosts: localhost
  become: true
  roles:
    - common
    - elastic

我尝试添加一个新任务文件roles/elastic/tasks/init.yml,但我很难确定如何运行该特定任务文件。

【问题讨论】:

    标签: ansible


    【解决方案1】:

    如果我正确理解了这个问题,您可以对某些依赖于命令行中设置的变量的任务使用条件,其默认值将使条件检查失败。

    在scratch.yml中:

    ---
    - hosts: localhost
      vars: 
        my_var: "{{ MY_VAR|default('no') }}"
    
      tasks:
        - name: test 
          debug:
            msg: "my_var: {{ my_var }}"
    
        - name: test 2
          debug:
            msg: "in conditional"
          when: my_var == 'yes'
    

    命令行:

    ansible-playbook scratch.yml
    

    ansible-playbook scratch.yml --extra-vars 'MY_VAR=yes'
    

    【讨论】:

      【解决方案2】:

      我使用“行动”的方法,尽可能避免条件。 通常有一组你想要做的任务,你可以通过名字这样的单字动作来调用它,例如“部署”、“禁用”。 我正在做的是

      1. 对于每个这样的“动作”,我都会创建一个不同的同名任务列表,例如deploy.ymldisable.yml
      2. main.yml 通常看起来像:

        - include: '{{action}}.yml'
          when:
          - (action in ["deploy", "disable"])
        
      3. vars/main.yml 中,即使角色没有通过action 传递变量,我也会确保其中一项操作始终得到明确定义。

      4. 剧本不应该通过action,依赖默认值,或者通过它:

        - name: call role
          hosts: hg
          roles:
          - role:   user.role
            action: disable
        

      这种方法:

      • 非常适合“分而治之”
      • 如果有意义的话,仍然允许在其他人中包含一些“动作”
      • 保持任务列表简短
      • 很容易阅读

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-05
        • 2014-05-02
        • 1970-01-01
        • 1970-01-01
        • 2019-05-21
        相关资源
        最近更新 更多