Impossible to synchronize with normal user

hello ,
i’ve this inventory.ini :

[servers]
ubuntu ansible_host=xx.xx.xx.xx ansible_user=alexandre ansible_become_method=su ansible_become_user=root
[all:vars]
ansible_python_interpreter=/usr/bin/python3

i 've this playbook :

---
- hosts: servers
  vars_files:
    - ./ansible/group_vars/all/vault.yml
  vars:
    symfony_root: /var/www/monSiteWeb
    local_project_root: "/home/alexandre/Documents/monSiteWeb"
    nvm_dir: "/usr/local/nvm"
    nvm_version: "v0.40.3"
    node_version: "24.7.0"
    composer_path: "/usr/local/bin/composer"  # Chemin fixe car vous l'avez confirmé

  tasks:
    - debug:
        msg: "Ansible version: {{ ansible_version.full }}"

    # === 1. Vérification de Composer (déjà installé selon vous) ===
    - name: Vérifier que Composer est accessible
      command: "{{ composer_path }} --version --no-interaction"
      register: composer_check
      ignore_errors: yes
      changed_when: false
      environment:
        COMPOSER_ALLOW_SUPERUSER: "1"  # Autorise l'exécution en root
        COMPOSER_NO_INTERACTION: "1"   # Désactive les prompts

    - name: Échouer si Composer n'est pas disponible
      fail:
        msg: "Composer n'est pas installé dans {{ composer_path }}. Veuillez l'installer manuellement."
      when: composer_check.rc != 0

    # === 2. Installation de NVM et Node.js ===
    - name: Créer un répertoire global pour NVM
      file:
        path: "{{ nvm_dir }}"
        state: directory
        owner: root
        group: root
        mode: '0755'

    - name: Télécharger et installer nvm globalement
      shell: |
        curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/{{ nvm_version }}/install.sh | bash
      args:
        creates: "{{ nvm_dir }}/nvm.sh"
      environment:
        NVM_DIR: "{{ nvm_dir }}"
        PROFILE: "/dev/null"

    - name: Installer Node.js avec NVM
      shell: |
        export NVM_DIR="{{ nvm_dir }}"
        [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
        nvm install {{ node_version }}
        nvm use {{ node_version }}
      environment:
        NVM_DIR: "{{ nvm_dir }}"
        PATH: "{{ nvm_dir }}/versions/node/v{{ node_version }}/bin:{{ ansible_env.PATH }}"

    # === 3. Préparation du projet ===
    - name: Créer le répertoire du projet avec les bonnes permissions
      file:
        path: "{{ symfony_root }}"
        state: directory
        owner: www-data
        group: www-data
        mode: '0755'

    - name: Créer les répertoires nécessaires pour Symfony
      block:
        - name: Créer var/log
          file:
            path: "{{ symfony_root }}/var/log"
            state: directory
            owner: www-data
            group: www-data
            mode: '0775'

        - name: Créer var/cache
          file:
            path: "{{ symfony_root }}/var/cache"
            state: directory
            owner: www-data
            group: www-data
            mode: '0775'

        - name: Créer .npm pour www-data
          file:
            path: "/home/www-data/.npm"
            state: directory
            owner: www-data
            group: www-data
            mode: '0755'

    - name: Synchroniser les fichiers du projet
      synchronize:
        src: "{{ local_project_root }}/"
        dest: "{{ symfony_root }}"
        delete: yes
        mode: push
        compress: true
        rsync_opts:
          - "--iconv=utf-8,utf-8"
          - "--exclude=.git"
          - "--exclude=*.sh"
          - "--exclude=/vendor"
          - "--exclude=/ansible"
          - "--exclude=/node_modules"
          - "--exclude=var/cache/*"
          - "--exclude=var/log/*"
          - "--exclude=.env.local"
          - "--exclude=package-lock.json"
      delegate_to: localhost
      become: yes
      

    # === 5. Gestion des permissions ===
    - name: Corriger les permissions du projet
      file:
        path: "{{ symfony_root }}"
        state: directory
        owner: www-data
        group: www-data
        recurse: yes

    # === 6. Gestion de node_modules ===
    - name: Supprimer package-lock.json s'il existe
      file:
        path: "{{ symfony_root }}/package-lock.json"
        state: absent

    - name: Créer un nouveau package-lock.json
      command: npm install --package-lock-only
      args:
        chdir: "{{ symfony_root }}"
      become: yes
      become_user: www-data
      environment:
        NVM_DIR: "{{ nvm_dir }}"
        PATH: "{{ nvm_dir }}/versions/node/v{{ node_version }}/bin:{{ ansible_env.PATH }}"
        HOME: "/home/www-data"
        npm_config_cache: "/home/www-data/.npm"

    - name: Mettre à jour les paquets npm si node_modules existe
      command: npm update
      args:
        chdir: "{{ symfony_root }}"
      become: yes
      become_user: www-data
      environment:
        NVM_DIR: "{{ nvm_dir }}"
        PATH: "{{ nvm_dir }}/versions/node/v{{ node_version }}/bin:{{ ansible_env.PATH }}"
        HOME: "/home/www-data"
        npm_config_cache: "/home/www-data/.npm"
      when: lookup('fileglob', symfony_root + '/node_modules/*', wantlist=True) | length > 0

     
    - name: Corriger les versions Symfony dans composer.json
      ansible.builtin.replace:
        path: /var/www/monSiteWeb/composer.json
        regexp: '"symfony/([^"]+)": "[^"]+"'
        replace: '"symfony/\1": "7.0.*"'
        backup: yes



    - name: Supprimer composer.lock pour permettre la mise à jour
      file:
        path: "{{ symfony_root }}/composer.lock"
        state: absent
      become: yes
      become_user: www-data


    # === 7. Gestion de Symfony (avec gestion d'erreurs) ===
    - name: Gérer les dépendances Symfony
      block:
        - name: Vérifier si symfony/runtime est installé
          command: "{{ composer_path }} show symfony/runtime"
          args:
            chdir: "{{ symfony_root }}"
          register: runtime_check
          ignore_errors: yes
          changed_when: false
          become: yes
          become_user: www-data
          environment:
            COMPOSER_HOME: "/home/www-data/.composer"
            PATH: "/usr/local/bin:{{ ansible_env.PATH }}"

        # - name: Installer symfony/runtime si nécessaire
        #   command: "{{ composer_path }} require symfony/runtime --no-interaction --optimize-autoloader"
        #   args:
        #     chdir: "{{ symfony_root }}"
        #   become: yes
        #   become_user: www-data
        #   when: runtime_check.rc is defined and runtime_check.rc != 0
        #   environment:
        #     COMPOSER_HOME: "/home/www-data/.composer"
        #     COMPOSER_NO_INTERACTION: "1"
        #     PATH: "/usr/local/bin:{{ ansible_env.PATH }}"

       

        - name: Forcer Symfony 7 dans composer.json
          ansible.builtin.replace:
            path: "{{ symfony_root }}/composer.json"
            regexp: '"symfony/([^"]+)": "[^"]+"'
            replace: '"symfony/\1": "7.0.*"'
            backup: yes

        - name: Corriger les bundles incompatibles avec Symfony 7
          ansible.builtin.replace:
            path: "{{ symfony_root }}/composer.json"
            regexp: '"(symfony/(monolog-bundle|maker-bundle|webpack-encore-bundle))": "[^"]+"'
            replace: '"\1": "^2.0"'  # Pour monolog-bundle et webpack-encore-bundle
            backup: yes

        - name: Forcer maker-bundle pour Symfony 7
          ansible.builtin.replace:
            path: "{{ symfony_root }}/composer.json"
            regexp: '"symfony/maker-bundle": "[^"]+"'
            replace: '"symfony/maker-bundle": "^1.50"'  # Version compatible Symfony 7
            backup: yes


        - name: Nettoyer le cache Symfony
          command: "php bin/console cache:clear --env=dev"
          args:
            chdir: "{{ symfony_root }}"
          become: yes
          become_user: www-data
          environment:
            APP_ENV: dev
            PATH: "/usr/local/bin:{{ ansible_env.PATH }}"


      rescue:
        - name: Afficher l'erreur détaillée
          debug:
            var: ansible_failed_result

        - name: Créer le fichier de log si absent
          file:
            path: "{{ symfony_root }}/var/log/prod.log"
            state: touch
            owner: www-data
            group: www-data
            mode: '0664'

        - name: Vérifier les logs Symfony (si le fichier existe)
          command: "tail -n 20 {{ symfony_root }}/var/log/prod.log"
          register: symfony_logs
          ignore_errors: yes
          become: yes
          become_user: www-data

        - name: Afficher les logs
          debug:
            var: symfony_logs.stdout_lines
          when: symfony_logs.stdout is defined and symfony_logs.stdout | length > 0

        - name: Redémarrer PHP-FPM
          service:
            name: "php8.3-fpm"
            state: restarted
          when: ansible_os_family == 'Debian'
          become: yes

and, i’ve these problems :

alexandre@alexandre-Matebook:~/Documents/monSiteWeb$ ansible-playbook -i ./ansible/inventory.ini ./ansible/playbookQuatre.yml 

PLAY [servers] *****************************************************************************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************************************************************************
ok: [ubuntu]

TASK [debug] *******************************************************************************************************************************************************************
ok: [ubuntu] => {
    "msg": "Ansible version: 2.21.1"
}

TASK [Vérifier que Composer est accessible] ************************************************************************************************************************************
ok: [ubuntu]

TASK [Échouer si Composer n'est pas disponible] ********************************************************************************************************************************
skipping: [ubuntu]

TASK [Créer un répertoire global pour NVM] *************************************************************************************************************************************
ok: [ubuntu]

TASK [Télécharger et installer nvm globalement] ********************************************************************************************************************************
ok: [ubuntu]

TASK [Installer Node.js avec NVM] **********************************************************************************************************************************************
changed: [ubuntu]

TASK [Créer le répertoire du projet avec les bonnes permissions] ***************************************************************************************************************
ok: [ubuntu]

TASK [Créer var/log] ***********************************************************************************************************************************************************
ok: [ubuntu]

TASK [Créer var/cache] *********************************************************************************************************************************************************
ok: [ubuntu]

TASK [Créer .npm pour www-data] ************************************************************************************************************************************************
ok: [ubuntu]

TASK [Synchroniser les fichiers du projet] *************************************************************************************************************************************
[ERROR]: Task failed: Duplicate become password prompt encountered waiting for become success.
>>> Standard Error
[sudo via ansible, key=lqcrgkzlmhihryqhjaaoxqqrzynktqzp] password:
Désolé, essayez de nouveau.
[sudo via ansible, key=lqcrgkzlmhihryqhjaaoxqqrzynktqzp] password:
Origin: /home/alexandre/Documents/monSiteWeb/ansible/playbookQuatre.yml:95:7

93             mode: '0755'
94
95     - name: Synchroniser les fichiers du projet
         ^ column 7

fatal: [ubuntu -> localhost]: FAILED! => {"changed": false, "msg": "Task failed: Duplicate become password prompt encountered waiting for become success.\n>>> Standard Error\n[sudo via ansible, key=lqcrgkzlmhihryqhjaaoxqqrzynktqzp] password:\nDésolé, essayez de nouveau.\n[sudo via ansible, key=lqcrgkzlmhihryqhjaaoxqqrzynktqzp] password:"}

PLAY RECAP *********************************************************************************************************************************************************************
ubuntu                     : ok=10   changed=1    unreachable=0    failed=1    skipped=1    rescued=0    ignored=0   

alexandre@alexandre-Matebook:~/Documents/monSiteWeb$ date
jeu. 25 juin 2026 17:43:11 CEST

i typed an put this :

alexandre@srv1155463:~$ sudo usermod -aG www-data alexandre
alexandre@srv1155463:~$ date
Thu Jun 25 17:45:54 CEST 2026

,and this configuraton:

alexandre@alexandre-Matebook:~/Documents/AnalyticaTechCode$ ls -la ~/.ssh/
total 24
drwx------  2 alexandre alexandre 4096 juin  11 12:38 .
drwxrwxrwx 61 alexandre alexandre 4096 juin  20 13:27 ..
-rw-------  1 alexandre alexandre 3454 mai   28  2025 id_rsa
-rw-r--r--  1 alexandre alexandre  754 mai   28  2025 id_rsa.pub
-rw-------  1 alexandre alexandre  978 juin  11 12:38 known_hosts
-rw-r--r--  1 alexandre alexandre  142 juin  11 12:37 known_hosts.old
lexandre@alexandre-Matebook:~/Documents/AnalyticaTechCode$ date
jeu. 25 juin 2026 17:54:01 CEST

on my virtual private server.

Could you help me ?
Regards
Alexandre

You don’t have to use the “delegate_to” option. This is set automatically
("For the ansible.posix.synchronize module, the “local host” is the host the synchronize task originates on, and the “destination host” is the host synchronize is connecting to) → ansible.posix.synchronize module – A wrapper around rsync to make common tasks in your playbooks quick and easy — Ansible Community Documentation

I would try following these steps:

  1. Delete “delegate_to” from the task.

  2. If you’re using Ansible, try entering the Ansible become password while running the playbook. Use the command “ansible-playbook -K”.

  3. Try deleting the “become” keyword.

Which method are you using to connect — an SSH key or a password?