Utilizzo del magazzino Ansible
Ansible tiene traccia delle risorse di configurazione conservando le liste, denominate liste di inventario, come file semplici (a volte chiamati anche file_host). Questi elenchi di inventario possono essere statici o dinamici. Le liste dinamiche possono essere aggiornate automaticamente quando le risorse di magazzino vengono aggiunte, eliminate o spostate.
Poiché molte risorse Oracle Cloud Infrastructure (OCI) vengono aggiunte ed eliminate nel tempo, le liste di inventario statiche possono diventare facilmente obsolete. Anche strumenti come Terraform o gli SDK OCI possono influire sulle risorse.
Oracle Cloud Infrastructure fornisce un plugin di inventario dinamico per mantenere un inventario Ansible accurato.
Per ulteriori informazioni sui file di magazzino Ansible, vedere Utilizzo del magazzino e Utilizzo del magazzino dinamico.
Abilitazione del plugin Magazzino
Se si dispone di un file ansible.cfg
esistente e tale configurazione abilita già i plugin utilizzando enable_plugins
, è necessario abilitare anche il plugin inventario OCI aggiungendolo. Ad esempio:
[inventory]
enable_plugins = oracle.oci.oci
Se non si dispone già di un file ansible.cfg
contenente enable_plugins
, non è necessario aggiungere il plugin dell'inventario OCI alla configurazione.
Configurazione del plugin Inventory
L'unico requisito per l'uso del plugin di inventario OCI dopo che è stato abilitato è fornire un'origine di inventario di cui si dispone delle autorizzazioni per l'analisi. Le origini magazzino sono definite in un file di configurazione YAML. Per ulteriori informazioni, vedere Autorizzazioni utente.
Per iniziare a utilizzare il plugin inventario con un'origine di configurazione YAML, creare un file con uno dei seguenti nomi di file accettati:
- <filename>.oci.yml
- <filename>.oci.yaml
Aggiungere plugin: oracle.oci.oci
al file di configurazione YAML.
Il file di origine inventario minimo necessario per eseguire il plugin inventario OCI è simile al seguente, ad esempio:
# demo.oci.yml
plugin: oracle.oci.oci
# Optional fields to specify oci connection config:
config_file: ~/.oci/config
config_profile: DEFAULT
In questo esempio vengono utilizzati i parametri config_file
e config_profile
, in modo che il plugin possa utilizzare le informazioni di autenticazione indicate nel documento SDK and CLI Configuration File. Alcuni parametri possono essere forniti anche come variabili di ambiente.
Per un elenco completo dei parametri e delle variabili di ambiente supportati dal plugin, vedere Plugin inventario OCI. Gli scenari di magazzino includono molti dei parametri disponibili.
Per impostazione predefinita, il plugin inventario OCI rileva ed elenca solo le istanze di computazione che dispongono di un indirizzo IP pubblico. Per ulteriori informazioni, vedere Preferenze del formato del nome host.
Ordine di precedenza
Il plugin inventario utilizza il seguente ordine di precedenza quando un'opzione viene fornita in più di una posizione:
- Impostazioni file YAML.
- Variabili di ambiente.
- Impostazioni di configurazione nel file di configurazione OCI selezionato
profile
.
Recupero degli host del database
Per impostazione predefinita, il plugin di inventario OCI rileva ed elenca solo le istanze di computazione. I nodi del database sono server che eseguono software di database. I nodi del database vengono recuperati impostando l'opzione fetch_db_hosts
su true
. Ad esempio:
# demo.oci.yml
# DB Hosts
plugin: oracle.oci.oci
fetch_db_hosts: true
Uso del plugin Magazzino
I plugin di inventario Ansible consentono di definire le origini dati utilizzate per compilare un inventario di host utilizzati da Ansible per i task di destinazione. Per accedere a queste origini dati si utilizzano i parametri della riga di comando -i /path/to/file
o -i 'host1, host2'
oppure altre origini di configurazione.
È possibile eseguire l'inventario con questo comando, ad esempio:
ansible-inventory -i <filename>.oci.yml --graph
Ciò produce un output simile al seguente:
@all:
|--@oci:
| |--compute_instance1
| |--compute_instance2
|–@ungrouped:
Per impostazione predefinita, l'inventario viene generato per tutti i compartimenti nella tenancy. Per consentire a questo script di accedere a tutti i compartimenti, è necessario disporre dell'autorizzazione
COMPARTMENT_INSPECT
nel compartimento radice. Tuttavia, quando si specifica compartment_ocid
, l'inventario viene generato solo per il compartimento specifico, pertanto è necessaria solo l'autorizzazione COMPARTMENT_INSPECT
per il compartimento specificato. Per ulteriori informazioni, vedere Funzionamento dei criteri.Per recuperare tutti i dettagli dell'istanza, è inoltre necessario disporre dell'autorizzazione per elencare e leggere le istanze e le VNIC, nonché leggere le VCN e le subnet. Per ulteriori informazioni, vedere Autorizzazioni utente.
È possibile aggiungere plugin di inventario al percorso del plugin e impostare il percorso di inventario predefinito per semplificare i comandi. Aggiungere il percorso inventario predefinito alla sezione [defaults]
del file ansible.cfg
oppure utilizzare la variabile di ambiente ANSIBLE_INVENTORY per puntare le origini inventario. È quindi possibile eseguire il comando seguente per produrre lo stesso output di quando si passano direttamente le origini di configurazione YAML:
ansible-inventory --graph
In genere i plugin di inventario vengono eseguiti solo all'inizio di un'esecuzione, prima del caricamento di playbook, riproduzioni e ruoli. È possibile eseguire di nuovo un plugin utilizzando il task meta: refresh_inventory
, che cancella l'inventario esistente e lo ricostruisce.
Output magazzino
L'elenco di inventario generato dal plugin inventario viene raggruppato utilizzando i seguenti attributi:
- Area in cui risiede l'istanza di computazione
- Nome del compartimento a cui appartiene l'istanza di computazione
- Dominio di disponibilità in cui si trova l'istanza di computazione
- La
vcn_id
della VCN in cui si trova l'istanza di computazione subnet_id
della subnet in cui si trova l'istanza di computazionesecurity_list_ids
della subnet in cui si trova l'istanza di computazioneimage_id
dell'immagine utilizzata per avviare l'istanza di computazione- Forma dell'istanza di calcolo
- Tag in formato libero dell'istanza di computazione, con il nome del gruppo impostato su
tag_<tag_name>=<tag_value>
- Tag definite dell'istanza di computazione, con il nome del gruppo impostato su
<tag_namespace>#<tag_name>=<tag_value>
- Metadati dell'istanza di computazione OCI (coppie chiave-valore), con il nome del gruppo impostato su
<metadata-key>=<metadata-value>
- Metadati estesi dell'istanza di computazione OCI (coppie chiave-valore), con il nome del gruppo impostato su
<metadata-key>=<metadata-value>
Preferenze formato nome host
L'inventario generato dal plugin inventario OCI contiene solo le istanze che dispongono di un indirizzo IP pubblico per impostazione predefinita. Ciò è utile nei casi in cui il nodo del controller Ansible si trova al di fuori della VCN, poiché Ansible può raggiungere solo le istanze che dispongono di indirizzi IP pubblici.
È possibile configurare inventory_hostname
in private_ip
o in qualsiasi nome host personalizzato passando espressioni Jinja2 come elenco all'opzione hostname_format_preferences
. L'opzione hostname_format_preferences
accetta un elenco di espressioni Jinja2 in ordine di precedenza per la composizione di inventory_hostname
. Il plugin inventario ignora le espressioni se il risultato è una stringa vuota o un valore "Nessuno". L'istanza viene ignorata se nessuna delle espressioni hostname_format_preferences
restituisce un valore non vuoto.
L'esempio seguente imposta inventory_hostname
su "display_name+'.oci.com'"
, "private_ip"
o "public_ip"
:
hostname_format_preferences:
- "display_name+'.oci.com'"
- "private_ip"
- "public_ip"
Le espressioni vengono valutate su host_vars
di ogni istanza. La valutazione rispetta l'ordine di precedenza nella configurazione per la composizione di inventory_hostname
. Nell'esempio precedente, "display_name+'.oci.com'"
viene valutato prima di "private_ip"
e "public_ip"
.
Filtro degli host
Il plugin di inventario OCI include varie opzioni di filtro per filtrare gli host restituiti dal plugin.
Escludi host da magazzino
È possibile passare una lista di espressione condizionali Jinja2 al parametro exclude_host_filters
. Ogni espressione nella lista viene valutata per ogni host. Quando l'espressione è vera, l'host viene escluso dall'inventario. Il parametro exclude_host_filters
ha la priorità sulle opzioni include_host_filters
e filters
.
L'esempio seguente esclude dall'inventario gli host che non si trovano nell'area 'iad':
exclude_host_filters:
- "region not in ['iad']"
Escludi host che utilizzano tag in formato libero
Per escludere un host dall'inventario utilizzando tag in formato libero, è possibile utilizzare la seguente sintassi:
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"
Ad esempio:
exclude_host_filters:
- "'operating_system' in freeform_tags"
- "'linux' == freeform_tags.operating_system"
Escludi host mediante tag definite
Per escludere un host dall'inventario utilizzando tag definiti, è possibile utilizzare la sintassi seguente:
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>"
Ad esempio:
exclude_host_filters:
- "'ansible' == defined_tags.ansible_collections_tag_namespace.managed_by"
- "'managed_by' in defined_tags.ansible_collections_tag_namespace"
Includi host in inventario
È possibile passare una lista di espressione condizionali Jinja2 al parametro include_host_filters
. Ogni espressione nella lista viene valutata per ogni host. Quando l'espressione è vera, l'host viene incluso nell'inventario.
L'esempio seguente include solo gli host con display_name
che terminano con '.oci.com' nell'inventario:
include_host_filters:
- "display_name is match('.*.oci.com')"
Le opzioni
include_host_filters
e filters
non possono essere utilizzate insieme.Includi host che utilizzano tag in formato libero
Per includere un host dall'inventario utilizzando tag in formato libero, è possibile utilizzare la seguente sintassi:
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"
Ad esempio:
include_host_filters:
- "'operating_system' in freeform_tags"
- "'linux' == freeform_tags.operating_system"
Includi host con tag definite
Per includere un host dall'inventario utilizzando tag definite, è possibile utilizzare la sintassi seguente:
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>"
Ad esempio:
include_host_filters:
- "'ansible' == defined_tags.ansible_collections_tag_namespace.managed_by"
- "'managed_by' in defined_tags.ansible_collections_tag_namespace"
Abilitazione dell'inserimento nella cache
L'inserimento nella cache può essere abilitato per velocizzare le ricerche. È possibile impostare le opzioni di inserimento nella cache per una singola origine di configurazione YAML o per più origini magazzino utilizzando variabili di ambiente o file di configurazione Ansible. Se si abilita l'inserimento nella cache per un plugin di inventario senza fornire opzioni di inserimento nella cache specifiche dell'inventario, il plugin di inventario utilizza opzioni di inserimento nella cache dei dati fact.
Di seguito è riportato un esempio di abilitazione dell'inserimento nella cache per un singolo file di configurazione YAML.
# demo.oci.yml
plugin: oracle.oci.oci
cache: yes
cache_plugin: jsonfile
cache_timeout: 7200
cache_connection: /tmp/oci_inventory
cache_prefix: oci
Uso dei gruppi dinamici
È possibile creare gruppi dinamici utilizzando variabili host con l'opzione keyed_groups
creata. L'opzione groups
può essere utilizzata anche per creare gruppi e creare e modificare variabili host. Di seguito è riportata la sintassi per i gruppi e i gruppi con chiave che utilizzano le tag.
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>"
Ad esempio:
# 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"
In questo esempio viene prodotto un output simile al seguente:
@all:
|--@development:
| |--compute_instance1
| |--compute_instance2
|--@linux:
| |--compute_instance1
|--@os:
| |--compute_instance1
| |--compute_instance2
|--@ansible_managed:
| |--compute_instance1
|--@cm_managed_hosts:
| |--compute_instance2
|--@ungrouped
Se un host non dispone delle variabili specificate nella configurazione, l'host non viene aggiunto a gruppi diversi da quelli creati dal plugin inventario e la variabile host ansible_host non viene modificata.
Scenari magazzino
Le sezioni seguenti includono esempi di configurazione che riguardano scenari di magazzino comuni.
Recupera tutti gli host di computazione
Per recuperare tutti gli host, la configurazione può essere semplice come nell'esempio riportato di seguito.
plugin: oracle.oci.oci
Recupera solo host DB
Per recuperare tutti i nodi che ospitano il software del database escludendo gli host di computazione, la configurazione dovrebbe avere l'aspetto seguente:
plugin: oracle.oci.oci
# fetch databse hosts
fetch_db_hosts: true
# don't fetch Compute hosts
fetch_compute_hosts: False
Recupera host da aree specifiche
Per recuperare gli host solo nelle aree specificate, la configurazione sarà simile all'esempio riportato di seguito.
plugin: oracle.oci.oci
# Fetch only the hosts in the regions us-ashburn-1, us-phoenix-1
regions:
- us-ashburn-1
- us-phoenix-1
Imposta nome host magazzino
Per impostare il formato del nome host dell'inventario utilizzato nell'inventario, la configurazione include una sezione simile all'esempio seguente:
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"
Per ulteriori informazioni, vedere Preferenze del formato del nome host.
Escludi host da magazzino
Per utilizzare un'espressione condizionale Jinja2 per escludere gli host dall'inventario, la configurazione include una sezione simile all'esempio seguente:
plugin: oracle.oci.oci
# Excludes hosts that are not in the region 'iad' from the inventory
exclude_host_filters:
- "region not in ['iad']"
Per ulteriori informazioni, vedere Filtro degli host.
Includi host in inventario
Per utilizzare un'espressione condizionale Jinja2 per includere host nell'inventario, la configurazione include una sezione simile all'esempio riportato di seguito.
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')"
Per ulteriori informazioni, vedere Filtro degli host.
Le opzioni
include_host_filters
e filters
non possono essere utilizzate insieme.Recupera host da compartimenti specifici
L'esempio seguente mostra come recuperare tutti gli host dai compartimenti specificati:
# 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>
Altre Opzioni
La configurazione di esempio riportata di seguito combina gli scenari precedenti con altre opzioni di configurazione.
# 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
Risoluzione dei problemi relativi al plugin Inventory
Se la lista di inventario generata dal plugin di inventario OCI non include tutte le istanze di computazione nella tenancy, esaminare le informazioni riportate di seguito.
Autorizzazioni utente
Assicurarsi che l'utente disponga delle autorizzazioni dei criteri seguenti. L'OCID utente viene specificato utilizzando la variabile di ambiente OCI_USER o la sezione profile
nel file di configurazione dell'SDK e dell'interfaccia CLI.
Per visualizzare una lista di autorizzazioni per le operazioni API, vedere Dettagli per i servizi di base.
Il plugin Inventory effettua chiamate API per le seguenti operazioni:
- ListCompartments
- GetCompartment
- ListVNICAttachments
- GetVNIC
- GetSubnet
- GetVLAN
- GetVCN
- ListInstances
- GetInstance
- ListDBNodes
- ListDBSystems
- ListRegionSubscriptions
Per ulteriori informazioni
Informazioni dettagliate sull'uso del plugin inventario OCI sono disponibili su docs.oracle.com e readthedocs.io.
È inoltre possibile utilizzare il seguente comando per visualizzare la documentazione del plugin:
ansible-doc -t inventory oracle.oci.oci
Per ulteriori informazioni sui plugin di inventario, consultare la documentazione ufficiale di Ansible.