Ansible: Komut satırından rol çalıştırabilir miyim?


92

"Apache" adında bir rolüm olduğunu varsayalım

Şimdi bu rolü Ansible ana bilgisayardan komut satırından 192.168.0.10 ana bilgisayarında yürütmek istiyorum.

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

Bunu yapmanın bir yolu var mı?

Yanıtlar:


84

Bu özelliğin farkında değilim, ancak başucu kitabınızdan yalnızca bir rol çalıştırmak için etiketleri kullanabilirsiniz.

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

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

62

Ansible 2.7 ile bunu yapabilirsiniz:

$ 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>"
}

Bu, rolü / yol / dan / cevaplanabilir / rollerden veya yapılandırılmış rol yolundan çalıştıracaktır.

Daha fazlasını buradan okuyun: https://github.com/ansible/ansible/pull/43131


1
Bu soruya gerçekten cevap vermiyor çünkü @kari YAML dosyasına uygulanan ve dahil etmek isteyen harici role bir referans yok. Bende de aynı soru var Yine de bu cevabı okuduktan sonra, bunun mümkün olduğunu anlıyorum. Nasıl olduğunu bilmiyorum.
Kola

Umarım cevabı açıkladım @Kola
Julius Žaromskis

1
Bu Ansible 2.8'de bozulmuştur. Yalnızca şu gibi şifreli hata mesajlarını günlüğe kaydeder'ERROR! 'async_val' is not a valid attribute for a IncludeRole'.
Christian Ciach

Bu çözüm benim için yanıtlanabilir 2.8.2 ile çalışıyor gibi görünüyor. Değişkenleri orijinal rolde yer alan diğer rollere maruz bırakma konusunda bir problemi var gibi görünüyor (bu bir oyun kitabında bir problem değildir). Olarak değiştirmeyi denedim -a "name=<role_name> public=yes"ama bu yardımcı olmadı.
user2066480

-M ve -a'nın ne olduğunu anlamak için docs.ansible.com/ansible/latest/user_guide/modules_intro.html Temel olarak modüller komut satırından ( -m <module-name>) argümanlar ( -a key=value) olarak anahtar = değer çiftleri ile başlatılabilir
andymel

22

Ansible'da böyle bir şey yoktur, ancak bu sizin için sıklıkla kullanılan bir durumsa, bu betiği deneyin.
Adının altında aranabilir PATH içinde bir yere koyun 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
Bir "yanıtlanabilir rol oluştur" aracı önerisi oluşturdum, göreceğiz: github.com/ansible/proposals/issues/131
jhutar

4
Böyle görünüyor yanıtlayıcı '2.7 uygulanan oldu: github.com/ansible/ansible/pull/43131
em0

Evet, lütfen deneyin ansible localhost -m include_role -a name=myrole- benim için çalışıyor!
jhutar

ansible localhost -m include_role -a name=myroleansible 2.8'den beri bozuk. Yalnızca'ERROR! 'async_val' is not a valid attribute for a IncludeRole'.
Christian Ciach


13

Oyun auto_tagskitabınızdaki her rol için dinamik olarak aynı adlı bir etiket oluşturan küçük bir Ansible eklentisi yazdım . Burada bulabilirsiniz .

Yükledikten sonra (talimatlar yukarıda özetlenmiştir) daha sonra aşağıdakilerle belirli bir rolü yürütebilirsiniz:

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


4

Bunu denedin mi? süper havalı. Daha anlamlı bir örnek vermek için 'apache' rolü yerine 'update-os' kullanıyorum. Ben diyelim diyelim adlı bir role sahip ./roles/update-os/de benim ./ben adlı bir dosya eklemek ./role-update-os.ymlgibi görünür:

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

Bu dosyayı çalıştırılabilir ( chmod +x role-update-os.yml) yapın. Artık envanterinizde sahip olduğunuz her şeyi çalıştırabilir ve sınırlandırabilirsiniz ./update-os.yml -i inventory-dev --limit 192.168.0.10, sınırı grup adlarını da geçebilirsiniz.

  • --limit web,db > web ve db, envanterinizde tanımlanan gruptur
  • --limit 192.168.0.10,192.168.0.201
$ cat inventory-dev
[web]
192.168.0.10

[db]
192.168.0.201

Şifre yazmak zorunda kalmadan çalıştırabilmek için ssh anahtarlarını ve sudoers politikasını yapılandırabileceğinizi unutmayın - otomasyon için ideal, bununla ilgili güvenlik etkileri vardır. bu nedenle uygun olup olmadığını görmek için çevrenizi analiz etmelisiniz.


2

ansible 2.8'de biraz farklı çalışıyor

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
}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.