2

我正在从 python 脚本运行剧本。我正在关注此代码

以下命令完美运行。

ansible -i path/to/inventory.yml host_name -m command -a"a2ensite site_name"

但是当我尝试通过从 python 脚本执行剧本来做同样的事情时。它说该网站不存在。以下是剧本。

playbook = dict(
        name = "Enable Site",
        hosts = ['token_server'],
        gather_facts = 'no',
        tasks = [
            dict(action=dict(module='command', args="a2ensite " + site_name), register='shell_out'),
            dict(action=dict(module='service', args="name='apache2' state='reloaded'"), register='shell_out'),
        ]
    )

它给出了以下错误。

致命:[token_server]:失败!=> {“ansible_facts”:{“discovered_interpreter_python”:“/usr/bin/python”},“已更改”:true,“cmd”:“a2ensite token_server”,“delta”:“0:00:00.054682”,“ end”:“2019-12-11 01:03:10.546478”,“msg”:“非零返回码”,“rc”:1,“start”:“2019-12-11 01:03:10.491796” ,“stderr”:“错误:站点 token_server 不存在!”,“stderr_lines”:[“错误:站点 token_server 不存在!”],“stdout”:“”,“stdout_lines”:[]}

更新 我尝试运行这个剧本。该剧本显示“/etc/apache2/sites-available”目录的内容。

playbook = dict(
        name = "Enable Site",
        hosts = ['token_server'],
        gather_facts = 'yes',
        tasks = [
            dict(action=dict(module='shell', args='ls /etc/apache2/sites-available'), register='shell_out'),
        dict(action=dict(module='debug', args=dict(msg='{{shell_out.stdout}}')))
        ]
    )

它显示了我本地的 /etc/apache2/sites-available 目录的内容。这意味着该命令实际上是在我的本地而不是远程服务器上执行的。

这是我的“主机清单文件”。

all:
  hosts:
    policy_server:
      ansible_host: 155.138.130.72
      ansible_password: XXXXXXXXXX
      ansible_ssh_common_args: -o StrictHostKeyChecking=no
      ansible_user: root
    token_server:
      ansible_host: 155.138.150.239
      ansible_password: XXXXXXXXXX
      ansible_ssh_common_args: -o StrictHostKeyChecking=no
      ansible_user: root
4

1 回答 1

2

最可能的解释是您对示例的操作过于紧密。文档提供的示例具有以下行:

context.CLIARGS = ImmutableDict(connection='local', 
    module_path=['/to/mymodules'], 
    forks=10, become=None, become_method=None, become_user=None, 
    check=False, diff=False)

该行包含connection='local'指示 ansible 始终连接到 localhost 而不管指定的主机。尝试从您的 CLIARGS 中删除它,您的连接应该可以正常工作。祝你好运!

于 2020-01-25T00:19:57.753 回答