当前位置: 首页 > 知识库问答 >
问题:

在运行playbook时使用--limited和--tag的Anable强制

梁丘璞瑜
2023-03-14

我正在使用anable 2.9.4。我的目标是拒绝在所有节点上意外或没有标签地运行一些剧本。这是我的app.yaml:

  - hosts: all
    remote_user: root
    vars:
      server_domain: mydomain.com
      project_name: project
    tasks:
      - name: checking limit arg
        fail:
          msg: "you must use -l or --limit - when you really want to use all hosts, use -l 'all'"
        when: ansible_limit is not defined
        run_once: true
      - name: "suppress message if tag given"
        set_fact: suppress_message=yes
        tags: dev,test,prod
      - name: "message"
        fail:
          msg: "You didn't choose environment 'dev,test,prod'"
        when: suppress_message is not defined
    roles:
      - testrole

问题是,当我不使用--limit选项时,角色<code>testrole

即使我指定标签 - 标签“mytag”,它也不会检查是否指定了限制。

通过类似的方式,我想强制使用标签,所以每次当你运行行动手册时,你应该指定环境标签(devtestprod) - 例如不同环境的ssh键,配置文件等...

我从中可以期待的是,如果我没有指定标记 devtestprod,则不会指定suppress_message,因此下一个带有 name 消息的任务将失败,并显示消息“您没有选择环境”。

事实是,如果我没有指定任何标记:<br>-<code>supress message</code>have state OK<br>->code>message

如果我指定有效的标签 --标签“dev”
- supress 消息的状态 OK
- 消息甚至没有被提及(我希望跳过)

如果我指定“无效标签” - 标签“dev123”
- 不提及 supress
消息 - 不提及消息

< code>limit的解决方案可以是用< code>- hosts: randomtext替换< code>- hosts: all,这样当没有指定限制时,就没有匹配,但是标记/环境呢?我不知道ansible是如何工作的。从这个例子来看,决定运行什么的逻辑非常混乱。

共有3个答案

哈朗
2023-03-14

另一种选择是添加一个任务来包含角色。所以改变

roles:
  - testrole

  - include_role: 
      name: testrole
竺翰海
2023-03-14

将< code>tasks改为< code>pre_tasks。

顺序为<代码>前置任务 、<代码>角色 、<代码>任务 、<代码>后置任务 。https://docs . ansi ble . com/ansi ble/latest/user _ guide/playbooks _ reuse _ roles . html

剧本排序无关紧要。

濮阳和泰
2023-03-14

下面是一个示例行动手册,应该实现您需要做的事情。

  • 主机在命令行的 myhosts 变量中定义,如果未设置此变量,则第一个任务将中止播放
  • 通过使用两个“特殊标签”,永远从不,我们可以确保:
    • 上述检查始终运行,并且
    • 包含您的 testrole 永远不会运行 — 除非明确指定了 devtestprod 标记
    - hosts: '{{ myhosts | default("localhost") }}'
      tasks:
    
      - name: Fail if hosts are not defined
        run_once: true
        fail:
          msg: >
            You must define hosts in the myhosts variable,
            e.g. `-e myhosts=foo.example.com` on the command line
        when: myhosts is undefined
        tags:
          - always
    
      - name: Helpful message
        run_once: true
        debug:
          msg: >
            This playbook does nothing unless the environment is specified with
            the `--tags` option on the command line (dev, test, or prod).
        tags:
          - always
    
      - name: Include role only when tags are specified
        include_role:
          name: testrole
        tags:
          - never
          - dev
          - test
          - prod
    

    然后将这样执行:

    $ ansible-playbook app.yaml --extra-vars myhosts=foo.example.com --tags dev
    

 类似资料:
  • 我有一个具有这种结构的剧本: 我在所有服务器中部署了一个有点相似的功能,但每个服务器组都有自己的小差异,因此我需要为每个组保留单独的角色。 我还想在所有主机中从每个角色中运行一组选定的任务,即标记为“调整”的任务。 所有主机都应该以提升的权限运行,但并不是所有剧本都是这样,所以我希望该设置仅适用于此剧本(没有全局变量)。 我想将所有重复的参数- 和< code >标记:调整移到< code >主机

  • 问题内容: 如何使用python脚本运行剧本?在python中使用ansible模块等效于以下内容: 我在http://docs.ansible.com/developing_api.html中查看了它们的文档,但是它们的示例非常有限。 问题答案: 弃用声明:此帖子自ansible 2起不起作用。API已更改。 这在“ Python API”下的Ansible文档中进行了介绍。 例如,通过以下方式

  • 我在http://docs.ansible.com/development_api.html中查看了他们的文档,但它们的示例非常有限。

  • 学习如何使用ansible--我需要为集群部署准备服务器。 在所有节点上安装相同的程序集,依此类推。这部分没有问题,一切都解决了。我是通过Ansible-Playbook来做的。在每个节点上,需要在文件/etc/sysconfig/network中执行 也许一些建议,帮忙?

  • 如果我的问题不清楚,请让我知道。PG

  • 我正在运行它正在运行命令来压缩目录。以下是的任务。 上面给出了以下错误。 “警告”:使用unArchive模块而不是运行tar stderr: tar:删除成员名称中的前导'/'tar: /home/ubuntu/my-folder/xyz.log:文件更改 我还尝试了选项<code>——忽略失败的读取 由于此任务位于其他任务之间,因此在此任务之后必须运行的任务将失败。 无序不会给模块提供代码。只