Ansible 호스트에서 명령 실행


247

Ansible 호스트에서 명령을 실행할 수 있습니까?

내 시나리오는 내부에서 호스팅되고 회사 방화벽 외부에서 액세스 할 수없는 git 서버에서 체크 아웃하고 싶습니다. 그런 다음 체크 아웃 (tarballed)을 프로덕션 서버 (외부 호스팅)에 업로드하고 싶습니다.

현재 체크 아웃을 수행하고 tarballs 한 다음 배포 스크립트를 실행하는 스크립트를 실행하려고하지만이를 Ansible에 통합 할 수 있다면 바람직합니다.

답변:


347

예, Ansible 호스트에서 명령을 실행할 수 있습니다. 재생의 모든 작업이 Ansible 호스트에서 실행되도록 지정하거나 Ansible 호스트에서 실행되도록 개별 작업을 표시 할 수 있습니다.

Ansible 호스트에서 전체 재생을 실행하려면 다음 hosts: 127.0.0.1connection:local같이 재생 을 지정 하십시오.

- name: a play that runs entirely on the ansible host
  hosts: 127.0.0.1
  connection: local
  tasks:
  - name: check out a git repository
    git: repo=git://foosball.example.org/path/to/repo.git dest=/local/path

자세한 내용 은 Ansible 설명서에서 로컬 플레이 북 을 참조하십시오.

Ansible 호스트에서 단일 작업을 실행하려는 경우 작업을 local_action로컬로 실행하도록 지정할 수 있습니다 . 예를 들면 다음과 같습니다.

- name: an example playbook
  hosts: webservers
  tasks:
  - ...

  - name: check out a git repository
    local_action: git repo=git://foosball.example.org/path/to/repo.git dest=/local/path

자세한 내용 은 Ansible 설명서에서 위임 을 참조하십시오.

편집 : connection: local인벤토리에 추가하여 플레이에 입력하지 않아도됩니다 .

localhost ansible_connection=local

(여기서는 "127.0.0.1"대신 "localhost"를 사용하여 재생을 나타냅니다).

편집 : 최신 버전의 ansible에서는 더 이상 위의 라인을 인벤토리에 추가 할 필요가 없습니다. ansible은 이미 있다고 가정합니다.


8
또한 sudo: no위임 시나리오 에도 필요 했습니다
Danimal

루트 사용자로 로컬 연결을 실행하는 방법은 무엇입니까?
Bilal Usean

@BilalUsean ansible-playbook -K playbook.yml여기서 루트에 대한 -K
Kush

74

좀 더 읽기 쉬운 IMHO 인 두 가지 다른 방법을 찾았습니다.

- name: check out a git repository
  local_action: 
    module: git
    repo: git://foosball.example.org/path/to/repo.git
    dest: /local/path

또는

- name: check out a git repository
  local_action: git
  args:
    repo: git://foosball.example.org/path/to/repo.git
    dest: /local/path

3
재미 있고, 명령이 어떻게 작동 할까요? 내가 아는 한 free_form 매개 변수 를 사용하여 실행될 명령을 정의 할 수 없기 때문에
Ander

@Ander shell모듈 에도 동일하게 적용 됩니다.
12

6
커맨드 / 쉘과 함께 사용하려면 "_raw_params"
mvr

41

쉘을 통해 Ansible을 localhost에서 실행할 수 있음을 공유하고 싶습니다.

ansible all -i "localhost," -c local -m shell -a 'echo hello world'

이는 간단한 작업이나 Ansible에 대한 실습에 도움이 될 수 있습니다.

코드 예제는이 좋은 기사에서 가져 왔습니다.

localhost에서 사용 가능한 플레이 북 실행


2
localhost 다음에 쉼표 (,)의 의미는 무엇입니까? 나는 일에 명령 중요합니다주의
투오 마스 토이 보넨

2
후행 쉼표는 파일을 가리키는 간단한 인벤토리를 정의하는 것입니다. 그것은 문서화되지 않은 일종의 해킹이며 사라질 수 있습니다 (iirc).
senorsmile

19

delegate_toAnsible Play를 실행중인 Ansible 호스트 (관리 호스트)에서 명령을 실행 하는 데 사용할 수 있습니다 . 예를 들면 다음과 같습니다.

