使用Ansible重新启动Linux系统
首先
本文记录了在Ansible中重新启动Linux的步骤。
本文的目的是利用Ansible的重新启动模块来自动化服务器的重启。本文以RaspberryPi和debian作为示例,但也适用于Windows操作系统。
如果你想了解Ansible的基本知识,可以参考我之前写的一篇文章:《什么是Ansible?从配置管理工具的目的到最快速理解Ansible的引入》。
安装Ansible
以下是执行Ansible的环境:
-
- 環境
-
- OS:macOS Big Sur 11.1
- Python:3.7.3
按照官方文档的推荐步骤,使用pip安装Ansible。
通过指定–user选项,在不需要管理员权限的用户目录下安装软件包。
-
- Ansibleのインストール
-
- $ python3 -m pip3 install –user ansible
-
- 環境変数PATHの追加
- $ vi ~/.bashrc
export PATH=$PATH:/Users/<ユーザー名>/Library/Python/3.7/bin/
-
- 環境変数PATHの有効化
- $ source ~/.bashrc
Ansible的配置
为了执行Ansible,需要创建清单文件和playbook。
在本文中,我们给playbook添加了reboot_timeout选项作为示例,但如果只是重新启动,则不需要。
-
- インベントリファイルの作成
-
- sudo mkdir /etc/ansible/
-
- cd /etc/ansible/
- sudo vi hosts
[localhost]
127.0.0.1 ansible_connection=local
[pi]
192.168.10.111
- playbookの作成
- name: Reboot
hosts: pi
gather_facts: no
remote_user: pi
become: true
tasks:
- name: Reboot the machine (Wait for 5 min)
reboot:
reboot_timeout: 300
您也可以不使用reboot模块来指定命令。
这是一种过时的方法。
- hosts: pi
become: yes
tasks:
- name: reboot!
command: /sbin/shutdown -r now
测试Playbook
树莓派
通过在Mac上执行ansible-playbook命令,重新启动树莓派。
-
- playbookの実行
- $ ansible-playbook -i hosts -k -c paramiko playbook.yml
在执行ansible-playbook命令时,可能会遇到以下错误:
fatal: [192.168.10.111]: FAILED! => {"msg": "to use the 'ssh' connection type with passwords, you must install the sshpass program"}
因为没有安装sshpass,所以需要进行安装。sshpass是在脚本中或其他使用SSH密码认证时常用的实用工具。
使用实现了SSHv2协议的paramiko可以避免SSH密码认证错误。
如果没有安装paramiko,请使用pip进行安装。
-
- paramikoのインストール
- $ python3 -m pip install –user paramiko
执行ansible-playbook命令后,成功实现了Raspberry Pi的重新启动。
SSH password:
PLAY [Reboot] ********************************************************************************************************************************************
TASK [Reboot the machine (Wait for 5 min)] ***************************************************************************************************************
Debian是一个操作系统。
在Mac上运行ansible-playbook命令,并重新启动debian。
Debian将成为在VirtualBox上构建的虚拟机。
将其添加至清单文件并修改playbook中的hosts和remote_user。
当执行 ansible-playbook 命令时,可能会出现以下错误。
fatal: [192.168.10.150]: FAILED! => {"msg": "Failed to determine system distribution. sudo: パスワードが必要です, "}
由于远程主机在执行sudo时要求输入密码,因此出现了错误。
您可以通过针对Ansible执行端或远程主机端的相应操作来避免这个错误。以下是每种解决方法的详细说明。
如果在ansible执行端处理的话,以前可以使用–ask-sudo-pass选项,但现在不能使用该选项。相反,可以使用–ask-become-pass选项。使用–ask-become-pass选项时需要输入密码2次。
-
- playbookの実行
- $ ansible-playbook -i hosts -k -c paramiko playbook.yml –ask-become-pass
SSH password:
BECOME password[defaults to SSH password]:
PLAY [Reboot] ********************************************************************************************************************************************
TASK [Reboot the machine (Wait for 5 min)] ***************************************************************************************************************
如果在远程主机上进行处理,需要对执行sudo命令的用户进行设置,使其能够无需密码执行sudo命令。
将来自debian用户的sudo命令执行时无需密码即可执行的配置。 (※)请注意,应用此设置可能会增加系统的风险。
%debian ALL=NOPASSWD: ALL
此外,如果远程主机没有安装sudo,则会出现以下错误。在这种情况下,您需要在远程主机上安装sudo。
fatal: [192.168.10.150]: FAILED! => {"msg": "Failed to determine system distribution. /bin/sh: 1: sudo: not found, "}
最后
通过执行上述playbook,可以执行重新启动任务,但结果将变为“failed=1”。
根据需要,在重新启动之前或之后添加任务并进行确认会更好。
请将以下内容转述为中文,只需一种选项:
参考
参考
-
- SSH password automation in Linux with sshpass
- How to automate system reboots using the Ansible reboot module