如何将ansible剧本的所有任务限制为ansible_os_family?

瓦列里(Valeriy Solovyov)

我需要从ansible剧本中获取所有任务的清单并显示它们。

我的问题是ansible_os_family == "Debian"不执行条件我看到了所有任务(例如ansible-playbook rplaybooks / main.yml --list-task)。但我希望那些将被执行的人。

我看到两种方式:

  1. 我将检查何时使用最新的ansible_os_family。我不知道该怎么办?
  2. 我将在python-ansible内部找到执行此条件的方法

我创建了一个类,可以获取剧本任务

playbook.py:

import sys
import os
import stat
import json

import ansible.playbook
import ansible.constants as C
import ansible.utils.template
from ansible import errors
from ansible import callbacks
from ansible import utils
from ansible.color import ANSIBLE_COLOR, stringc
from ansible.callbacks import display



if __name__ !='__main__':
            logging.basicConfig(format = u'%(levelname)-8s [%(asctime)s] %(message)s', level = logging.DEBUG, filename = u'/var/log/rderole.log')
class PyPlaybook(object):
    __filtered_tags=['all']
    def _add_inventory(self,hosts=["127.0.0.1"],params={}):
        """ create inventory obj and add it to params """
        playbook=params["playbook"]
        inventory=ansible.inventory.Inventory(hosts)
        inventory.set_playbook_basedir(os.path.dirname(playbook))

        stats = callbacks.AggregateStats()
        playbook_cb = callbacks.PlaybookCallbacks(verbose=utils.VERBOSITY)
        runner_cb = callbacks.PlaybookRunnerCallbacks(stats, verbose=utils.VERBOSITY)

        params["inventory"]=inventory
        params["stats"]=stats
        params["callbacks"]=playbook_cb
        params["runner_callbacks"]=runner_cb
        return params


    def _playbook_for_hosts(self,hosts=["127.0.0.1"],params={}):
        """ return playbook object with inventory """
        # interface to Playbook class
        """pb=ansible.playbook.PlayBook(
            playbook         = playbook,
            host_list        = host_list,
            module_path      = module_path,
            forks            = forks ,
            timeout          = timeout,
            remote_user      = remote_user,
            remote_pass      = remote_pass,
            sudo_pass        = sudo_pass,
            remote_port      = remote_port,
            transport        = transport,
            private_key_file = private_key_file,
            callbacks        = callbacks,
            runner_callbacks = runner_callbacks,
            stats            = stats,
            sudo             = sudo,
            sudo_user        = sudo_user,
            extra_vars       = extra_vars,
            only_tags        = only_tags,
            skip_tags        = skip_tags,
            subset           = subset,
            inventory        = inventory,
            check            = check,
            diff             = diff,
            any_errors_fatal = any_errors_fatal,
            su               = su,
            su_user          = su_user,
            su_pass          = su_pass ,
            vault_password   = vault_password,
            force_handlers   = force_handlers,
            )"""

        playbook_params=self._add_inventory(hosts,params)
        pb=ansible.playbook.PlayBook(**playbook_params)
        return pb
    def get_tags(self,hosts=["127.0.0.1"],params={}):
        pb=self._playbook_for_hosts(hosts,params)
        playnum = 0
        tags_array={}
        for (play_ds, play_basedir) in zip(pb.playbook, pb.play_basedirs):
            playnum += 1
            play = ansible.playbook.Play(pb, play_ds, play_basedir)
            label = play.name
            matched_tags, unmatched_tags = play.compare_tags(pb.only_tags)
            # Remove skipped tasks
            matched_tags = matched_tags - set(pb.skip_tags)

            unmatched_tags.discard('all')
            unknown_tags = ((set(pb.only_tags) | set(pb.skip_tags)) -
                            (matched_tags | unmatched_tags))

            if unknown_tags:
                continue
            print '  play #%d (%s):' % (playnum, label)

            for task in play.tasks():
                if (set(task.tags).intersection(pb.only_tags) and not
                    set(task.tags).intersection(pb.skip_tags)):
                    if getattr(task, 'name', None) is not None:
                        # meta tasks have no names
                        print ' %s   %s %s' % (task.tags,task.name,task.when)

                        for task_tag in task.tags:
                            #print '>> %s   %s' % (task_tag,task.name)
                            try:
                                tags_array[task_tag].append(task.name)
                            except:
                                tags_array[task_tag]=[]
                                tags_array[task_tag].append(task.name)
            try:
                for tag in self.__filtered_tags:
                    try:
                        del tags_array[tag]
                    except:
                        pass
            except:
                pass
            print json.dumps(tags_array, sort_keys=True, indent=4, separators=(',', ': '))

            return tags_array



