使用Ansible执行Python脚本

此文是《Ansible Advent Calendar 2023》的第五篇文章。

首先

当使用Ansible通过Python命令在目标系统上执行脚本时,如果安装了多个版本的Python并且处理不按预期执行,可能会遇到问题。本次将介绍Ansible引用的Python以及在该Python中执行脚本的方法。

获取Ansible使用的Python路径

获取Ansible获取的Python路径。

- name: Gather facts from remote host
  ansible.builtin.setup:
  register: results

- name: Execute selenium on remote host
  ansible.builtin.command:
    cmd: "{{ results.ansible_facts.ansible_python.executable }} script.py"
- name: Gather facts
  ansible.builtin.setup:
  register: results
  delegate_to: localhost

- name: Execute selenium
  ansible.builtin.command:
    cmd: "{{ results.ansible_facts.ansible_python.executable }} script.py"
  delegate_to: localhost

你可以通过这种方法限定使用的Python版本。

使用Ansible执行Selenium的实践示例

这是一个使用 Ansible 来执行 Selenium 的样例。我们在 Ubuntu 22.04 lts 上进行了测试验证。请提前在 Ubuntu 上安装 Docker,并使用 pip 安装 ansible、docker 和 selenium。

---
- name: Create
  hosts: localhost
  connection: local

  tasks:
    - name: Setup Selenium container
      community.docker.docker_container:
        name: selenium
        image: selenium/standalone-firefox:latest
        ports:
          - '4444:4444'
        state: started

    - name: Gather facts
      ansible.builtin.setup:
      register: results

    - name: Execute selenium
      ansible.builtin.command:
        cmd: "{{ results.ansible_facts.ansible_python.executable }} selenium.py"
      args:
        chdir: files
      changed_when: false
import os
from selenium import webdriver
from selenium.webdriver.firefox.options import Options

# Setting up headless Firefox options
options = Options()

driver = webdriver.Remote(
    command_executor='http://localhost:4444/wd/hub',
    options=options
)

driver.get(target_url)

w = driver.execute_script("return document.body.scrollWidth;")
h = driver.execute_script("return document.body.scrollHeight;")
driver.set_window_rect(width=w, height=h)

filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), "./screenshot.png")

driver.save_screenshot(filename)

driver.quit()

Selenium在远程容器中运行。在需要定期截取目标服务器屏幕截图的情况下,以及在执行Ansible playbook时需要进行UI测试的情况下,它会非常有用。

请提供一个相关网站

ansible-playbooks-mamono210/wordpress_install | GitHub これらの処理を実際に導入しているAnsible playbook のコードサンプル

广告
将在 10 秒后关闭
bannerAds