Ansible 호스트에 이미 존재하는 파일을 삭제하십시오.

 - name: Remove file if already exists
   file:
    path: /tmp/logfile.log
    state: absent
    mode: "u+rw,g-wx,o-rwx"
   delegate_to: 127.0.0.1

Ansible 호스트에서 새 파일을 만듭니다.

 - name: Create log file
   file:
    path: /tmp/logfile.log
    state: touch
    mode: "u+rw,g-wx,o-rwx"
   delegate_to: 127.0.0.1

1
이것은 지금까지 답변의 가장 깨끗한 해결책 인 것 같습니다.
병아리

1
동의하다. 가장 유연한 신 구문, 가장 유연합니다 (다른 곳에서도 위임). 주의해야 할 한 가지 항목- become작업에 True 인 경우 sudo 등에 대해 불평합니다. 이는 작업에서 직접 발생하거나 다른 곳에서 상속 될 수 있습니다.
JL Peyret

4

@gordon의 답변을 확장하여 다음은 쉘 / 명령 모듈로 전달되는 읽을 수있는 구문 및 인수의 예입니다 (@ander가 지적한 것처럼 자유 형식 인수가 필요하다는 점에서 git 모듈과 다릅니다)

-이름 : "릴리스 타르볼이 생성됩니다"
  local_action :
    모듈 : 쉘
    _raw_params : git archive --format zip-출력 release.zip HEAD
    chdir : "파일 / 클론 / 웹 후크"

2

Ansible 문서에서 :

위임 이것은 실제로 롤링 업데이트에만 적용되는 것은 아니지만 이러한 경우 자주 나타납니다.

다른 호스트를 참조하여 한 호스트에서 작업을 수행하려면 작업에서 'delegate_to'키워드를 사용하십시오. 이는로드 밸런싱 풀에 노드를 배치하거나 제거하는 데 이상적입니다. 또한 중단 창을 제어하는 ​​데 매우 유용합니다. 컨트롤러에서 모든 작업, 디버그, add_host, include 등을 항상 위임하는 것은 이치에 맞지 않습니다. 이것을 'serial'키워드와 함께 사용하여 한 번에 실행되는 호스트 수를 제어하는 ​​것도 좋습니다.

---

- hosts: webservers
  serial: 5

  tasks:

  - name: take out of load balancer pool
    command: /usr/bin/take_out_of_pool {{ inventory_hostname }}
    delegate_to: 127.0.0.1

  - name: actual steps would go here
    yum:
      name: acme-web-stack
      state: latest

  - name: add back to load balancer pool
    command: /usr/bin/add_back_to_pool {{ inventory_hostname }}
    delegate_to: 127.0.0.1

이 명령은 Ansible을 실행하는 시스템 인 127.0.0.1에서 실행됩니다. 작업별로 사용할 수있는 간단한 구문 인 'local_action'도 있습니다. 위와 동일한 플레이 북이 있지만 127.0.0.1로 위임하기위한 속기 구문을 사용합니다.

---

# ...

  tasks:

  - name: take out of load balancer pool
    local_action: command /usr/bin/take_out_of_pool {{ inventory_hostname }}

# ...

  - name: add back to load balancer pool
    local_action: command /usr/bin/add_back_to_pool {{ inventory_hostname }}

일반적인 패턴은 로컬 조치를 사용하여 'rsync'를 호출하여 파일을 관리 서버에 재귀 적으로 복사하는 것입니다. 예를 들면 다음과 같습니다.

---
# ...
  tasks:

  - name: recursively copy files from management server to target
    local_action: command rsync -a /path/to/files {{ inventory_hostname }}:/path/to/target/

암호가없는 SSH 키 또는 ssh-agent가 구성되어 있어야 작동합니다. 그렇지 않으면 rsync에서 암호를 요구해야합니다.


0
ansible your_server_name -i custom_inventory_file_name -m -a "uptime"

기본 모듈은 명령 모듈이므로 command키워드가 필요하지 않습니다.

상승 된 권한으로 명령을 실행해야하는 경우 -b동일한 명령 끝에 사용 하십시오.

ansible your_server_name -i custom_inventory_file_name -m -a "uptime" -b

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.