
Soy un novato en Ansible. Estaba intentando usar expect con Ansible para automatizar la instalación del paquete (en el siguiente ejemplo: desinstalar). Durante la desinstalación manual del paquete Lynx, aparece el siguiente mensaje. En el campo de respuesta esperada, estaba intentando hacer coincidir este patrón (ambas líneas) pero mi secuencia de comandos falla. Aunque funciona para una línea: ¿Está bien? [y/N]: y. La expresión regular que he usado para ambas líneas es Tamaño de instalación: 5,4 M\n¿Está bien [s/N]: y
-----------------------
Installed size: 5.4 M
Is this ok [y/N]:
----------------------
Código 1 (coincidencia de patrón para ambas líneas - error):
[ansible@localhost ansible]$ cat main.yml
---
- hosts: localhost
remote_user: ansible
become: yes
become_method: sudo
connection: ssh
gather_facts: yes
tasks:
- name: remove a package
expect:
command: yum remove lynx
responses:
Installed size: 5.4 M\nIs this ok \[y\/N\]: y
#Is this ok \[y\/N\]: y
echo: yes
Producción:
[ansible@localhost ansible]$ ansible-playbook main.yml
[DEPRECATION WARNING]: DEFAULT_SUDO_USER option, In favor of become which is a generic framework . This feature will be removed in version 2.8. Deprecation
warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
ERROR! Syntax Error while loading YAML.
The error appears to have been in '/etc/ansible/main.yml': line 13, column 51, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
responses:
Installed size: 5.4 M\nIs this ok \[y\/N\]: y
^ here
exception type: <class 'yaml.scanner.ScannerError'>
exception: mapping values are not allowed in this context
in "<unicode string>", line 13, column 51
[ansible@localhost ansible]$
==================================================== ====================== Código 2 (coincidencia de patrón para una línea - funciona bien):
[ansible@localhost ansible]$ cat main.yml
---
- hosts: localhost
remote_user: ansible
become: yes
become_method: sudo
connection: ssh
gather_facts: yes
tasks:
- name: remove a package
expect:
command: yum remove lynx
responses:
#Installed size: 5.4 M\nIs this ok \[y\/N\]: y
Is this ok \[y\/N\]: y
echo: yes
Producción
[ansible@localhost ansible]$
[ansible@localhost ansible]$ ansible-playbook main.yml
[DEPRECATION WARNING]: DEFAULT_SUDO_USER option, In favor of become which is a generic framework . This feature will be removed in version 2.8. Deprecation
warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
PLAY [localhost] *********************************************************************************************************************************************
TASK [Gathering Facts] ***************************************************************************************************************************************
ok: [127.0.0.1]
TASK [remove a package] **************************************************************************************************************************************
changed: [127.0.0.1]
PLAY RECAP ***************************************************************************************************************************************************
127.0.0.1 : ok=2 changed=1 unreachable=0 failed=0
Respuesta1
Sería mejor que usaras elmódulo mmm.
---
- hosts: localhost
remote_user: ansible
become: yes
become_method: sudo
connection: ssh
gather_facts: yes
tasks:
- yum:
name: lynx
state: absent
---
- hosts: localhost
remote_user: ansible
become: yes
become_method: sudo
connection: ssh
gather_facts: yes
tasks:
- pacakge:
name: lynx
state: absent
Siempre debes usar un módulo sobre comando/shell cuando sea posible. Los módulos le brindan verificación de errores e idempotencia sin que tenga que agregar toneladas de lógica a su shell/comando.
Respuesta2
Gracias a todos por sus sugerencias. Sí, usaré YUM. De todos modos, la siguiente expresión regular resolvió mi problema.
Installed.*\nIs this ok \[y\/N\]: y
Code:
---
- hosts: localhost
remote_user: ansible
become: yes
become_method: sudo
connection: ssh
gather_facts: yes
tasks:
- name: remove a package
expect:
command: yum remove lynx
responses:
Installed.*\nIs this ok \[y\/N\]: y
# Is this ok \[y\/N\]: y
echo: yes