ตอบได้: ฉันสามารถเรียกใช้บทบาทจากบรรทัดคำสั่งได้หรือไม่


92

สมมติว่าฉันมีบทบาทที่เรียกว่า "apache"

ตอนนี้ฉันต้องการเรียกใช้บทบาทนั้นบนโฮสต์ 192.168.0.10 จากบรรทัดคำสั่งจากโฮสต์ Ansible

ansible-playbook -i  "192.168.0.10" --role  "path to role"

มีวิธีทำไหม?

คำตอบ:


84

ฉันไม่ทราบคุณสมบัตินี้ แต่คุณสามารถใช้แท็กเพื่อเรียกใช้บทบาทเดียวจากเพลย์บุ๊กของคุณ

roles:
    - {role: 'mysql', tags: 'mysql'}
    - {role: 'apache', tags: 'apache'}

ansible-playbook webserver.yml --tags "apache"

62

ด้วย ansible 2.7 คุณสามารถทำได้:

$ cd /path/to/ansible/
$ ansible localhost -m include_role -a name=<role_name>
localhost | SUCCESS => {
    "changed": false,
    "include_variables": {
        "name": "<role_name>"
    }
}
localhost | SUCCESS => {
    "msg": "<role_name>"
}

สิ่งนี้จะเรียกใช้บทบาทจาก / path / to / ansible / role หรือเส้นทางบทบาทที่กำหนดค่าไว้

อ่านเพิ่มเติมที่นี่: https://github.com/ansible/ansible/pull/43131


1
สิ่งนี้ไม่ตอบคำถามจริงๆเนื่องจากไม่มีการอ้างอิงถึงบทบาทภายนอกไฟล์ YAML ที่ @kari นำไปใช้และต้องการรวม ฉันมีคำถามเดียวกัน หลังจากอ่านคำตอบนี้ฉันเข้าใจแค่ว่าเป็นไปได้ ฉันไม่รู้ว่าเป็นอย่างไร
Kola

หวังว่าฉันจะชี้แจงคำตอบแล้ว @Kola
Julius Žaromskis

1
สิ่งนี้เสียใน Ansible 2.8 เพียงแค่บันทึกข้อความแสดงข้อผิดพลาดที่เป็นความลับเช่น'ERROR! 'async_val' is not a valid attribute for a IncludeRole'.
Christian Ciach

โซลูชันนี้ดูเหมือนจะใช้ได้กับฉันด้วย ansible 2.8.2 ดูเหมือนว่าจะมีปัญหาในการเปิดเผยตัวแปรไปยังบทบาทอื่น ๆ ที่รวมอยู่ในบทบาทเดิม (ซึ่งไม่ใช่ปัญหาในเพลย์บุ๊ก) ฉันพยายามเปลี่ยนเป็น-a "name=<role_name> public=yes"แต่ก็ไม่ได้ผล
user2066480

หากต้องการทำความเข้าใจว่า -m และ -a เห็นอะไร docs.ansible.com/ansible/latest/user_guide/modules_intro.htmlโดยทั่วไปนี่คือวิธีที่โมดูลสามารถเริ่มต้นจากบรรทัดคำสั่ง ( -m <module-name>) โดยมีคู่คีย์ = ค่าเป็นอาร์กิวเมนต์ ( -a key=value)
andymel

22

ไม่มีสิ่งนี้ใน Ansible แต่ถ้าเป็นกรณีที่ใช้บ่อยสำหรับคุณลองใช้สคริปต์นี้
วางไว้ที่ไหนสักแห่งในเส้นทางที่ค้นหาได้ของคุณภายใต้ชื่อansible-role:

#!/bin/bash

