Ansible在控制计算机中创建目录,即使在使用本地连接运行playbook时委托_设置为remote

Ansible在控制计算机中创建目录,即使在使用本地连接运行playbook时委托_设置为remote,ansible,Ansible,我正在运行一个ansible playbook,配置为配置ec2和配置机器。我将playbook的连接设置为local,因为在脚本运行之前没有要管理的机器。设置后,我应该在远程服务器中创建目录。由于playbook在本地连接中运行,所以我设置为delete_to:{{remote_host}},所以这个目录创建在远程主机中执行,但它仍然在控制计算机中创建目录 - name: provision instance for Apache hosts: localhost connection

我正在运行一个ansible playbook,配置为配置ec2和配置机器。我将playbook的连接设置为local,因为在脚本运行之前没有要管理的机器。设置后,我应该在远程服务器中创建目录。由于playbook在本地连接中运行,所以我设置为delete_to:{{remote_host}},所以这个目录创建在远程主机中执行,但它仍然在控制计算机中创建目录

- name: provision instance for Apache
  hosts: localhost
  connection: local
  remote_user: ubuntu
  gather_facts: false
  vars_files:
    - vars/env.yml
  vars:
    allow_world_readable_tmpfiles: true
    key_name: ansible-test
    region: us-east-2
    image: ami-0e82959d4ed12de3f # Ubuntu 18.04
    id: "practice-akash-ajay"
    sec_group: "{{ id }}-sec"
    remote_host: ansible-test
    remaining_days: 20
    acme_directory: https://acme-staging-v02.api.letsencrypt.org/directory
    # acme_directory: https://acme-v02.api.letsencrypt.org/directory
    cert_name: "{{ app_slug }}.{{ app_domain}}"
    intermediate_path: /etc/pki/letsencrypt/intermediate.pem
    cert:
      common_name: "{{ app_slug }}.{{ app_domain}}"
      organization_name: PearlThoughts
      email_address: "{{ letsencrypt_email }}"
      subject_alt_name:
      - "DNS:{{ app_slug }}.{{ app_domain}}"
  roles:
    - aws

当您在播放中明确设置连接时,它将用于该播放中的所有任务。所以不要那样做。Ansible默认情况下将使用
local
连接来连接
localhost
,除非您在清单中明确更改了该连接(同样,不要这样做)

如果您删除了播放中的
连接
设置,
委托给
可能会按照您预期的方式工作……但我认为您不想这样做

如果您的playbook为您配置了一个新主机,那么使用Ansible将该主机作为目标主机的方法是将该主机(或其对应的组)作为一个新的播放,该播放的目标
hosts:
中列出了该主机。从概念上讲,您需要:

- host: localhost
  tasks:
    - name: provisiong an AWS instance
      aws_ec2: [...]
      register: hostinfo

    - add_host:
        name: myhost
        ansible_host: "{{ hostinfo... }}"

- hosts: myhost
  tasks:
    - name: do something on the new host
      command: uptime
在配置主机和针对主机执行任务之间,您可能需要一些逻辑,以确保主机已启动并准备好为请求提供服务


与其使用
add\u host
模块,一个更好的解决方案通常是依靠适当的清单插件。

任务选项是
delegate\u to
而不是
delete\u to
,但我在你的剧本/任务中都没有看到。谢谢,我检查了我的剧本,它已设置为delegate\u to。我修正了标题和描述的打字错误,结果仍然一样。知道吗?我越来越近了。我在playbook.yml中提到了主机到本地主机,因此所有任务都限制在本地主机上。更改为
all
会将代理选择到主机,但仍会选择控制机器。我已经在我的~/.ssh目录中配置了ansible测试,并将其添加到清单中,因此我没有任何线索。有单独的主机看起来很干净,但我必须混合本地和远程操作,因此我更喜欢委托给。授权的目的是什么?这是
授权的目的,是的。如果您想更新您的问题,以包括您试图完成的特定任务,我们可能可以为您提供更好的答案。我只是尝试在远程主机中创建一个目录,但它一直在控制计算机(我的Mac)中创建。请检查问题中的任务,如果我们设置connection:local,它将期望所有主机都有127.0.0.1。我必须把它移走才能让它工作。我计划在localhost和remote的所有任务中都提到delegate_to,直到我找到一个解决方案删除连接:local使所有东西都在远程主机中运行。我需要有90%的任务在本地运行,但很少在远程主机上完成。是否有办法在本地运行所有任务,并在远程主机上有选择地执行任务?
- host: localhost
  tasks:
    - name: provisiong an AWS instance
      aws_ec2: [...]
      register: hostinfo

    - add_host:
        name: myhost
        ansible_host: "{{ hostinfo... }}"

- hosts: myhost
  tasks:
    - name: do something on the new host
      command: uptime