web-dev-qa-db-fra.com

Impossible de générer .bashrc avec Ansible

Je peux ssh sur l'hôte distant et faire un source /home/username/.bashrc - tout fonctionne correctement . Cependant, si je le fais:

- name: source bashrc
  Sudo: no
  action: command source /home/username/.bashrc

Je reçois:

failed: [hostname] => {"cmd": ["source", "/home/username/.bashrc"], "failed": true, "rc": 2}
msg: [Errno 2] No such file or directory

Je n'ai aucune idée de ce que je fais mal ...

63
pldimitrov

Vous avez deux options pour utiliser la source avec ansible. L'une est avec la commande "Shell:" et/bin/sh (la valeur par défaut ansible). "source" est appelé "." dans/bin/sh. Donc, votre commande serait:

- name: source bashrc
  Sudo: no   
  Shell: . /home/username/.bashrc && [the actual command you want run]

Notez que vous devez exécuter une commande après le sourcing .bashrc b/c chaque session ssh est distincte - chaque commande ansible s'exécute dans une transaction ssh distinct.

Votre deuxième option consiste à forcer Ansible Shell à utiliser bash, puis à utiliser la commande "source":

- name: source bashrc
  Sudo: no   
  Shell: source /home/username/.bashrc && [the actual command you want run]
  args:
     executable: /bin/bash

Enfin, je ferai remarquer que vous voudrez peut-être créer "/ etc/profile" si vous êtes sous Ubuntu ou similaire, ce qui simule plus complètement une connexion locale.

70
Steve Midgley

