python - 使用 Python 字典编写 Ansible playbook

标签 python ansible ansible-runner

我正在尝试使用 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'),
        ]
    )

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

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

最佳答案

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

- 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 变量。

关于python - 使用 Python 字典编写 Ansible playbook,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59910992/

相关文章:

python - 使用 numpy.polyfit 提取多变量方程系数

python - 使用 pyspark 创建年份列

Ansible 被困在某些处于错误 ps 状态的服务器上?

ansible - 如何制作字典元素顶级变量

docker - 使用 ansible-playbook 安装 docker-compose 时出错

python - 仅使用 proc 获取本地网络接口(interface)地址?

python - 使用BeautifulSoup,能否快速遍历到具体的父元素?

python - 如何以编程方式运行 ansible 播放,同时仍使用本地文件作为我的播放?

python - 如何以编程方式并发驱动 Ansible?