Chạy lệnh trên máy chủ Ansible


247

Có thể chạy các lệnh trên máy chủ Ansible không?

Kịch bản của tôi là tôi muốn kiểm tra từ máy chủ git được lưu trữ nội bộ (và không thể truy cập bên ngoài tường lửa của công ty). Sau đó, tôi muốn tải lên thanh toán (tarballed) đến máy chủ sản xuất (được lưu trữ bên ngoài).

Hiện tại, tôi đang xem việc chạy một tập lệnh thực hiện kiểm tra, tarball nó và sau đó chạy tập lệnh triển khai - nhưng nếu tôi có thể tích hợp tập lệnh này vào Ansible thì có thể thích hợp hơn.

Câu trả lời:


347

Có, bạn có thể chạy các lệnh trên máy chủ Ansible. Bạn có thể chỉ định rằng tất cả các tác vụ trong một lần phát chạy trên máy chủ Ansible hoặc bạn có thể đánh dấu các tác vụ riêng lẻ để chạy trên máy chủ Ansible.

Nếu bạn muốn chạy toàn bộ một lần phát trên máy chủ Ansible, thì hãy chỉ định hosts: 127.0.0.1connection:localtrong trò chơi, ví dụ:

- 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

Xem Playbook địa phương trong tài liệu Ansible để biết thêm chi tiết.

Nếu bạn chỉ muốn chạy một tác vụ trên máy chủ Ansible của mình, bạn có thể sử dụng local_actionđể chỉ định rằng một tác vụ sẽ được chạy cục bộ. Ví dụ:

- 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

Xem Phái đoàn trong tài liệu Ansible để biết thêm chi tiết.

Chỉnh sửa: Bạn có thể tránh phải nhập connection: localvào vở kịch của mình bằng cách thêm phần này vào kho của bạn:

localhost ansible_connection=local

(Ở đây bạn sử dụng "localhost" thay vì "127.0.0.1" để tham khảo vở kịch).

Chỉnh sửa: Trong các phiên bản mới hơn của ansible, bạn không còn cần phải thêm dòng trên vào kho của mình, có thể giả định rằng nó đã có ở đó.


8
Tôi cũng cần sudo: notrong kịch bản phái đoàn
Danimal

Làm thế nào để chạy kết nối cục bộ như một người dùng root?
Bilal Usean

@BilalUsean ansible-playbook -K playbook.ymlwhere -K for root
Kush

74

Tôi đã tìm thấy một vài cách khác để bạn có thể viết những cách IMHO dễ đọc hơn một chút.

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

HOẶC LÀ

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

3
Thật thú vị, làm thế nào mà làm việc với lệnh ? Bởi vì theo như tôi biết, chúng tôi không thể sử dụng param free_form để xác định lệnh sẽ được thực thi
Ander

@Ander Áp dụng tương tự cho các shellmô-đun.
ceving

6
để sử dụng với lệnh / shell, thứ bạn muốn là "_raw_params"
mvr

41

Tôi muốn chia sẻ rằng Ansible có thể chạy trên localhost thông qua shell:

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

Điều này có thể hữu ích cho các nhiệm vụ đơn giản hoặc cho một số bài học thực hành về Ansible.

Ví dụ về mã được lấy từ bài viết hay này:

Chạy playbook ansible trong localhost


2
Tầm quan trọng của dấu phẩy (,) sau localhost là gì. Tôi nhận thấy nó rất quan trọng để lệnh hoạt động
Tuomas Toivonen

2
dấu phẩy là để xác định một kho lưu trữ đơn giản với việc chỉ vào một tệp. Đó là một loại hack không có giấy tờ và có thể biến mất (iirc).
senorsmile

19

Bạn có thể sử dụng delegate_tođể chạy các lệnh trên máy chủ Ansible (máy chủ quản trị), từ nơi bạn đang chạy trò chơi Ansible của mình. Ví dụ:

Xóa một tập tin nếu nó đã tồn tại trên máy chủ 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

Tạo một tệp mới trên máy chủ 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
Đây dường như là giải pháp sạch nhất cho bất kỳ câu trả lời nào cho đến nay.
gà con

1
Đồng ý. Ít nhất là cú pháp mới, linh hoạt nhất (ủy nhiệm ở nơi khác nữa). Một mục cần lưu ý - nếu becomeđúng với nhiệm vụ, nó sẽ phàn nàn về sudo và như vậy. Điều đó có thể xảy ra trực tiếp trên nhiệm vụ hoặc được kế thừa cho nơi khác.
JL Peyret

4

Mở rộng câu trả lời của @gordon, đây là một ví dụ về cú pháp và đối số có thể đọc được với mô-đun shell / lệnh (khác với mô-đun git ở chỗ có các đối số được yêu cầu nhưng ở dạng tự do, như được lưu ý bởi @ander)

- tên: "phát hành tarball"
  cục bộ:
    mô-đun: vỏ
    _raw_params: git archive --format zip --output release.zip CHÍNH
    chdir: "tập tin / bản sao / webhooks"

2

Từ tài liệu Ansible :

Phái đoàn Đây không thực sự là bản cập nhật cụ thể nhưng xuất hiện thường xuyên trong những trường hợp đó.

Nếu bạn muốn thực hiện một tác vụ trên một máy chủ có tham chiếu đến các máy chủ khác, hãy sử dụng từ khóa 'Boulevardate_to' trên một tác vụ. Điều này là lý tưởng để đặt các nút trong một nhóm cân bằng tải hoặc loại bỏ chúng. Nó cũng rất hữu ích để kiểm soát các cửa sổ bị cúp. Xin lưu ý rằng việc ủy ​​thác tất cả các tác vụ, gỡ lỗi, add_host, bao gồm, v.v ... luôn luôn được thực thi trên bộ điều khiển. Sử dụng điều này với từ khóa 'nối tiếp' để kiểm soát số lượng máy chủ thực thi cùng một lúc cũng là một ý tưởng hay:

---

- 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

Các lệnh này sẽ chạy trên 127.0.0.1, đó là máy đang chạy Ansible. Ngoài ra còn có một cú pháp tốc ký mà bạn có thể sử dụng trên cơ sở mỗi nhiệm vụ: 'local_action'. Đây là cùng một playbook như trên, nhưng sử dụng cú pháp tốc ký để ủy quyền cho 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 }}

Một mô hình phổ biến là sử dụng một hành động cục bộ để gọi 'rsync' để sao chép đệ quy các tệp vào các máy chủ được quản lý. Đây là một ví dụ:

---
# ...
  tasks:

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

Lưu ý rằng bạn phải có các khóa SSH không có cụm mật khẩu hoặc tác nhân ssh được cấu hình để làm việc này, nếu không rsync sẽ cần yêu cầu cụm mật khẩu.


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

Mô-đun mặc định là mô-đun lệnh, do đó commandkhông cần từ khóa.

Nếu bạn cần đưa ra bất kỳ lệnh nào có đặc quyền nâng cao, hãy sử dụng -bở cuối cùng của lệnh đó.

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

-1

bạn có thể thử theo cách này

  • git: repo: ' https://foosball.example.org/path/to/repo.git ' Dest: / srv / phiên bản thanh toán: phát hành-0,2 ủy nhiệm_to: localhost
  • Tên: thực hiện một số lệnh tiếp theo yum: name = ntp state = mới nhất
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.