Mit Ansible-Bestand arbeiten
Ansible verfolgt Konfigurationsressourcen, indem Listen, die auch als Bestandslisten bezeichnet werden, als einfache Dateien beibehalten wird (gelegentlich auch als Hostdateien bezeichnet). Diese Bestandslisten können statisch oder dynamisch sein. Dynamische Listen können automatisch aktualisiert werden, wenn Bestandsressourcen hinzugefügt, gelöscht oder verschoben werden.
Da im Laufe der Zeit viele Oracle Cloud Infrastructure-(OCI-)Ressourcen hinzugefügt und gelöscht werden, können statische Bestandslisten leicht veralten. Tools wie Terraform oder die OCI-SDKs haben möglicherweise ebenfalls Einfluss auf Ihre Ressourcen.
Oracle Cloud Infrastructure stellt ein dynamisches Bestands-Plug-in zur Verwaltung der genauen Ansible-Bestände bereit.
Weitere Informationen zu Ansible-Bestandsdateien finden Sie unter Mit Bestand arbeiten und Mit dynamischem Bestand arbeiten.
Bestands-Plug-in aktivieren
Wenn Sie über eine vorhandene Datei ansible.cfg
verfügen und diese Konfiguration bereits Plug-ins mit enable_plugins
aktiviert, müssen Sie auch das OCI-Bestands-Plug-in aktivieren, indem sie es hinzufügen. Beispiel:
[inventory]
enable_plugins = oracle.oci.oci
Wenn Sie noch keine ansible.cfg
-Datei mit enable_plugins
vorhanden sind, müssen Sie das OCI-Bestands-Plug-in nicht zur Konfiguration hinzufügen.
Bestands-Plug-in konfigurieren
Die einzige Voraussetzung für die Verwendung des OCI-Bestands-Plug-ins nach der Aktivierung ist die Angabe einer Bestandsquelle, für die Sie Parsingberechtigungen besitzen. Bestandsquellen sind in einer YAML-Konfigurationsdatei definiert. Weitere Informationen finden Sie unter Benutzerberechtigungen.
Um das Bestands-Plug-in mit einer YAML-Konfigurationsquelle zu verwenden, erstellen Sie eine Datei mit einem der folgenden akzeptierten Dateinamen:
- <Dateiname>.oci.yml
- <Dateiname>.oci.yaml
Fügen Sie plugin: oracle.oci.oci
zur YAML-Konfigurationsdatei hinzu.
Die minimale Bestandsausgangsdatei, die zum Ausführen des OCI-Bestands-Plug-ins benötigt wird, sieht beispielsweise folgendermaßen aus:
# demo.oci.yml
plugin: oracle.oci.oci
# Optional fields to specify oci connection config:
config_file: ~/.oci/config
config_profile: DEFAULT
In diesem Beispiel werden die Parameter config_file
und config_profile
verwendet, damit das Plug-in Authentifizierungsinformationen verwenden kann, die in der SDK- und CLI-Konfigurationsdatei beschrieben sind. Einige Parameter können auch als Umgebungsvariablen angegeben werden.
Eine vollständige Liste der vom Plug-in unterstützten Parameter und Umgebungsvariablen finden Sie unter OCI-Bestands-Plug-in. Die Bestandszenarios enthalten viele der verfügbaren Parameter.
Standardmäßig wird vom OCI-Bestands-Plug-in nur Compute, die eine öffentliche IP-Adresse aufweisen, erkannt und aufgeführt. Weitere Informationen finden Sie unter Voreinstellungen für Hostnamensformat.
Prioritätsfolge
Das Bestands-Plug-in verwendet die folgende Prioritätsreihenfolge, wenn eine Option an mehreren Stellen angegeben wird:
- YAML-Dateieinstellungen.
- Umgebungsvariablen.
- Konfigurationseinstellungen im ausgewählten
profile
-Abschnitt in der OCI-Konfigurationsdatei.
Datenbankhosts abrufen
Standardmäßig erkennt und listet das OCI-Bestands-Plug-in nur Compute-Instanzen auf. Datenbankknoten sind Server, auf denen Datenbanksoftware ausgeführt wird. Datenbankknoten werden abgerufen, indem die Option fetch_db_hosts
auf true
gesetzt wird. Beispiel:
# demo.oci.yml
# DB Hosts
plugin: oracle.oci.oci
fetch_db_hosts: true
Bestands-Plug-in verwenden
Mit Bestands-Plug-ins von Ansible können Sie die Datenquellen definieren, mit denen ein Bestand von Hosts kompiliert wird, an denen Ansible Aufgaben ausführt. Auf diese Datenquellen wird entweder über die Befehlszeilenparameter -i /path/to/file
oder -i 'host1, host2'
zugegriffen. Alternativ ist der Zugriff auch über andere Konfigurationsquellen möglich.
Sie können das Bestands-Plug-in z.B. mit dem folgenden Befehl ausführen:
ansible-inventory -i <filename>.oci.yml --graph
Dieser Befehl erzeugt eine Ausgabe, die in etwa wie folgt aussieht:
@all:
|--@oci:
| |--compute_instance1
| |--compute_instance2
|–@ungrouped:
Standardmäßig wird der Bestand für alle Compartments im Mandanten generiert. Sie benötigen die Berechtigung
COMPARTMENT_INSPECT
im Root-Compartment für dieses Skript, um auf alle Compartments zugreifen zu können. Wenn jedoch compartment_ocid
angegeben wird, wird das Bestandsverzeichnis nur für dieses Compartment generiert, sodass Sie nur die Berechtigung COMPARTMENT_INSPECT
für das angegebene Compartment benötigen. Weitere Informationen finden Sie unter Funktionsweise von Policys.Um alle Instanzdetails abzurufen, benötigen Sie auch die Berechtigung zum Auflisten und Lesen von Instanzen und VNICs sowie zum Lesen von VCNs und Subnetzen. Weitere Informationen finden Sie unter Benutzerberechtigungen.
Sie können Bestands-Plug-ins zu Ihrem Plug-in-Pfad hinzufügen und den Standardbestandspfad festlegen, um Befehle zu vereinfachen. Fügen Sie den Standardbestandspfad zum Abschnitt [defaults]
in der Datei ansible.cfg
hinzu, oder verwenden sie die Umgebungsvariable ANSIBLE_INVENTORY, um auf Ihre Bestandsquellen zu verweisen. Anschließend können Sie den folgenden Befehl ausführen, um dieselbe Ausgabe zu erhalten wie beim direkten Übergeben der YAML-Konfigurationsquellen:
ansible-inventory --graph
Bestands-Plug-ins werden normalerweise nur zu Beginn einer Ausführung ausgeführt, bevor Playbooks, Plays und Rollen geladen werden. Sie können ein Plug-in mit der Aufgabe meta: refresh_inventory
erneut ausführen, indem Sie den vorhandenen Bestand löschen und neu erstellen.
Bestandsausgabe
Die vom Bestands-Plug-in generierte Bestandsliste wird anhand der folgenden Attribute gruppiert:
- Die Region, in der sich die Compute-Instanz befindet
- Der Name des Compartments, zu dem die Compute-Instanz gehört
- Die Availability-Domain, in der sich die Compute-Instanz befindet
vcn_id
des VCN, in dem sich die Compute-Instanz befindetsubnet_id
des Subnetzes, in dem sich die Compute-Instanz befindetsecurity_list_ids
des Subnetzes, in dem sich die Compute-Instanz befindetimage_id
des Images, mit dem die Compute-Instanz gestartet wird- Die Compute-Ausprägung der Compute-Instanz
- Freiformtags der Compute-Instanz, wobei der Gruppenname auf
tag_<tag_name>=<tag_value>
gesetzt ist - Definierte Tags der Compute-Instanz, wobei der Gruppenname auf
<tag_namespace>#<tag_name>=<tag_value>
gesetzt ist - Metadaten für OCI-Compute-Instanz (Schlüssel/Wert-Paare), wobei der Gruppenname auf
<metadata-key>=<metadata-value>
gesetzt ist - Erweiterte Metadaten (Schlüssel/Wert-Paare), wobei der Gruppenname auf
<metadata-key>=<metadata-value>
gesetzt ist
Voreinstellungen für Hostnamensformat
Der vom OCI-Bestand-Plug-in generierte Bestand enthält standardmäßig nur Instanzen mit einer öffentlichen IP-Adresse. Das ist nützlich, wenn sich der Ansible-Controllerknoten außerhalb des VCN befindet, da Ansible nur Instanzen mit öffentlichen IP-Adressen erreichen kann.
Sie können inventory_hostname
als private_ip
oder einen beliebigen benutzerdefinierten Hostnamen konfigurieren, indem Sie Jinja2-Ausdrücke als Liste an die Option hostname_format_preferences
übergeben. Die Option hostname_format_preferences
erstellt inventory_hostname
aus einer Liste der Jinja2-Ausdrücke in der Reihenfolge ihrer Priorität. Das Bestands-Plug-in ignoriert Ausdrücke, wenn das Ergebnis eine leere Zeichenfolge oder "Kein Wert" ist. Die Instanz wird ignoriert, wenn keiner der hostname_format_preferences
-Ausdrücke zu einem nicht leeren Wert führt.
Im folgenden Beispiel wird inventory_hostname
auf "display_name+'.oci.com'"
, "private_ip"
oder "public_ip"
gesetzt:
hostname_format_preferences:
- "display_name+'.oci.com'"
- "private_ip"
- "public_ip"
Ausdrücke werden auf host_vars
jeder Instanz ausgewertet. Die Auswertung berücksichtigt die Prioritätsreihenfolge in Ihrer Konfiguration, um inventory_hostname
zu erstellen. Im vorherigen Beispiel wird "display_name+'.oci.com'"
vor "private_ip"
und "public_ip"
ausgewertet.
Hosts filtern
Das OCI-Bestands-Plug-in enthält verschiedene Filteroptionen, um die von dem Plug-in zurückgegebenen Host zu filtern.
Hosts aus Bestand ausschließen
Sie können eine Liste mit Jinja2-Bedingungsausdrücken an den Parameter exclude_host_filters
übergeben. Jeder Ausdruck in der Liste wird für jeden Host ausgewertet. Wenn der Ausdruck "true" ist, wird der Host aus dem Bestand ausgeschlossen. Der Parameter exclude_host_filters
hat Vorrang vor den Optionen include_host_filters
und filters
.
Das folgende Beispiel schließt Hosts, die sich nicht in der Region "iad" befinden, aus dem Bestand aus:
exclude_host_filters:
- "region not in ['iad']"
Hosts mit Freiformtags ausschließen
Um einen Host mit Freiformtags aus dem Bestand auszuschließen, können Sie die folgende Syntax verwenden:
exclude_host_filters:
# filter the hosts with freeform tag with key <tag_key> which has value <tag_value>
- "'<tag_value>' == freeform_tags.<tag_key>"
# filter the hosts which has <tag_key> freeform tag
- "'<tag_key>' in freefrom_tags"
Beispiel:
exclude_host_filters:
- "'operating_system' in freeform_tags"
- "'linux' == freeform_tags.operating_system"
Hosts mit definierten Tags ausschließen
Um einen Host mit definierten Tags aus dem Bestand auszuschließen, können Sie die folgende Syntax verwenden:
exclude_host_filters:
#filter the hosts with defined tag in <namespace> with <tag_key> and <tag_value>
- "'<tag_value>' == defined_tags.<namespace>.<tag_key>"
# filter the hosts with <tag_key> in the <namespace> in defined tags
- "'<tag_key>' in defined_tags.<namespace>"
Beispiel:
exclude_host_filters:
- "'ansible' == defined_tags.ansible_collections_tag_namespace.managed_by"
- "'managed_by' in defined_tags.ansible_collections_tag_namespace"
Hosts in Bestand einschließen
Sie können eine Liste mit Jinja2-Bedingungsausdrücken an den Parameter include_host_filters
übergeben. Jeder Ausdruck in der Liste wird für jeden Host ausgewertet. Wenn der Ausdruck "true" ist, wird der Host in das Bestandsverzeichnis aufgenommen.
Das folgende Beispiel schließt nur die Hosts in den Bestand ein, deren display_name
mit ".oci.com" endet:
include_host_filters:
- "display_name is match('.*.oci.com')"
Die Optionen
include_host_filters
und filters
können nicht gemeinsam verwendet werden.Hosts mit Freiformtags einschließen
Um einen Host aus dem Bestand mit Freiformtags aufzunehmen, können Sie die folgende Syntax verwenden:
include_host_filters:
# filter the hosts with freeform tag with key <tag_key> which has value <tag_value>
- "'<tag_value>' == freeform_tags.<tag_key>"
# filter the hosts which has <tag_key> freeform tag
- "'<tag_key>' in freefrom_tags"
Beispiel:
include_host_filters:
- "'operating_system' in freeform_tags"
- "'linux' == freeform_tags.operating_system"
Hosts mit definierten Tags einschließen
Um einen Host aus dem Bestand mit definierten Tags einzuschließen, können Sie die folgende Syntax verwenden:
include_host_filters:
#filter the hosts with defined tag in <namespace> with <tag_key> and <tag_value>
- "'<tag_value>' == defined_tags.<namespace>.<tag_key>"
# filter the hosts with <tag_key> in the <namespace> in defined tags
- "'<tag_key>' in defined_tags.<namespace>"
Beispiel:
include_host_filters:
- "'ansible' == defined_tags.ansible_collections_tag_namespace.managed_by"
- "'managed_by' in defined_tags.ansible_collections_tag_namespace"
Caching aktivieren
Caching kann aktiviert werden, um Lookups zu beschleunigen. Sie können Caching-Optionen für eine individuelle YAML-Konfigurationsquelle oder für mehrere Bestandsquellen mit Umgebungsvariablen oder Ansible-Konfigurationsdateien festlegen. Wenn Sie Caching für ein Bestands-Plug-in aktivieren, ohne bestandsspezifische Caching-Optionen anzugeben, verwendet das Bestands-Plug-in Fakten-Caching-Optionen.
Im Folgenden finden Sie ein Beispiel für das Aktivieren von Caching für eine einzelne YAML-Konfigurationsdatei:
# demo.oci.yml
plugin: oracle.oci.oci
cache: yes
cache_plugin: jsonfile
cache_timeout: 7200
cache_connection: /tmp/oci_inventory
cache_prefix: oci
Dynamische Gruppen verwenden
Sie können dynamische Gruppen mit Hostvariablen mit der Option keyed_groups
erstellen. Mit der Option groups
können auch Gruppen erstellt und Hostvariablen erstellt und geändert werden. Syntax für Gruppen mit Schlüsseln und Gruppen, die Tags verwenden:
keyed_groups
- key: freeform_tags.<tag key>
prefix: <my_prefix>
- key: defined_tags.<namespace>.<tag key>
prefix: <my_prefix>
groups:
<group_name>: "'<tag_value>' == freeform_tags.<tag_key>"
<group_name>: "'<tag_value>' == defined_tags.<namespace>.<tag_key>"
<group_name>: "'<tag_key>' in defined_tags.<namespace>"
Beispiel:
# demo.oci.yml
plugin: oracle.oci.oci
regions:
- us-phoenix-1
- us-ashburn-1
keyed_groups:
# add hosts to tag_Name_value groups for each oci host's tags.Name variable
- key: tags.Name
prefix: tag_Name_
groups:
# add hosts to the group development if any of the dictionary's keys or values is the word 'devel'
development: "'devel' in (tags|list)"
# add hosts with freefrom_tags that has 'operating_system' key and 'linux' value to 'linux' group
linux: "'linux' == freeform_tags.operating_system"
# add hosts with freefrom tags that has 'operating_system' key to os group
os: "'operating_system' in freeform_tags"
# add hosts with defined tags in the namespace 'ansible_collections_tag_namespace' with tag 'managed_by' and value 'ansible'
ansible_managed: "'ansible' == defined_tags.ansible_collections_tag_namespace.managed_by"
# add hosts with defined tags in the namespace 'ansible_collections_tag_namespace' with tag 'managed_by'
cm_managed_hosts: "'managed_by' in defined_tags.ansible_collections_tag_namespace"
Dieses Beispiel erzeugt die Ausgabe, die in etwa wie folgt aussieht:
@all:
|--@development:
| |--compute_instance1
| |--compute_instance2
|--@linux:
| |--compute_instance1
|--@os:
| |--compute_instance1
| |--compute_instance2
|--@ansible_managed:
| |--compute_instance1
|--@cm_managed_hosts:
| |--compute_instance2
|--@ungrouped
Wenn ein Host nicht über die in der Konfiguration angegebenen Variablen verfügt, wird der Host nur zu den vom Bestands-Plug-in erstellten Gruppen hinzugefügt, und die Hostvariable ansible_host wird nicht geändert.
Bestandsszenarios
Die folgenden Abschnitte enthalten Konfigurationsbeispiele für häufige Bestandszenarios.
Alle Compute-Hosts abrufen
Um alle Hosts abzurufen, kann Ihre Konfiguration so einfach wie im folgenden Beispiel sein:
plugin: oracle.oci.oci
Nur DB-Hosts abrufen
Wenn alle Knoten abgerufen werden sollen, die Datenbanksoftware hosten, während Compute-Hosts ausgeschlossen werden, sieht die Konfiguration wie im folgenden Beispiel aus:
plugin: oracle.oci.oci
# fetch databse hosts
fetch_db_hosts: true
# don't fetch Compute hosts
fetch_compute_hosts: False
Hosts aus bestimmten Regionen abrufen
Wenn nur Hosts in angegebenen Regionen abgerufen werden sollen, sieht die Konfiguration in etwa wie im folgenden Beispiel aus:
plugin: oracle.oci.oci
# Fetch only the hosts in the regions us-ashburn-1, us-phoenix-1
regions:
- us-ashburn-1
- us-phoenix-1
Bestandshostnamen festlegen
Wenn das Format des im Bestand verwendeten Bestandshostnamens festgelegt werden soll, enthält die Konfiguration einen Abschnitt wie im folgenden Beispiel:
plugin: oracle.oci.oci
# Sets the inventory_hostname to either "display_name+'.oci.com'", "public_ip", "private_ip", or "id"
# "display_name+'.oci.com'" has more preference than "public_ip", "private_ip", "id".
hostname_format_preferences:
- "display_name+'.oci.com'"
- "public_ip"
- "private_ip"
- "id"
Weitere Informationen finden Sie unter Voreinstellungen für Hostnamensformat.
Hosts aus Bestand ausschließen
Wenn Hosts mit einem Jinja2-Bedingungsausdruck aus dem Bestand ausgeschlossen werden sollen, enthält die Konfiguration einen Abschnitt wie im folgenden Beispiel:
plugin: oracle.oci.oci
# Excludes hosts that are not in the region 'iad' from the inventory
exclude_host_filters:
- "region not in ['iad']"
Weitere Informationen finden Sie unter Hosts filtern.
Hosts in Bestand einschließen
Wenn Hosts mit einem Jinja2-Bedingungsausdruck in den Bestand aufgenommen werden sollen, enthält die Konfiguration einen Abschnitt wie im folgenden Beispiel:
plugin: oracle.oci.oci
# Includes only the hosts that have a display_name ending with '.oci.com' in the inventory
include_host_filters:
- "display_name is match('.*.oci.com')"
Weitere Informationen finden Sie unter Hosts filtern.
Die Optionen
include_host_filters
und filters
können nicht gemeinsam verwendet werden.Hosts aus bestimmten Compartments abrufen
Das folgende Beispiel zeigt, wie alle Hosts aus den angegebenen Compartments abgerufen werden:
# Fetch all hosts
plugin: oracle.oci.oci
# Select compartment by OCID or name
compartments:
- compartment_ocid: <ocid1.compartment.oc1..exampleuniqueID>
fetch_hosts_from_subcompartments: false
- compartment_name: "<compartment_name>"
parent_compartment_ocid: <ocid1.tenancy.oc1..exampleuniqueID>
Weitere Optionen
Die folgende Beispielkonfiguration kombiniert die oben genannten Szenarios mit weiteren Konfigurationsoptionen:
# Fetch all hosts
plugin: oracle.oci.oci
# Optional fields:
config_file: ~/.oci/config
config_profile: DEFAULT
# Example select regions
regions:
- us-ashburn-1
- us-phoenix-1
# Enable threads to speedup lookup
enable_parallel_processing: yes
# Select compartment by ocid or name
compartments:
- compartment_ocid: <ocid1.compartment.oc1..exampleuniqueID>
fetch_hosts_from_subcompartments: false
- compartment_name: "<compartment_name>"
parent_compartment_ocid: <ocid1.tenancy.oc1..exampleuniqueID>
# Sets the inventory_hostname. Each item is a Jinja2 expression and it gets evaluated on host_vars.
hostname_format_preferences:
- "display_name+'.oci.com'"
- "private_ip"
- "public_ip"
# Excludes a host from the inventory when any of the Jinja2 expression evaluates to true.
exclude_host_filters:
- "region not in ['iad']"
- "'<tag_key>' in freeform_tags"
- "'<tag_value>' == freeform_tags.<tag_key>"
- "'<tag_value>' == defined_tags.<namespace>.<tag_key>"
- "'<tag_key>' in defined_tags.<namespace>"
# Includes a host in the inventory when any of the Jinja2 expression evaluates to true.
include_host_filters:
- "display_name is match('.*.oci.com')"
- "'<tag_key>' in freeform_tags"
- "'<tag_value>' == freeform_tags.<tag_key>"
- "'<tag_value>' == defined_tags.<namespace>.<tag_key>"
- "'<tag_key>' in defined_tags.<namespace>"
# Example group results by key
keyed_groups
- key: freeform_tags.<tag key>
prefix: <my_prefix>
- key: defined_tags.<namespace>.<tag key>
prefix: <my_prefix>
groups:
<group_name>: "'<tag_value>' == freeform_tags.<tag_key>"
<group_name>: "'<tag_value>' == defined_tags.<namespace>.<tag_key>"
<group_name>: "'<tag_key>' in defined_tags.<namespace>"
# Example to create and modify a host variable
compose:
ansible_host: display_name+'.oracle.com'
# Example flag to turn on debug mode
debug: true
# Enable Cache
cache: yes
cache_plugin: jsonfile
cache_timeout: 7200
cache_connection: /tmp/oci-cache
cache_prefix: oci_
# DB Hosts
fetch_db_hosts: True
# Compute Hosts (bool type)
fetch_compute_hosts: True
# Process only the primary vnic of a compute instance
primary_vnic_only: True
Fehler mit dem Bestands-Plug-in beheben
Wenn die vom OCI-Bestand-Plug-in generierte Bestandsliste nicht jede Compute-Instanz in Ihrem Mandanten enthält, lesen Sie die folgenden Informationen.
Benutzerberechtigungen
Stellen Sie sicher, dass der Benutzer über die folgenden Policy-Berechtigungen verfügt. Die Benutzer-OCID wird entweder mit der OCI_USER-Umgebungsvariablen oder dem Abschnitt profile
in der SDK- und CLI-Konfigurationsdatei angegeben.
Eine Liste der Berechtigungen für API-Vorgänge finden Sie unter Details zu den Coreservices.
Das Bestands-Plug-in führt API-Aufrufe für die folgenden Vorgänge durch:
- ListCompartments
- GetCompartment
- ListVNICAttachments
- GetVNIC
- GetSubnet
- GetVLAN
- GetVCN
- ListInstances
- GetInstance
- ListDBNodes
- ListDBSystems
- ListRegionSubscriptions
Weitere Informationen
Ausführliche Informationen zur Verwendung des OCI-Bestands-Plug-ins finden Sie unter docs.oracle.com und readthedocs.io.
Sie können auch den folgenden Befehl verwenden, um die Plug-in-Dokumentation anzuzeigen:
ansible-doc -t inventory oracle.oci.oci
Weitere Informationen zu Bestands-Plug-ins finden Sie in der offiziellen Ansible-Dokumentation.