我正在使用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”
,它也不会检查是否指定了限制。
通过类似的方式,我想强制使用标签,所以每次当你运行行动手册时,你应该指定环境标签(dev
,test
,prod
) - 例如不同环境的ssh键,配置文件等...
我从中可以期待的是,如果我没有指定标记 dev
、test
或 prod
,则不会指定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是如何工作的。从这个例子来看,决定运行什么的逻辑非常混乱。
另一种选择是添加一个任务来包含角色。所以改变
roles:
- testrole
到
- include_role:
name: testrole
将< code>tasks改为< code>pre_tasks。
顺序为<代码>前置任务 、<代码>角色 、<代码>任务 、<代码>后置任务 。https://docs . ansi ble . com/ansi ble/latest/user _ guide/playbooks _ reuse _ roles . html
剧本排序无关紧要。
下面是一个示例行动手册,应该实现您需要做的事情。
myhosts
变量中定义,如果未设置此变量,则第一个任务将中止播放永远
和从不
,我们可以确保:
您的 testrole
永远不会运行 — 除非明确指定了 dev
、test
或 prod
标记- 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>——忽略失败的读取 由于此任务位于其他任务之间,因此在此任务之后必须运行的任务将失败。 无序不会给模块提供代码。只