if __name__ =='__main__':
    p=PyPlaybook()
    options={'playbook':'/playbooks/rde/main.yml','subset': None,  'private_key_file': None,  'skip_tags': None, 'diff': False, 'check': False, 'remote_user': 'root', 'forks': 5,   'transport': 'local', 'timeout': 10, 'module_path': None}
    #'only_tags':['base'], 'skip_tags':['base']
    #p.run_playbook(["127.0.0.1"],options)
    p.get_tags(["127.0.0.1"],options)

/playbooks/rde/main.yml:

- include: debian.yml 
  when: "ansible_os_family == 'Debian'"
- include: redhat.yml 
  when: "ansible_os_family == 'RedHat'"

红帽

---
- name: Install x2go application RedHat
  yum: name=x2goserver state=present

  when: ansible_os_family == "RedHat"
  tags:
    - remote-access-x2go

debian.yml

---
- name: Add x2go repository
  apt_repository: repo='deb http://ppa.launchpad.net/x2go/stable/ubuntu precise main' state=present
  apt_repository: repo='deb-src http://ppa.launchpad.net/x2go/stable/ubuntu precise main' state=present
  when: ansible_os_family == "Debian"
  tags:
    - remote-access-x2go
- name: Install x2go application
  apt: name=x2goserver update_cache=yes
  apt: name=x2goserver-xsession update_cache=no
  when: ansible_os_family == "Debian"
  tags:
    - remote-access-x2go

python playbook.py

  play #1 (RDE Role):
 ['all', 'remote-access-x2go']   Add x2go repository jinja2_compare ansible_os_family == "Debian"
 ['all', 'remote-access-x2go']   Install x2go application jinja2_compare ansible_os_family == "Debian"
 ['all', 'remote-access-x2go']   Install x2go application RedHat jinja2_compare ansible_os_family == "RedHat"
{   
    "remote-access-x2go": [
        "Add x2go repository",
        "Install x2go application",
        "Install x2go application RedHat"
    ]
}
卡什雅普

我认为那是不可能的。when子句的评估被认为是任务执行本身的一部分。唯一的办法就是破解代码。

也许将问题发布到另一个小组中,我希望您会得到更自信的是/否答案。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将ansible剧本的所有任务限制为ansible_os_family?

来自分类Dev

如何将“在Visual Studio中查找所有引用”限制为仅涉及的变量

来自分类Dev

g:如何将所有页面限制为仅登录用户

来自分类Dev

如何将 ansible 节点的 ssh 密钥复制到 Ansible 上的所有节点?

来自分类Dev

如何配置“全有或全无” Ansible剧本?

来自分类Dev

Ansible:如何将受任务影响的所有主机存储在变量中?

来自分类Dev

Ansible问题:使用ansible将清单中的所有主机作为列表打印,并拒绝运行该剧本的主机IP?

来自分类Dev

如何将值传递给詹金斯的Ansible剧本

来自分类Dev

如何将值传递给詹金斯的Ansible剧本

来自分类Dev

如何将CSS星形选择器*限制为一个类和所有后代?

来自分类Dev

如何将命令返回的主题限制为最近的10个主题,而不是所有已写的主题?

来自分类Dev

Ansible / 将标签限制为组和本地主机

来自分类Dev

如何创建Ansible剧本以获取远程主机的OS版本?

来自分类Dev

错误:任务不是合法参数-Ansible剧本

来自分类Dev

