In questa guida ti mostrerò come gestire i file utilizzando i moduli ansible. Imparerai come copiare, modificare, inserire, scaricare e sostituire file utilizzando Ansible.
Cosa faremo?
- Copia il file usando il modulo 'copia' e 'modelli'
- Scarica il file utilizzando il modulo 'fetch'
- Modifica il file utilizzando i moduli 'blockinfile', 'lineinfile' e 'replace'
- Gestisci attributi file
Copia file utilizzando il modulo 'copy' e 'templates' in Ansible
Ansible fornisce alcuni moduli per copiare file dalla directory locale alle macchine di destinazione remote, è il modulo "copia" e "modello".
La differenza tra il modulo "copia" e "modello" è che il modulo copia copierà il file dalla directory "file" e il "modello" copierà il modello Jinja2 dalla directory "modelli" sui playbook Ansible.
Il modulo 'copia' è utile per copiare file persistenti come i certificati, mentre il 'modello' è più utile per configurazioni riutilizzabili come la configurazione dell'host virtuale ecc.
1. Copia il file dal computer di destinazione locale a quello remoto
Copiare la configurazione 'sources.list' nella directory 'files' locale sulla macchina remota '/etc/apt/sources.list'. Quando c'è la configurazione, verrà sostituita e salvata in base ai timestamp.
- name: Copy from Local to Remote Target Machine with 'copy' copy: src: sources.list dest: /etc/apt/sources.list backup: yes
2. Copia il file sulla macchina remota in un'altra directory
Copia la configurazione sudoers '/etc/sudoers.d/hakase' sul computer remoto nell'altra directory '/home/hakase/hakase-suoers.txt'. È possibile farlo con l'opzione 'remote_src'.
- name: Copy file from one directory to other on the Remote Machine copy: src: /etc/sudoers.d/hakase dest: /home/hakase/hakase-sudoers.txt remote_src: yes
3. Copia il file e cambia l'autorizzazione e il proprietario del file
Copia il file bash nella directory 'files' sul computer del server remoto e imposta l'autorizzazione predefinita per il file '0755' e il proprietario del file è 'hakase'.
- name: Copy file and set up the permission and owner of the file copy: src: simple.sh dest: /home/hakase/simple.sh owner: hakase group: hakase mode: 0755
4. Copia il file con il modulo Modello
Copia la configurazione del modello Jinja2 per l'host virtuale nginx dalla directory 'templates' alla directory '/etc/sites-enabled/' sulla macchina remota. Con il template Jinja2 possiamo creare variabili per la nostra configurazione e renderla più riutilizzabile.
- name: Copy file using 'template' module template: src: default.j2 dest: /etc/nginx/sites-enabled/ backup: yes owner: root group: root mode: 0644
Scarica un file utilizzando il modulo Fetch in Ansible
Per scaricare un file dalla macchina remota al nostro nodo ansible locale, possiamo usare il modulo ansible chiamato 'fetch'.
1. Scarica da una macchina remota in locale
Scarica il file di configurazione di nginx 'nginx.conf' dal server remoto nella directory ansible-node locale '/home/hakase/backup' per creare un backup. E il modulo di recupero predefinito includerà le strutture delle directory.
- name: Download file from Remote Machine to Local ansible-node directory become: yes fetch: src: /etc/nginx/nginx.conf dest: /home/hakase/backup/
2. Scarica da remoto a locale senza strutture di directory
Scarica dalla macchina remota al nodo ansible locale senza strutture di directory aggiungendo l'opzione "piatta".
- name: Download file from Remote Machine to Local ansible node without directory structures become: yes fetch: src: /etc/nginx/nginx.conf dest: /home/hakase/backup/ flat: yes
Modifica file con Ansible
Ora modificheremo i file usando i moduli Ansible. Ci sono alcuni moduli che devi conoscere per modificare i file usando Ansible, come blockinfile, lineinfile e replace.
Il blockinfile inserirà/rimuoverà più righe nel file. Il lineinfile è per la riga singola e il modulo di sostituzione può essere utilizzato per sostituire la stringa.
1. Inserisci più righe in un file usando 'blockinfile'
Aggiungi la configurazione a più righe alla configurazione ssh 'sshd_config' usando il modulo 'blockinfile'. E l'impostazione predefinita inserirà la nuova configurazione in fondo alle righe.
- name: Insert multiple lines and Backup
blockinfile:
path: /etc/ssh/sshd_config
backup: yes
block: |
ClientAliveInterval 360
ClientAliveCountMax 0
2. Inserisci più righe usando le Opzioni Marker
Oppure, se desideri inserire nella riga specifica, puoi utilizzare l'opzione marker e seguire 'insertafter' o 'insertbefore' e Regex, oppure puoi utilizzare entrambi.
Il playbook seguente inserirà una nuova configurazione aggiuntiva nel file 'sshd_config'. La configurazione aggiuntiva verrà aggiunta prima della riga "UserPAM" circondata dall'indicatore predefinito "# BEGIN ANSIBLE MANAGED BLOCK".
- name: Insert after regex, backup, and validate
blockinfile:
path: /etc/ssh/sshd_config
backup: yes
marker: "# {mark} ANSIBLE MANAGED BLOCK "
insertbefore: '^UsePAM '
block: |
AllowUsers hakase vagrant
PermitEmptyPasswords no
PermitRootLogin no
validate: '/usr/sbin/sshd -T -f %s'
3. Elimina/rimuovi Linee multiple bloccano i dintorni all'interno dei marker
Rimuovi il blocco di linee circostanti dall'indicatore ansible '# BEGIN ANSIBLE MANAGED BLOCK'.
- name: Remote text block surrounding by markers
blockinfile:
path: /etc/ssh/sshd_config
marker: "# {mark} ANSIBLE MANAGED BLOCK"
content: ""
backup: yes
4. Inserisci una nuova riga nel file
Inserisci la nuova configurazione di riga 'PasswordAuthentication no' sotto la riga regex '#PermitEmptyPasswords' nella configurazione ssh '/etc/ssh/sshd_config'.
- name: Insert New Line under the Regex configuration
lineinfile:
path: /etc/ssh/sshd_config
backup: yes
regexp: '^PasswordAuthentication '
insertafter: '^#PermitEmptyPasswords '
line: 'PasswordAuthentication no'
validate: '/usr/sbin/sshd -T -f %s'
5. Rimuovere la linea dal file utilizzando il modulo lineinfile
Per rimuovere/eliminare una riga dal file, puoi utilizzare l'opzione 'stato:assente' e seguire l'espressione regolare della riga come di seguito.
- name: Remove a line from the file
lineinfile:
path: /etc/ssh/sshd_config
state: absent
regexp: '^PasswordAuthentication'
6. Sostituisci le stringhe di pattern con l'espressione regolare e sostituisci il modulo
Ora sostituiremo una stringa usando il modulo 'replace'. Il modulo di sostituzione richiedeva l'espressione regolare come riferimento di back-end per sostituire il tipo di stringhe.
Cambia il nome dell'host nel file '/etc/hosts' usando sostituisci il modulo.
- name: Replace the default
replace:
path: /etc/hosts
regexp: '(\s+)node\.provision\.labs(\s+.*)?$'
replace: '\1box.hakase.labs\2'
backup: yes
7. Decommenta le configurazioni
Il modulo di sostituzione può essere utilizzato per decommentare la configurazione sul sistema Linux. Semplice, possiamo rimuovere la stringa di commento '#' all'inizio della riga usando il modulo di sostituzione.
Decommenta la configurazione della riga 'server_tokens' nel file '/etc/nginx/nginx.conf'.
- name: Uncomment configuration
replace:
path: /etc/nginx/nginx.conf
regexp: '#(\s+)server_tokens'
replace: 'server_tokens'
backup: yes
8. Commenta la linea di configurazione
Di seguito è possibile commentare la configurazione della riga aggiungendo il '#' all'inizio della riga.
- name: Comment Line configuration replace: path: /etc/nginx/nginx.conf regexp: '(\s+)gzip on' replace: '\n\t#gzip on' backup: yes
Imposta gli attributi dei file utilizzando il modulo file in Ansible
Il modulo file può essere utilizzato per impostare gli attributi dei file stessi, come cambiare proprietario, gruppo e autorizzazione, creare un collegamento simbolico, creare una nuova directory ed eliminare un collegamento simbolico, un file o una directory.
1. Crea collegamento simbolico del file
Crea un file di collegamento simbolico sull'host remoto per la configurazione dell'host virtuale nginx chiamato 'vhost' nella directory '/etc/nginx/sites-enabled/'.
- name: Create Symlink of file
file:
src: /etc/nginx/sites-available/vhost
dest: /etc/nginx/sites-enabled/vhost
owner: root
group: root
state: link
2. Crea una nuova directory usando il modulo file
Per creare una nuova directory utilizzando il modulo file, dobbiamo utilizzare l'opzione state con il valore 'directory' come di seguito.
- name: Create a New Directory using file
file:
path: /etc/nginx/ssl
state: directory
owner: root
group: root
mode: 0755