Ansible создает каталог на управляющей машине, даже если для параметра delegate_to установлено значение remote при запуске playbook с локальным подключением

#ansible

#ansible

Вопрос:

Я запускаю ansible-playbook, настроенный на предоставление ec2 и настройку компьютера. Я установил локальное соединение для playbook, потому что до запуска скрипта не нужно управлять машиной. После подготовки я предполагал создать каталог на удаленном сервере. Поскольку 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
  
 - name: Create certificate storage directory
  file:
    dest: "{{item.path}}"
    mode: 0750
    state: directory
  delegate_to: {{ remote_host }}
  with_items:
  - path: ~/lets-seng-test
  

Комментарии:

1. Параметр task delegate_to отсутствует delete_to , но я не вижу ни одного из них в вашем playbook / task.

2. Спасибо, я проверил свои playbook, для него установлено значение delegate_to. Я исправил опечатку как в названии, так и в описании, результаты все те же. Есть идеи?

Ответ №1:

Когда вы connection явно устанавливаете воспроизведение, оно будет использоваться для всех задач в этом воспроизведении. Так что не делайте этого. Ansible по умолчанию будет использовать local соединение для localhost , если вы явно не изменили его в своем инвентаре (и опять же, не делайте этого).

Если вы удалите connection настройку в своей игре, delegate_to это может работать так, как вы ожидаете … но я не думаю, что вы этого хотите.

Если ваш 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_host модуля лучшим решением часто является использование соответствующего плагина инвентаризации.

Комментарии:

1. Я становлюсь ближе. Я упомянул host для localhost в playbook. yml, следовательно, все задачи были ограничены localhost. Изменение на all появляется для выбора узла delegate_to, но он по-прежнему выбирает управляющую машину. Я настроил ansible-test в своем каталоге ~/.ssh, а также добавил его в инвентарь, поэтому понятия не имею. Наличие отдельных хостов выглядит чистым, но я должен смешивать как локальные, так и удаленные действия, поэтому предпочитаю delegate_to . Какова цель delegate_to?

2. Это цель delegate_to , да. Если вы хотите обновить свой вопрос, включив в него конкретные задачи, которые вы пытаетесь выполнить, мы могли бы предоставить вам лучший ответ.

3. Я просто пытаюсь создать каталог на удаленном хосте, но он продолжает создаваться на управляющем компьютере (мой Mac). Пожалуйста, проверьте задачу в вопросе

4. Если мы установим connection: local , ожидается, что все хосты будут иметь 127.0.0.1. Мне пришлось удалить его, чтобы заставить его работать. Я планирую упоминать delegate_to во всех задачах, как локальных, так и удаленных, пока не найду решение clouddocs.f5.com/products/orchestration/ansible/devel/usage /…

5. Удаление connection: local заставляет все работать на удаленном хосте. Мне нужно, чтобы 90% задач выполнялись локально, но немногие из них выполнялись на удаленном хосте. Есть ли способ запускать все задачи локально и выборочно выполнять задачи на удаленном хосте?