Ansible 호스트에서 명령을 실행할 수 있습니까?
내 시나리오는 내부에서 호스팅되고 회사 방화벽 외부에서 액세스 할 수없는 git 서버에서 체크 아웃하고 싶습니다. 그런 다음 체크 아웃 (tarballed)을 프로덕션 서버 (외부 호스팅)에 업로드하고 싶습니다.
현재 체크 아웃을 수행하고 tarballs 한 다음 배포 스크립트를 실행하는 스크립트를 실행하려고하지만이를 Ansible에 통합 할 수 있다면 바람직합니다.
답변
예, Ansible 호스트에서 명령을 실행할 수 있습니다. 재생의 모든 작업이 Ansible 호스트에서 실행되도록 지정하거나 Ansible 호스트에서 실행되도록 개별 작업을 표시 할 수 있습니다.
Ansible 호스트에서 전체 재생을 실행하려면 다음 hosts: 127.0.0.1
과 connection: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은 이미 있다고 가정합니다.
답변
좀 더 읽기 쉬운 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
답변
쉘을 통해 Ansible을 localhost에서 실행할 수 있음을 공유하고 싶습니다.
ansible all -i "localhost," -c local -m shell -a 'echo hello world'
이는 간단한 작업이나 Ansible에 대한 실습에 도움이 될 수 있습니다.
코드 예제는이 좋은 기사에서 가져 왔습니다.
답변
delegate_to
Ansible 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
답변
@gordon의 답변을 확장하여 다음은 쉘 / 명령 모듈로 전달되는 읽을 수있는 구문 및 인수의 예입니다 (@ander가 지적한 것처럼 자유 형식 인수가 필요하다는 점에서 git 모듈과 다릅니다)
-이름 : "릴리스 타르볼이 생성됩니다" local_action : 모듈 : 쉘 _raw_params : git archive --format zip-출력 release.zip HEAD chdir : "파일 / 클론 / 웹 후크"
답변
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에서 암호를 요구해야합니다.
답변
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