Ansible запускает определенные задачи на одной группе серверов, другие на другой

Ansible запускает определенные задачи на одной группе серверов, другие на другой

Я переношу группу веб-сайтов из одной инфраструктуры в другую, включая довольно медленную операцию rsync. Процесс миграции включает изменения как в исходной, так и в целевой системах.

Из-за довольно медленной операции rsync, которая является частью процесса, я просматриваю файл var, содержащий подробную информацию о каждом веб-сайте, а затем выполняю задачи, необходимые для перемещения одного веб-сайта за раз.

Я не могу найти способ нацелить некоторые задачи на исходную систему, а некоторые на целевую. Я пробовал сделать это, добавляя hosts: к каждой задаче: (все задачи находятся в одной роли)

Мой план действий:

---
- hosts:
    - tag_aws_autoscaling_groupName_thename
    - tag_Name_server_name
  vars_files:
    - group_vars/all

  roles:
   - unmigratesite

unmigratessite роль:

---

- include_tasks: "unmigrateonesite.yml"
  loop: "{{ wordpress_websites }}"

unmigrateonesite.yml:

- name: rsync site
  hosts: tag_aws_autoscaling_groupName_thename
  shell: rsync -avz /efs/www/{{new_folder}}/htdocs/ 172.31.18.217:/www/{{item.folder}}
  run_once: true
  register: rsync_out

- name: setup proxy host file
  template: src=proxy-host.j2 dest=/efs/nginx/sites-available/{{item.name}} owner=root group=root mode=0644
  hosts: tag_aws_autoscaling_groupName_thename
  notify:
    - restart nginx
  tags:
    - site
    - nginx-host-conf
    - nginx-temp-proxy

- name: setup wp-config.php WP_CONTENT_DIR on old server
  lineinfile: name=/www/{{ folder }}/{{ configuration_file }} regexp=WP_CONTENT_DIR line="define('WP_CONTENT_DIR', '/www/{{folder}}/app');"
  hosts: tag_Name_server_name
  ignore_errors: yes
  tags:
    - wp-config.php
    - wordpress
    - site
    - WP_CONTENT_DIR

Однако я получаю сообщение об ошибке:

    fatal: [54.219.216.237]: FAILED! => {"reason": "conflicting action statements: shell, hosts\n\nThe error appears to be in '/Users/jd/projects/bizinconline/ansible/roles/unmigratesite/tasks/unmigrateonesite.yml': line 22, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n- name: rsync site\n  ^ here\n"}
    fatal: [54.193.100.223]: FAILED! => {"reason": "conflicting action statements: shell, hosts\n\nThe error appears to be in '/Users/jd/projects/bizinconline/ansible/roles/unmigratesite/tasks/unmigrateonesite.yml': line 22, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n- name: rsync site\n  ^ here\n"}
    fatal: [13.57.52.221]: FAILED! => {"reason": "conflicting action statements: shell, hosts\n\nThe error appears to be in '/Users/jd/projects/bizinconline/ansible/roles/unmigratesite/tasks/unmigrateonesite.yml': line 22, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n- name: rsync site\n  ^ here\n"}

Ровно 3 раза — столько раз, сколько хозяев.

Как можно запустить некоторые задачи для одной группы серверов, а некоторые — для другой группы?

решение1

Я не могу найти способ нацелить некоторые задачи на исходную систему, а некоторые на целевую. Я пробовал сделать это, добавляя hosts: к каждой задаче: (все задачи находятся в одной роли)

Первая мысль, которую я подумала, прочитав это, — заменить ваш hosts:на when: "'old_server' in group_names"илиwhen: "'new_server' in group_names"

Если это не сработает, я бы попробовал delegate_to, вотдокументация по делегированию

один веб-сайт за раз

Если вы хотите быть действительно медленным, рассмотрите возможность использования serial: 1. Или даже --stepвкли.

решение2

Вы запускаете задачи на разных хостах, группируя задачи вигры, каждый из которых может определять набор хостов, на которых выполняются его задачи. На самом деле некорректно задавать хосты для отдельной задачи, что является непосредственной причиной сообщения об ошибке.

Вот пример с двумя играми, каждая из которых определяет свой набор хостов. Каждая игра определяет хосты, на которых будут выполняться ее задачи.

 - name: configure new hosts
   hosts: tag_aws_autoscaling_groupName_thename
   strategy: free
   tasks:
    - name: rsync site
      shell: rsync -avz /efs/www/{{new_folder}}/htdocs/ 172.31.18.217:/www/{{item.folder}}
      run_once: true
      register: rsync_out
    
    - name: setup proxy host file
      template: src=proxy-host.j2 dest=/efs/nginx/sites-available/{{item.name}} owner=root group=root mode=0644
      notify:
        - restart nginx
      tags:
        - site
        - nginx-host-conf
        - nginx-temp-proxy

Выше представлена ​​одна пьеса, содержащая два задания. Ниже представлена ​​одна пьеса, содержащая одно задание.

 - name: configure old hosts
   hosts: tag_Name_server_name
   strategy: free
   tasks:
    - name: setup wp-config.php WP_CONTENT_DIR on old server
      lineinfile: name=/www/{{ folder }}/{{ configuration_file }} regexp=WP_CONTENT_DIR line="define('WP_CONTENT_DIR', '/www/{{folder}}/app');"
      ignore_errors: yes
      tags:
        - wp-config.php
        - wordpress
        - site
        - WP_CONTENT_DIR

Связанный контент