if [[ $# < 2 ]]; then
  cat <<HELP
Wrapper script for ansible-playbook to apply single role.

Usage: $0 <host-pattern> <role-name> [ansible-playbook options]

Examples:
  $0 dest_host my_role
  $0 custom_host my_role -i 'custom_host,' -vv --check
HELP
  exit
fi

HOST_PATTERN=$1
shift
ROLE=$1
shift

echo "Trying to apply role \"$ROLE\" to host/group \"$HOST_PATTERN\"..."

export ANSIBLE_ROLES_PATH="$(pwd)/roles"
export ANSIBLE_RETRY_FILES_ENABLED="False"
ansible-playbook "$@" /dev/stdin <<END
---
- hosts: $HOST_PATTERN
  roles:
    - $ROLE
END

3
ฉันได้สร้างข้อเสนอเครื่องมือ "สร้างบทบาทที่ตอบได้" แล้วเราจะเห็น: github.com/ansible/proposals/issues/131
jhutar

4
ดูเหมือนว่าจะใช้งานใน Ansible 2.7: github.com/ansible/ansible/pull/43131
EM0

ได้โปรดลองansible localhost -m include_role -a name=myrole- ได้ผลสำหรับฉัน!
jhutar

ansible localhost -m include_role -a name=myroleเสียตั้งแต่ ansible 2.8 เพียงแค่บันทึกข้อความแสดงข้อผิดพลาดที่เป็นความลับเช่น'ERROR! 'async_val' is not a valid attribute for a IncludeRole'.
Christian Ciach


13

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

หลังจากติดตั้งแล้ว (คำแนะนำอยู่ในส่วนสำคัญด้านบน) จากนั้นคุณสามารถดำเนินการตามบทบาทเฉพาะด้วย:

ansible-playbook -i "192.168.0.10" --tags "name_of_role"


4

คุณลองแล้วหรือยัง? มันสุดยอดมาก ฉันใช้ 'update-os' แทนบทบาท 'apache' เพื่อให้เป็นตัวอย่างที่มีความหมายมากขึ้น ฉันมีบทบาทที่เรียกว่าสมมติว่า./roles/update-os/ใน./ฉันเพิ่มไฟล์ที่เรียกว่า./role-update-os.yml:

#!/usr/bin/ansible-playbook
---
- hosts: all
  gather_facts: yes
  become: yes
  roles:
  - update-os

ทำให้ไฟล์นี้สามารถเรียกใช้งานได้ ( chmod +x role-update-os.yml) ตอนนี้คุณสามารถเรียกใช้และ จำกัด สิ่งที่คุณมีในคลังของคุณได้./update-os.yml -i inventory-dev --limit 192.168.0.10ตามขีด จำกัด ที่คุณสามารถส่งผ่านชื่อกลุ่มได้เช่นกัน

  • --limit web,db > web และ db คือกลุ่มที่กำหนดไว้ในสินค้าคงคลังของคุณ
  • --limit 192.168.0.10,192.168.0.201
$ cat inventory-dev
[web]
192.168.0.10

[db]
192.168.0.201

โปรดทราบว่าคุณสามารถกำหนดค่านโยบาย ssh-keys และ sudoers เพื่อให้สามารถดำเนินการได้โดยไม่ต้องพิมพ์รหัสผ่าน - เหมาะอย่างยิ่งสำหรับการทำงานอัตโนมัติมีผลกระทบด้านความปลอดภัยในสิ่งนี้ ดังนั้นคุณต้องวิเคราะห์สภาพแวดล้อมของคุณเพื่อดูว่าเหมาะสมหรือไม่


2

ใน ansible 2.8 ทำงานแตกต่างกันเล็กน้อย

wohlgemuth@leela:~/workspace/rtmtb-ansible/kvm-cluster$ ansible localhost -m import_role -a name=rtmtb
 [WARNING]: No inventory was parsed, only implicit localhost is available

localhost | CHANGED => {
    "changed": true, 
    "checksum": "d31b41e68997e1c7f182bb56286edf993146dba1", 
    "dest": "/root/.ssh/id_rsa.github", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "b7831c4c72f3f62207b2b96d3d7ed9b3", 
    "mode": "0600", 
    "owner": "root", 
    "size": 3389, 
    "src": "/home/wohlgemuth/.ansible/tmp/ansible-tmp-1561491049.46-139127672211209/source", 
    "state": "file", 
    "uid": 0
}
localhost | CHANGED => {
    "changed": true, 
    "checksum": "1972ebcd25363f8e45adc91d38405dfc0386b5f0", 
    "dest": "/root/.ssh/config", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "f82552a9494e40403da4a80e4c528781", 
    "mode": "0644", 
    "owner": "root", 
    "size": 147, 
    "src": "/home/wohlgemuth/.ansible/tmp/ansible-tmp-1561491049.99-214274671218454/source", 
    "state": "file", 
    "uid": 0
}

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.