[ansible] Ansible로 .bashrc를 소싱 할 수 없음

나는 원격 호스트에 ssh하고 할 수 있습니다 source /home/username/.bashrc-모든 것이 잘 작동합니다. 그러나 내가 할 경우 :

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

나는 얻다:

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

나는 내가 뭘 잘못하고 있는지 전혀 모른다 …



답변

ansible과 함께 소스를 사용하는 두 가지 옵션이 있습니다. 하나는 “shell :”명령과 / bin / sh (ansible 기본값)입니다. “소스”는 “.” / bin / sh에서. 따라서 명령은 다음과 같습니다.

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

bashrc b / c를 소싱 한 후 명령을 실행해야합니다. 각 ssh 세션은 별개입니다. 모든 ansible 명령은 별도의 ssh 트랜잭션에서 실행됩니다.

두 번째 옵션은 Ansible 셸이 bash를 사용하도록 강제하는 것입니다. 그러면 “source”명령을 사용할 수 있습니다.

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

마지막으로, Ubuntu 또는 이와 유사한 경우 로컬 로그인을보다 완벽하게 시뮬레이션하는 경우 실제로 “/ etc / profile”을 소스로 지정할 수 있습니다.


답변

따라서 command실행 파일 만 실행됩니다. source그 자체로는 실행 파일이 아닙니다. (내장 쉘 명령입니다). 당신이 원하는 이유가 있습니까?source전체 환경 변수 있습니까?

Ansible에 환경 변수를 포함하는 다른 방법이 있습니다. 예를 들어, environment지시문 :

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

또 다른 방법은 shellAnsible 모듈 을 사용하는 것입니다 .

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

또는

- name: source bashrc
  sudo: no
  shell: source /home/username/.bashrc && <your-command>

이 경우 Ansible 단계가 실행되면 셸 인스턴스 / 환경이 종료됩니다.


답변

이 답변이 너무 늦었 음을 알고 있지만 충분한 코드에서 sudo 옵션을 사용할 수 있습니다 -i
.

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

문서에서 말했듯이

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.


답변

Ubuntu 서버에서 virtualenvwrapper를 작동 시키려고 할 때 이와 동일한 문제가 발생했습니다. 다음과 같이 Ansible을 사용했습니다.

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

그러나 소스 명령이 작동하지 않았습니다.

결국 .bashrc 파일의 맨 위에 Ansible이 호출 할 때 소스가 작동하지 못하게하는 몇 줄이 있다는 것을 발견했습니다.

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

bashrc에서 해당 줄을 주석 처리했으며 그 후 모든 것이 예상대로 작동했습니다.


답변

글쎄, 나열된 답변을 시도했지만 rbenv 통해 루비를 설치하는 동안 저에게 효과가 없었 습니다 . 나는 아래에서 줄을 구해야했다./root/.bash_profile

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

마침내 나는 이것을 생각해 냈습니다.

- shell: sudo su - root -c 'rbenv install -v {{ ruby_version }}'

어떤 명령으로도 이것을 사용할 수 있습니다.

- shell: sudo su - root -c 'your command'


답변

나는 최고의 해결책이된다는 것을 알았다 :

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

다음을 추가하여 사용자를 변경할 수 있습니다 (기본값 : root).

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

여기에 더 많은 정보 : Ansible이


답변

많은 응답이 소스 ~ / .bashrc에 권장되지만 주요 문제는 ansible 셸이 대화 형이 아니고 ~ / .bashrc 구현이 기본적으로 비대화 형 셸을 무시한다는 것입니다 (시작 확인).

내가 찾은 ssh 대화식 로그인 후 사용자로 명령을 실행하는 가장 좋은 솔루션은 다음과 같습니다.

- hosts: all
  tasks:
    - name: source user profile file
      #become: yes
      #become_user: my_user  # in case you want to become different user (make sure acl package is installed)
      shell: bash -ilc 'which python' # example command which prints
      register: which_python
    - debug:
      var: which_python

bash : ‘-i’는 대화 형 쉘을 의미하므로 .bashrc는 무시되지 않습니다. ‘-l’은 전체 사용자 프로필을 제공하는 로그인 쉘을 의미합니다.