下载 Centos 的 VirtualBox 镜像下载镜像链接https://www.osboxes.org按照如下截图下载 VirtualBox 的 Centos 版本这里可以看到这个 VirtualBox 的用户名和密码使用 VirtualBox 安装 Centos 可以查找其他资料观看。准备3台机器先准备一台模板镜像再克隆3台 Ansible 的镜像出来。可以在机器上的说明上写上用户名和密码防止以后忘记配置 ansible 前置信息启动 ansible-controller, 查看 ip 地址ipaddr由于我的3台 ansible 的 ip 地址都一样所以我需要改一下不同的 IP修改 IP 地址可参考这篇文章 Centos 修改 IP 地址另外两台 ansible-node1, ansible-node2 分别改为 192.168.56.31 192.168.56.32并使用 xshell 连接上这个服务器然后修改 hostname:sudovim/etc/hostname改完之后重启reboot另外两台也是同理修改 hostname, 分别改为 ansible-node1, ansible-node2开始学习 Ansible打开 Ansible 官方文档.在 ansible-controller 的服务器上安装 Ansible:现在官网只有 Centos 8 的安装文档从 CentOS 8 开始yum 已经被 dnf 取代我的是 Centos 7:cat/etc/centos-release所以我依然使用 yum 进行安装sudoyuminstallansible如果这样安装不了的话像我下面这样那就按照下面的命令全部执行一遍, 耗时大概10分钟左右# 1. 安装 EPEL 仓库sudoyuminstallepel-release-y# 2. 清理并重建 yum 缓存sudoyum clean allsudoyum makecache# 3. 安装 Ansiblesudoyuminstallansible-y# 4. 验证安装ansible--version安装完成后我们让我们的 ansible 的各个服务器之间用 hostname 去通信我们要做如下修改vim/etc/hosts加上如下内容然后在 ansible-controller 服务器上使用下面的命里分别检查一下3台机器能不能ping通pingansible-controller# 自己pingansible-node1pingansible-node2我们再创建一个项目使用 VsCode 打开然后再安装一个 SFTP 插件这个插件文档中告诉了我们使用 Ctrl Shift P再输入 SFTP:Config 就可以创建一个 sftp.json 文件了。在 ansible-controller 上查看根目录pwd然后我修改 sftp.json 的信息如下{name:My Server,host:192.168.56.30,protocol:sftp,port:22,username:root,remotePath:/project/ansible-code,uploadOnSave:false,useTempFile:false,openSsh:false}host: ansible-controller 服务器 IPusername: ansible-controller 服务器用户名remotePath: 在 ansible-controller 服务器上创建一个用于存放 ansible 代码的目录修改好后我们再创建要给 inventory.txt 文件, 再次按 Ctrl Shift P, 输入SFTP: Sync Local -Remote点击它在下一步中输入密码将 inventory.txt 文件传入到 ansible-controller 服务器上。我们可以方便使用 SFTP 插件操作远程服务器比如我们可以将服务器上的文件删除掉但是这只是将服务器的文件删除并不会删除掉我们本地的文件。我们也可以在这里将文件再同步到服务器上现在我们将 inventory.txt 文件删掉重新创建一个 inventory 目录再创建一个 inventory.ini然后同步到服务器同时我们也可以安装一个 Ansible 插件这样我们在写 Ansible 语法的时候就会有高亮显示了。inventory 就是列表清单里面管理的就是机器的列表。我们可以编写 inventory.ini 文件如下一行代表一个资产/host编写好后我们将它同步到服务器然后我们可以在 ansible-controller 服务器上使用 ansible 去 ping 一下 inventory.ini 配置的 host:ansible all-mping-iinventory.ini-m: module然后我们会遇到如下错误ansible-node1|FAILED!{msg:Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this hosts fingerprint to your known_hosts file to manage this host.}这个错误的意思是Ansible 尝试使用密码登录目标主机ansible-node1但 SSH 的主机密钥检查Host Key Checking功能导致它无法继续。 更具体地说 SSH 在第一次连接一台服务器时会询问你是否信任该服务器的指纹fingerprint。如果是手动连接你会看到类似 Are you sure you want to continue connecting (yes/no)? 的提示。 Ansible 默认启用了主机密钥检查但在使用密码认证ansible_ssh_pass时它依赖的底层工具 sshpass 不支持同时处理主机密钥检查和密码输入。因此直接报错。解决方案手动添加主机指纹推荐安全且简单手动用 SSH 连接一次目标主机接受并保存它的指纹到 known_hosts 文件。sshrootansible-node1# 或者换成你的用户名# 输入 yes 确认然后输入密码登录一次# 登录成功后按 exit 退出完成这一步后再重新运行你的 Ansible 命令ansible all-mping-iinventory.ini然后我们把 ansible-node2 也加在 inventory.ini 文件同步到服务器再次执行 ping 的操作如果报错和上面一样那么按照相同的办法解决我们也可以使用下面的命令进行指定的host操作ansible ansible-node1-mping-iinventory.ini如果是指定的是 all, 就是代表操作所有 inventory.ini 配置的 host我们也可以对其进行分组然后对组进行操作ansible web1-mping-iinventory.ini如果有很多机器我们可以通过写指定范围一次性代表x台机器如下我写了4台再次 ping, 会看到有2台机器 ping 不通因为我这里只有1和2两台机器如果我们把 sftp.json 的 uploadOnSave 参数改为 true, 那么我们就不用每次手动同步修改的代码了当我们保存的时候它会自动同步我们的修改。{name:My Server,host:192.168.56.30,protocol:sftp,port:22,username:root,remotePath:/project/ansible-code,uploadOnSave:true,useTempFile:false,openSsh:false}inventory.ini 配置[web1] ansible-node1 ansible_connectionssh ansible_userroot ansible_ssh_passvagrant ansible-node2 ansible_connectionssh ansible_userroot ansible_ssh_passvagrant一般我们不会把密码配置在 inventory.ini 里面的因为这样不安全我们谁使用 ssh key 的方式。进去服务器根目录# 进入服务器根目录的.ssh目录下cd~/.ssh/# 生成 ssh keyssh-keygen执行完 ssh-keygen 之后回车后我们可以设置我们要保存密钥的路径和文件名,其他的一路回车保持默认值即可:ansible: 私钥需要保存好不可泄露ansible.pub: 公钥可发布出去给别人用# 进入项目根目录的.ssh目录下cd~/.ssh# 将公钥复制到 ansible-node1ssh-copy-id-i~/.ssh/ansible ansible-node1然后我们可以进入 ansible-node1 服务器上查看是否把 ansible-controller 的 ansible.pub 公钥复制到 ansible-node1 服务器上了。cd~/.ssh/# 查看储存的密钥moreauthorized_keys然后我们可以使用下面的命令免密登录到 ansible-node1 服务器中ssh-i~/.ssh/ansible ansible-node1~/.ssh/ansible: 指定私钥然后我们也按照同样的操作把 ansible.pug 复制到 ansible-node2 中。所以现在我们就不再需要在 inventory.ini 中指定明文密码了把ansible_ssh_pass参数删除然后我们再次尝试 ping这时候我们是 ping 不通的我们需要指定 ansible-controller 的私钥才能 ping 通了。