Donc, command n'exécutera que les exécutables. source n'est pas en soi un exécutable. (C'est une commande Shell intégrée) . Y a-t-il une raison pour laquelle vous souhaitez source une variable d'environnement complète? 

Il existe d'autres moyens d'inclure des variables d'environnement dans Ansible. Par exemple, la directive environment:

- name: My Great Playbook
  hosts: all
  tasks:
    - name: Run my command
      Sudo: no
      action: command <your-command>
      environment:
          HOME: /home/myhome

Une autre méthode consiste à utiliser le module Shell Ansible:

- name: source bashrc
  Sudo: no
  action: Shell source /home/username/.bashrc && <your-command>

ou

- name: source bashrc
  Sudo: no   
  Shell: source /home/username/.bashrc && <your-command>

Dans ces cas, l’instance/l’environnement Shell se terminera une fois l’étape Ansible exécutée.

17
Rico

Je sais que cette réponse est arrivée trop tard, mais j'ai vu suffisamment de code pour utiliser l'option Sudo -iso

- name: source bashrc
  Shell: Sudo -iu {{ansible_user_id}} [the actual command you want run]

Comme dit dans la documentation

The -i (simulate initial login) option runs the Shell specified by the password database entry of the target user as a login Shell.  This means that login-specific
               resource files such as .profile or .login will be read by the Shell.  If a command is specified, it is passed to the Shell for execution via the Shell's -c option.
               If no command is specified, an interactive Shell is executed.  Sudo attempts to change to that user's home directory before running the Shell.  It also initializes
               the environment to a minimal set of variables, similar to what is present when a user logs in.  The Command environment section below documents in detail how the -i
               option affects the environment in which a command is run.
13
Clempat

J'éprouvais le même problème lorsque je tentais de faire en sorte que virtualenvwrapper fonctionne sur un serveur Ubuntu. J'utilisais Ansible comme ceci:

- name: Make virtual environment
  Shell: source /home/username/.bashrc && makevirtualenv virenvname
  args:
    executable: /bin/bash

mais la commande source ne fonctionnait pas.

Finalement, j'ai découvert que le fichier .bashrc avait quelques lignes en haut du fichier qui empêchaient la source de fonctionner quand il était appelé par Ansible:

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

J'ai commenté ces lignes dans .bashrc et tout a fonctionné comme prévu par la suite.

2
gwerner

Bien, j’ai essayé les réponses énumérées, mais celles-ci n’ont pas fonctionné pour moi lors de l’installation de Ruby via rbenv . J'ai dû chercher en dessous des lignes de /root/.bash_profile

PATH=$PATH:$HOME/bin:$HOME/.rbenv/bin:$HOME/.rbenv/plugins/Ruby-build/bin
export PATH
eval "$(rbenv init -)"

Enfin, je suis venu avec cette

- Shell: Sudo su - root -c 'rbenv install -v {{ Ruby_version }}'

On peut l'utiliser avec n'importe quelle commande.

- Shell: Sudo su - root -c 'your command'
1
vikas027

Mes deux sous, j'ai fait le tour de la source du problème ~/.nvm/nvm.sh dans ~/.profile, puis en utilisant Sudo -iu comme suggéré dans une autre réponse.

Jugé en Janvier 2018 vs Ubuntu 16.04.5

- name: Installing Nvm 
  Shell: >
    curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash
  args:
    creates: "/home/{{ ansible_user }}/.nvm/nvm.sh"
  tags:
    - nodejs    

- name: Source nvm in ~/.profile
  Sudo: yes
  Sudo_user: "{{ ansible_user }}"
  lineinfile: >
    dest=~/.profile
    line="source ~/.nvm/nvm.sh"
    create=yes
  tags: 
    - nodejs
  register: output    

- name: Installing node 
  command: Sudo -iu {{ ansible_user }} nvm install --lts
  args:
     executable: /bin/bash
  tags:
    - nodejs    
0
realtebo

J'ai trouvé devenir la meilleure solution:

- name: Source .bashrc
  Shell: . .bashrc
  become: true

Vous pouvez changer d’utilisateur en ajoutant (par défaut: root):

- name: Source .bashrc
  Shell: . .bashrc
  become: true
  become-user: {your_remote_user}

Plus d'infos ici: Ansible devenir

0
Zlopez

J'ai essayé toutes les options ci-dessus avec ansible 2.4.1.0 et personne ne travaille avant deux autres. 

$ cat ~/.bash_aliases 
alias ta="echo 'this is test for ansible interactive Shell'";

Et voici le test ansible:

- name: Check the basic string operations
  hosts: 127.0.0.1 
  connection: local

  tasks:
  - name: Test Interactive Bash Failure
    Shell: ta
    ignore_errors: True

  - name: Test Interactive Bash Using Source
    Shell: source ~/.bash_aliases && ta
    args:
      executable: /bin/bash
    ignore_errors: yes

  - name: Test Interactive Bash Using .
    Shell: . ~/.bash_aliases && ta
    ignore_errors: yes

  - name: Test Interactive Bash Using /bin/bash -ci
    Shell: /bin/bash -ic 'ta'
    register: result
    ignore_errors: yes

  - debug: msg="{{ result }}"

  - name: Test Interactive Bash Using Sudo -ui
    Shell: Sudo -ui hearen ta
    register: result
    ignore_errors: yes

  - name: Test Interactive Bash Using ssh -tt localhost /bin/bash -ci
    Shell: ssh -tt localhost /bin/bash -ci 'ta'
    register: result
    ignore_errors: yes

Et voici le résultat:

$ ansible-playbook testInteractiveBash.yml 
 [WARNING]: Could not match supplied Host pattern, ignoring: all

 [WARNING]: provided hosts list is empty, only localhost is available


PLAY [Check the basic string operations] ************************************************************************************************************************************************

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

TASK [Test Interactive Bash Failure] ****************************************************************************************************************************************************
fatal: [127.0.0.1]: FAILED! => {"changed": true, "cmd": "ta", "delta": "0:00:00.001341", "end": "2018-10-31 10:11:39.485897", "failed": true, "msg": "non-zero return code", "rc": 127, "start": "2018-10-31 10:11:39.484556", "stderr": "/bin/sh: 1: ta: not found", "stderr_lines": ["/bin/sh: 1: ta: not found"], "stdout": "", "stdout_lines": []}
...ignoring

TASK [Test Interactive Bash Using Source] ***********************************************************************************************************************************************
fatal: [127.0.0.1]: FAILED! => {"changed": true, "cmd": "source ~/.bash_aliases && ta", "delta": "0:00:00.002769", "end": "2018-10-31 10:11:39.588352", "failed": true, "msg": "non-zero return code", "rc": 127, "start": "2018-10-31 10:11:39.585583", "stderr": "/bin/bash: ta: command not found", "stderr_lines": ["/bin/bash: ta: command not found"], "stdout": "", "stdout_lines": []}
...ignoring

TASK [Test Interactive Bash Using .] ****************************************************************************************************************************************************
fatal: [127.0.0.1]: FAILED! => {"changed": true, "cmd": ". ~/.bash_aliases && ta", "delta": "0:00:00.001425", "end": "2018-10-31 10:11:39.682609", "failed": true, "msg": "non-zero return code", "rc": 127, "start": "2018-10-31 10:11:39.681184", "stderr": "/bin/sh: 1: ta: not found", "stderr_lines": ["/bin/sh: 1: ta: not found"], "stdout": "", "stdout_lines": []}
...ignoring

TASK [Test Interactive Bash Using /bin/bash -ci] ****************************************************************************************************************************************
changed: [127.0.0.1]

TASK [debug] ****************************************************************************************************************************************************************************
ok: [127.0.0.1] => {
    "msg": {
        "changed": true, 
        "cmd": "/bin/bash -ic 'ta'", 
        "delta": "0:00:00.414534", 
        "end": "2018-10-31 10:11:40.189365", 
        "failed": false, 
        "rc": 0, 
        "start": "2018-10-31 10:11:39.774831", 
        "stderr": "", 
        "stderr_lines": [], 
        "stdout": "this is test for ansible interactive Shell", 
        "stdout_lines": [
            "this is test for ansible interactive Shell"
        ]
    }
}

TASK [Test Interactive Bash Using Sudo -ui] *********************************************************************************************************************************************
 [WARNING]: Consider using 'become', 'become_method', and 'become_user' rather than running Sudo

fatal: [127.0.0.1]: FAILED! => {"changed": true, "cmd": "Sudo -ui hearen ta", "delta": "0:00:00.007906", "end": "2018-10-31 10:11:40.306128", "failed": true, "msg": "non-zero return code", "rc": 1, "start": "2018-10-31 10:11:40.298222", "stderr": "Sudo: unknown user: i\nsudo: unable to initialize policy plugin", "stderr_lines": ["Sudo: unknown user: i", "Sudo: unable to initialize policy plugin"], "stdout": "", "stdout_lines": []}
...ignoring

TASK [Test Interactive Bash Using ssh -tt localhost /bin/bash -ci] **********************************************************************************************************************
hearen@localhost's password: 
changed: [127.0.0.1]

PLAY RECAP ******************************************************************************************************************************************************************************
127.0.0.1                  : ok=8    changed=6    unreachable=0    failed=0  

Il y a deux options travaillées:

  • Shell: /bin/bash -ic 'ta'
  • Shell: ssh -tt localhost /bin/bash -ci 'ta' mais celui-ci nécessite la saisie d'un mot de passe localement.
0
Hearen