【问题标题】:Write Ansible playbooks using Python dictionary使用 Python 字典编写 Ansible 剧本
【发布时间】:2020-01-25 16:07:16
【问题描述】:

我正在尝试使用 python 脚本执行以下剧本。

playbook = dict(
        name = "Enable Site",
        hosts = [host],
        gather_facts = 'no',
        tasks = [
            dict(action=dict(
                module='find', args=dict(paths="/etc/apache2/sites-enabled")), register='files_found'),
            dict(action=dict(
                module='shell', args="cd /etc/apache2/sites-enabled && a2dissite *"), register='shell_out', when='files_found.matched > 0'),
            dict(action=dict(module='shell', args="a2ensite " + site_name), register='shell_out'),
            dict(action=dict(module='service', args="name='apache2' state='reloaded'"), register='shell_out'),
        ]
    )

这个 playbook 主要检查是否启用了任何 apache 站点,如果是,则通过从 /etc/apache2/sites-enabled 中删除所有文件来禁用它们。

第二个任务应该在/etc/apache2/sites-enabled 目录为空时执行。但是“何时”条件总是被评估为真。即使我写when="False"。也试过when="eval(False)"

【问题讨论】:

标签: python ansible ansible-runner


【解决方案1】:

如果我将您的 playbook 字典转换为常规的 Ansible 剧本,如下所示:

- name: Enable Site
  hosts:
    - localhost
  gather_facts: no
  tasks:
    - action:
        module: find
        args:
          paths: /etc/apache2/sites-enabled
      register: files_found
    - action:
        module: shell
        args: cd /etc/apache2/sites-enabled && a2dissite *
      register: shell_out
      when: files_found.matched > 0
    - action:
        module: shell
        args: a2ensite 100-mysite.conf
      register: shell_out
    - action:
        module: service
        args: name='apache2' state='reloaded'
      register: shell_out

它似乎按预期运行。也就是说,如果我从一个空的/etc/apache2/sites-enabled 目录开始,我会看到:

PLAY [Enable Site] *******************************************************************

TASK [find] **************************************************************************
ok: [localhost]

TASK [shell] *************************************************************************
skipping: [localhost]

TASK [shell] *************************************************************************
changed: [localhost]

您可以看到它正在跳过那里的第二个 shell 任务。然而,想想你的剧本是做什么的:

  • 检查目录是否为空
  • 如果不是,它会禁用一切
  • 它将文件安装到目录中

这意味着每次你运行这个剧本,它都会清空/etc/apache2/sites-enabled,然后重新启用你的site_name变量中命名的站点。

【讨论】:

【解决方案2】:

这个问题相当老了,但你可以找到 ansible 如何解释剧本,但使用你尝试使用的 api:每个实例:

#!/usr/bin/python

import json
from ansible import context
from ansible import constants as C
from ansible.playbook import Playbook
from ansible.parsing.dataloader import DataLoader
from ansible.vars.manager import VariableManager

loader=DataLoader()
variable_manager = VariableManager(loader=loader)


pb = Playbook.load('pb.yml', variable_manager=variable_manager, loader=loader)
print(json.dumps(pb._loader.__dict__['_FILE_CACHE']['/usr/ansible/pb.yml'][0], indent=2))

这将以 json 格式输出剧本。然后你可以将它与 python api 或 ansible-runner 一起使用。

请注意,API 一定会更改,恕不另行通知,因此这在未来的版本中可能无法使用。 .在 RHEL7 上使用 ansible 2.9 进行测试。

【讨论】:

    猜你喜欢
    • 2020-05-08
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多