错误:任务不是合法参数-Ansible剧本

来自分类Dev

Ansible:从失败的任务重新运行剧本

来自分类Dev

在Ansible剧本上遍历var文件,然后按顺序运行剧本中的所有角色

来自分类Dev

如何将方法限制为仅接受具有特定限制的参数?

来自分类Dev

Ansible忽略任务中的错误,如果任何任务有错误,则在剧本结尾失败

来自分类Dev

如何将mongodb的访问权限限制为一个OS用户?

来自分类Dev

仅在剧本没有问题的情况下才如何运行Ansible剧本?

来自分类Dev

Simple Ansible剧本:用于将文件复制到目标服务器的任务的文件位置?

来自分类Dev

ansible剧本-任务从未完成,没有结果,仍在我的控制台上运行

来自分类Dev

ansible剧本-任务从未完成,没有结果,仍在我的控制台上运行

来自分类Dev

Ansible API 2.3.2.0 标签传递给剧本但不运行带有标签的任务

来自分类Dev

如何将任务数量限制为 GNU Parallel 中的第一个参数?

来自分类Dev

如何将.click限制为第一张图片,以避免获取存储在容器中的所有图片

来自分类Dev

如何将日志限制为影响给定路径的提交,但请参阅“所有”在这些提交中所做的更改?

来自分类Dev

如何将所有其他(标准)用户的访问权限限制为 Windows 10 专业版中的特定用户文件夹?

Related 相关文章

  1. 1

    如何将ansible剧本的所有任务限制为ansible_os_family?

  2. 2

    如何将“在Visual Studio中查找所有引用”限制为仅涉及的变量

  3. 3

    g:如何将所有页面限制为仅登录用户

  4. 4

    如何将 ansible 节点的 ssh 密钥复制到 Ansible 上的所有节点?

  5. 5

    如何配置“全有或全无” Ansible剧本?

  6. 6

    Ansible:如何将受任务影响的所有主机存储在变量中?

  7. 7

    Ansible问题:使用ansible将清单中的所有主机作为列表打印,并拒绝运行该剧本的主机IP?

  8. 8

    如何将值传递给詹金斯的Ansible剧本

  9. 9

    如何将值传递给詹金斯的Ansible剧本

  10. 10

    如何将CSS星形选择器*限制为一个类和所有后代?

  11. 11

    如何将命令返回的主题限制为最近的10个主题,而不是所有已写的主题?

  12. 12

    Ansible / 将标签限制为组和本地主机

  13. 13

    如何创建Ansible剧本以获取远程主机的OS版本?

  14. 14

    错误:任务不是合法参数-Ansible剧本

  15. 15

    错误:任务不是合法参数-Ansible剧本

  16. 16

    Ansible:从失败的任务重新运行剧本

  17. 17

    在Ansible剧本上遍历var文件,然后按顺序运行剧本中的所有角色

  18. 18

    如何将方法限制为仅接受具有特定限制的参数?

  19. 19

    Ansible忽略任务中的错误,如果任何任务有错误,则在剧本结尾失败

  20. 20

    如何将mongodb的访问权限限制为一个OS用户?

  21. 21

    仅在剧本没有问题的情况下才如何运行Ansible剧本?

  22. 22

    Simple Ansible剧本:用于将文件复制到目标服务器的任务的文件位置?

  23. 23

    ansible剧本-任务从未完成,没有结果,仍在我的控制台上运行

  24. 24

    ansible剧本-任务从未完成,没有结果,仍在我的控制台上运行

  25. 25

    Ansible API 2.3.2.0 标签传递给剧本但不运行带有标签的任务

  26. 26

    如何将任务数量限制为 GNU Parallel 中的第一个参数?

  27. 27

    如何将.click限制为第一张图片,以避免获取存储在容器中的所有图片

  28. 28

    如何将日志限制为影响给定路径的提交,但请参阅“所有”在这些提交中所做的更改?

  29. 29

    如何将所有其他(标准)用户的访问权限限制为 Windows 10 专业版中的特定用户文件夹?

热门标签

归档