เรียกใช้คำสั่งบนโฮสต์ Ansible


247

เป็นไปได้หรือไม่ที่จะรันคำสั่งบนโฮสต์ Ansible?

สถานการณ์ของฉันคือฉันต้องการที่จะเช็คเอาต์จากเซิร์ฟเวอร์ git ที่โฮสต์ภายใน (และไม่สามารถเข้าถึงได้นอกไฟร์วอลล์ บริษัท ) จากนั้นฉันต้องการอัปโหลดการชำระเงิน (tarballed) ไปยังเซิร์ฟเวอร์การผลิต (โฮสต์ภายนอก)

ในขณะนี้ฉันกำลังมองหาสคริปต์ที่ใช้เช็คเอาต์ทาร์บอลแล้วเรียกใช้สคริปต์การปรับใช้ - แต่ถ้าฉันสามารถรวมสิ่งนี้เข้ากับ Ansible ซึ่งจะเป็นที่นิยมมากกว่า

คำตอบ:


347

ใช่คุณสามารถเรียกใช้คำสั่งในโฮสต์ 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

ดูLocal Playbooksในเอกสาร 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

ดูการมอบหมายในเอกสารที่มีรายละเอียดเพิ่มเติม

แก้ไข: คุณสามารถหลีกเลี่ยงการพิมพ์connection: localในการเล่นของคุณโดยเพิ่มสิ่งนี้ลงในสินค้าคงคลังของคุณ:

localhost ansible_connection=local

(ที่นี่คุณจะใช้ "localhost" แทน "127.0.0.1" เพื่ออ้างถึงการเล่น)

แก้ไข: ในรุ่นที่ใหม่กว่าของ ansible คุณไม่จำเป็นต้องเพิ่มบรรทัดข้างต้นลงในสินค้าคงคลังของคุณอีกครั้ง ansible จะถือว่ามีอยู่แล้ว


8
ฉันยังต้องการsudo: noในสถานการณ์ตัวแทน
Danimal

วิธีการเรียกใช้การเชื่อมต่อท้องถิ่นในฐานะผู้ใช้รูท?
Bilal Usean

@BalalUsean 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
น่าสนใจแล้วมันจะทำงานอย่างไรกับการบังคับบัญชา ? เพราะเท่าที่ฉันรู้เราไม่สามารถใช้ param free_formเพื่อกำหนดคำสั่งที่จะถูกดำเนินการ
Ander

@Ander เช่นเดียวกับshellโมดูล
ceving

6
สำหรับใช้กับ command / shell สิ่งที่คุณต้องการคือ "_raw_params"
mvr

41

ฉันต้องการแบ่งปันว่า Ansible สามารถทำงานบน localhost ผ่าน shell:

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

สิ่งนี้อาจเป็นประโยชน์สำหรับงานง่าย ๆ หรือสำหรับการเรียนรู้ Ansible

ตัวอย่างของรหัสนำมาจากบทความดีดีนี้:

ใช้งานเพลย์บุ๊ค ansible ใน localhost


2
ความสำคัญของเครื่องหมายจุลภาค (,) คืออะไรหลังจาก localhost ฉันสังเกตเห็นว่ามันสำคัญสำหรับการออกคำสั่งให้ทำงาน
Tuomas Toivonen

2
เครื่องหมายจุลภาคต่อท้ายคือการกำหนดสินค้าคงคลังที่เรียบง่ายด้วยการชี้ไปที่ไฟล์ มันเป็นแฮ็คที่ไม่มีเอกสารและสามารถหายไปได้ (iirc)
senorsmile

19

คุณสามารถใช้delegate_toเพื่อเรียกใช้คำสั่งบนโฮสต์ Ansible ของคุณ (โฮสต์ของผู้ดูแลระบบ) จากที่ที่คุณกำลังเรียกใช้การเล่น 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 host:

 - 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เป็นจริงสำหรับงานนั้นจะบ่นเกี่ยวกับ sudo และเช่นนั้น ที่อาจเกิดขึ้นโดยตรงกับงานหรือรับมรดกที่อื่น
JL Peyret

4

การขยายคำตอบโดย @gordon นี่คือตัวอย่างของไวยากรณ์ที่อ่านได้และการส่งผ่านอาร์กิวเมนต์ด้วยโมดูลเชลล์ / คำสั่ง (สิ่งเหล่านี้แตกต่างจากโมดูล git ซึ่งจำเป็นต้องมี แต่อาร์กิวเมนต์ที่มีรูปแบบอิสระดังที่ระบุไว้โดย @ander)

- ชื่อ: "ปล่อย tarball ถูกสร้างขึ้น"
  local_action:
    โมดูล: เชลล์
    _raw_params: git archive - รูปแบบ zip - เอาท์พุท release.zip HEAD
    chdir: "ไฟล์ / โคลน / webhooks"

2

จากเอกสาร Ansible :

การมอบหมายนี่ไม่ใช่การอัพเดทที่เฉพาะเจาะจงจริง ๆ

หากคุณต้องการทำงานกับโฮสต์หนึ่งโดยอ้างอิงกับโฮสต์อื่นให้ใช้คำสำคัญ 'delegate_to' ในงาน สิ่งนี้เหมาะสำหรับการวางโหนดในพูลโหลดบาลานซ์หรือลบออก นอกจากนี้ยังมีประโยชน์อย่างมากสำหรับการควบคุมหน้าต่างดับ โปรดระวังว่ามันไม่สมเหตุสมผลเลยที่จะมอบหมายงานทั้งหมด, debug, 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

คำสั่งเหล่านี้จะทำงานบน 127.0.0.1 ซึ่งเป็นเครื่องที่ใช้งาน Ansible นอกจากนี้ยังมีรูปแบบชวเลขที่คุณสามารถใช้งานแบบต่องาน: 'local_action' นี่คือ playbook เดียวกันกับข้างบน แต่ใช้ไวยากรณ์ชวเลขสำหรับการมอบหมายให้เป็น 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

-1

คุณสามารถลองด้วยวิธีนี้

  • git: repo: ' https://foosball.example.org/path/to/repo.git ' ปลายทาง: / srv / รุ่นการชำระเงิน: release-0.2 delegate_to: localhost
  • ชื่อ: ดำเนินการบางคำสั่งถัดไป yum: name = ntp state = ล่าสุด
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.