{"id":50751,"date":"2023-12-23T10:31:41","date_gmt":"2023-12-23T02:31:41","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8ansible%e8%87%aa%e5%8a%a8%e5%8c%96%e5%a4%9a%e4%b8%aaubuntu-22-04%e6%9c%8d%e5%8a%a1%e5%99%a8%e7%9a%84%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae\/"},"modified":"2023-12-23T15:16:46","modified_gmt":"2023-12-23T07:16:46","slug":"%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8ansible%e8%87%aa%e5%8a%a8%e5%8c%96%e5%a4%9a%e4%b8%aaubuntu-22-04%e6%9c%8d%e5%8a%a1%e5%99%a8%e7%9a%84%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8ansible%e8%87%aa%e5%8a%a8%e5%8c%96%e5%a4%9a%e4%b8%aaubuntu-22-04%e6%9c%8d%e5%8a%a1%e5%99%a8%e7%9a%84%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae\/","title":{"rendered":"\u5982\u4f55\u4f7f\u7528Ansible\u81ea\u52a8\u5316\u591a\u4e2aUbuntu 22.04\u670d\u52a1\u5668\u7684\u521d\u59cb\u8bbe\u7f6e"},"content":{"rendered":"<h3>\u5f15\u8a00<\/h3>\n<p>Ansible\u662f\u4e00\u79cd\u5f00\u6e90\u8f6f\u4ef6\u5de5\u5177\uff0c\u7528\u4e8e\u81ea\u52a8\u5316\u670d\u52a1\u5668\u548c\u5e94\u7528\u7a0b\u5e8f\u7684\u914d\u7f6e\u7ba1\u7406\u3001\u90e8\u7f72\u548c\u4f9b\u5e94\u3002\u60a8\u53ef\u4ee5\u4f7f\u7528Ansible\u81ea\u52a8\u5316\u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u670d\u52a1\u5668\u4e0a\u7684\u4efb\u52a1\uff0c\u6216\u8005\u5728\u591a\u4e2a\u670d\u52a1\u5668\u4e0a\u8fd0\u884c\u5206\u5e03\u5f0f\u5e94\u7528\u7a0b\u5e8f\u3002\u5bf9\u4e8e\u591a\u670d\u52a1\u5668\u914d\u7f6e\uff0c\u4e3a\u6bcf\u4e2a\u670d\u52a1\u5668\u5b8c\u6210\u521d\u59cb\u670d\u52a1\u5668\u8bbe\u7f6e\u53ef\u80fd\u8017\u65f6\u5f88\u957f\uff0c\u800c\u4f7f\u7528Ansible\u53ef\u4ee5\u901a\u8fc7\u81ea\u52a8\u5316\u5267\u672c\u52a0\u5feb\u8fd9\u4e2a\u8fc7\u7a0b\u3002<\/p>\n<p>Ansible\u662f\u65e0\u9700\u4ee3\u7406\u7684\uff0c\u56e0\u6b64\u60a8\u65e0\u9700\u5728\u8981\u8fd0\u884cAnsible\u7684\u670d\u52a1\u5668\u4e0a\u5b89\u88c5\u4efb\u4f55Ansible\u7ec4\u4ef6\u3002\u8fd9\u4e9b\u670d\u52a1\u5668\u662fAnsible\u4e3b\u673a\uff0c\u5fc5\u987b\u8fd0\u884cPython 3\u548cOpenSSH\uff0c\u8fd9\u4e24\u8005\u90fd\u9884\u5148\u5b89\u88c5\u5728Ubuntu 22.04\u548c\u6240\u6709Linux\u53d1\u884c\u7248\u4e0a\u3002Ansible\u63a7\u5236\u8282\u70b9\u662f\u5c06\u53d1\u8d77\u81ea\u52a8\u5316\u7684\u673a\u5668\uff0c\u5b83\u53ef\u4ee5\u8fd0\u884c\u4efb\u4f55\u517c\u5bb9\u7684\u7c7bUnix\u64cd\u4f5c\u7cfb\u7edf\uff0c\u6216\u8005\u5982\u679c\u5df2\u5b89\u88c5\u4e86Windows\u5b50\u7cfb\u7edf\u7528\u4e8eLinux\uff08WSL\uff09\uff0c\u5219\u53ef\u4ee5\u8fd0\u884cWindows\u3002<\/p>\n<p>\u5728\u672c\u6559\u7a0b\u4e2d\uff0c\u60a8\u5c06\u4f7f\u7528Ansible\u81ea\u52a8\u5316\u591a\u4e2aUbuntu 22.04\u670d\u52a1\u5668\u7684\u521d\u59cb\u670d\u52a1\u5668\u8bbe\u7f6e\u3002\u60a8\u5c06\u5bf9\u6240\u6709\u670d\u52a1\u5668\u6267\u884c\u4ee5\u4e0b\u521d\u59cb\u8bbe\u7f6e\u4efb\u52a1\uff1a<\/p>\n<ul class=\"post-ul\">\n<li>Updating installed packages<\/li>\n<li>Adding a non-root user with admin privileges<\/li>\n<li>Enabling SSH access for that non-root user<\/li>\n<li>Enabling the firewall<\/li>\n<li>Changing the port for SSH access and using the firewall to protect against brute-force attacks and boost the overall security of the servers<\/li>\n<li>Disabling remote login for the root account<\/li>\n<li>Making sure critical services are active<\/li>\n<li>Removing package dependencies that are no longer required<\/li>\n<\/ul>\n<p>\u56e0\u4e3a\u60a8\u5c06\u4f7f\u7528Ansible\u6765\u8fd0\u884c\u4e00\u4e2a\u5305\u542b\u6bcf\u4e2a\u4efb\u52a1\u7684\u5168\u9762playbook\uff0c\u8fd9\u4e9b\u4efb\u52a1\u5c06\u4f7f\u7528\u4e00\u4e2a\u547d\u4ee4\u5b8c\u6210\uff0c\u800c\u65e0\u9700\u60a8\u5355\u72ec\u767b\u5f55\u670d\u52a1\u5668\u3002\u5728\u521d\u59cb\u670d\u52a1\u5668\u8bbe\u7f6e\u4e4b\u540e\uff0c\u60a8\u53ef\u4ee5\u8fd0\u884c\u4e00\u4e2a\u53ef\u9009\u7684\u6b21\u8981playbook\u6765\u81ea\u52a8\u5316\u670d\u52a1\u5668\u7ba1\u7406\u3002<\/p>\n<h2>\u5148\u51b3\u6761\u4ef6<\/h2>\n<p>\u5b8c\u6210\u6b64\u6559\u7a0b\uff0c\u60a8\u9700\u8981\u4ee5\u4e0b\u7269\u54c1\uff1a<\/p>\n<ul class=\"post-ul\">\n<li>\nAnsible installed on a machine that will act as your control node, which can be your local machine or a remote Linux server. To install Ansible, follow Step 1 of How To Install and Configure Ansible on Ubuntu 22.04, and you can refer to the official Ansible installation guide as needed for other operating systems.<\/p>\n<p>If your control node is a remote Ubuntu 22.04 server, be sure to set it up using the Initial Server Setup and create its SSH key pair as well.<br \/>\nGit installed on the control node. Follow the How To Install Git tutorials for popular Linux distributions.<br \/>\n(Optional) In Step 5, you will use Ansible Vault to create an encrypted password file for your hosts\u2019 users. Ansible Vault uses vi as its default editor. If your control node is a Linux machine and you prefer using nano, use the section on Setting the Ansible Vault Editor in the How To Use Ansible Vault tutorial to change the text editor linked to the EDITOR environment shell variable. This tutorial will use nano as the editor for Ansible Vault.<\/p>\n<\/li>\n<li>\nTwo or more Ubuntu 22.04 servers and the public IPv4 address of each server. No prior setup is required as you\u2019ll use Ansible to automate setup in Step 5, but you must have SSH access to these servers from the Ansible control node mentioned above. If you are using DigitalOcean Droplets, you\u2019ll find the IPv4 address in each server\u2019s Public Network section of the Networking tab in your dashboard.<\/p>\n<p>If your control node is a remote Ubuntu 22.04 server, be sure to use ssh-copy-id to connect the key pair to the hosts.<\/p>\n<\/li>\n<\/ul>\n<h2>\u7b2c\u4e00\u6b65\u2014 \u5728\u63a7\u5236\u8282\u70b9\u4e0a\u4fee\u6539SSH\u5ba2\u6237\u7aef\u914d\u7f6e\u6587\u4ef6<\/h2>\n<p>\u5728\u8fd9\u4e00\u6b65\u4e2d\uff0c\u4f60\u5c06\u4fee\u6539\u63a7\u5236\u8282\u70b9\u7684SSH\u5ba2\u6237\u7aef\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u6307\u4ee4\u3002\u5728\u8fdb\u884c\u6b64\u66f4\u6539\u540e\uff0c\u5c06\u4e0d\u518d\u9700\u8981\u624b\u52a8\u786e\u8ba4\u8fdc\u7a0b\u673a\u5668\u7684SSH\u5bc6\u94a5\u6307\u7eb9\uff0c\u56e0\u4e3a\u5b83\u4eec\u5c06\u88ab\u81ea\u52a8\u63a5\u53d7\u3002\u5bf9\u6bcf\u53f0\u8fdc\u7a0b\u673a\u5668\u624b\u52a8\u63a5\u53d7SSH\u5bc6\u94a5\u6307\u7eb9\u53ef\u80fd\u4f1a\u5f88\u7e41\u7410\uff0c\u56e0\u6b64\u8fd9\u4e2a\u4fee\u6539\u89e3\u51b3\u4e86\u4f7f\u7528Ansible\u81ea\u52a8\u5316\u591a\u4e2a\u670d\u52a1\u5668\u7684\u521d\u59cb\u8bbe\u7f6e\u65f6\u7684\u6269\u5c55\u95ee\u9898\u3002<\/p>\n<p>\u867d\u7136\u60a8\u53ef\u4ee5\u4f7f\u7528Ansible\u7684known_hosts\u6a21\u5757\u6765\u81ea\u52a8\u63a5\u53d7\u5355\u4e2a\u4e3b\u673a\u7684SSH\u5bc6\u94a5\u6307\u7eb9\uff0c\u4f46\u672c\u6559\u7a0b\u5904\u7406\u7684\u662f\u591a\u4e2a\u4e3b\u673a\uff0c\u56e0\u6b64\u5728\u63a7\u5236\u8282\u70b9\u4e0a\uff08\u901a\u5e38\u662f\u60a8\u7684\u672c\u5730\u673a\u5668\uff09\u4fee\u6539SSH\u5ba2\u6237\u7aef\u914d\u7f6e\u6587\u4ef6\u66f4\u4e3a\u6709\u6548\u3002<\/p>\n<p>\u9996\u5148\uff0c\u5728\u63a7\u5236\u8282\u70b9\u4e0a\u542f\u52a8\u7ec8\u7aef\u5e94\u7528\u7a0b\u5e8f\uff0c\u7136\u540e\u4f7f\u7528nano\u6216\u60a8\u559c\u6b22\u7684\u6587\u672c\u7f16\u8f91\u5668\u6253\u5f00SSH\u5ba2\u6237\u7aef\u914d\u7f6e\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\"><span class=\"token function\">sudo<\/span> <span class=\"token function\">nano<\/span> \/etc\/ssh\/ssh_config\r\n<\/li><\/ol>\r\n<\/code><\/pre>\n<p>\u627e\u5230\u5305\u542bStrictHostKeyChecking\u6307\u4ee4\u7684\u884c\u3002\u5220\u9664\u6ce8\u91ca\uff0c\u5e76\u5c06\u5176\u503c\u66f4\u6539\u4e3a\u4ee5\u4e0b\u5185\u5bb9\uff1a<\/p>\n<div>\/etc\/ssh\/ssh_config \u53ef\u4ee5\u7528\u4e0b\u9762\u7684\u53e6\u5916\u4e00\u79cd\u4e2d\u6587\u8868\u8fbe\u65b9\u5f0f\uff1a<\/p>\n<p>ssh \u914d\u7f6e\u6587\u4ef6\u4f4d\u4e8e \/etc\/ssh\/ssh_config<\/p><\/div>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">..<\/span>.\r\n   StrictHostKeyChecking <mark>accept-new<\/mark>\r\n<span class=\"token punctuation\">..<\/span>.\r\n<\/code><\/pre>\n<p>\u4fdd\u5b58\u5e76\u5173\u95ed\u6587\u4ef6\u3002\u60a8\u4e0d\u9700\u8981\u91cd\u65b0\u52a0\u8f7d\u6216\u91cd\u542fSSH\u5b88\u62a4\u7a0b\u5e8f\uff0c\u56e0\u4e3a\u60a8\u53ea\u4fee\u6539\u4e86SSH\u5ba2\u6237\u7aef\u914d\u7f6e\u6587\u4ef6\u3002<\/p>\n<div class=\"post-conf-note\">\n<p class=\"post-note\">\n<p class=\"post-conf-desc\">Note<\/p>\n<div>\u6ce8\u610f\uff1a\u5982\u679c\u60a8\u4e0d\u5e0c\u671b\u5c06StrictHostKeyChecking\u7684\u503c\u4eceask\u6c38\u4e45\u66f4\u6539\u4e3aaccept-new\uff0c\u60a8\u53ef\u4ee5\u5728\u7b2c7\u6b65\u8fd0\u884cplaybook\u540e\u5c06\u5176\u6062\u590d\u4e3a\u9ed8\u8ba4\u503c\u3002\u5c3d\u7ba1\u66f4\u6539\u8be5\u503c\u610f\u5473\u7740\u60a8\u7684\u7cfb\u7edf\u5c06\u81ea\u52a8\u63a5\u53d7SSH\u5bc6\u94a5\u6307\u7eb9\uff0c\u4f46\u5982\u679c\u6307\u7eb9\u53d1\u751f\u53d8\u5316\uff0c\u5b83\u5c06\u62d2\u7edd\u6765\u81ea\u540c\u4e00\u4e3b\u673a\u7684\u540e\u7eed\u8fde\u63a5\u3002\u8fd9\u4e2a\u7279\u6027\u610f\u5473\u7740accept-new\u7684\u66f4\u6539\u5e76\u4e0d\u50cf\u5c06\u8be5\u6307\u4ee4\u7684\u503c\u66f4\u6539\u4e3ano\u90a3\u6837\u5177\u6709\u5b89\u5168\u98ce\u9669\u3002<\/div>\n<\/div>\n<p>\u73b0\u5728\uff0c\u60a8\u5df2\u7ecf\u66f4\u65b0\u4e86SSH\u6307\u4ee4\uff0c\u4e0b\u4e00\u6b65\u5c06\u5f00\u59cb\u8fdb\u884cAnsible\u914d\u7f6e\u3002<\/p>\n<h2>\u7b2c\u4e8c\u6b65 &#8211; \u914d\u7f6eAnsible\u4e3b\u673a\u6587\u4ef6<\/h2>\n<p>Ansible\u4e3b\u673a\u6587\u4ef6\uff08\u4e5f\u79f0\u4e3a\u6e05\u5355\u6587\u4ef6\uff09\u5305\u542b\u6709\u5173Ansible\u4e3b\u673a\u7684\u4fe1\u606f\u3002\u6b64\u4fe1\u606f\u53ef\u80fd\u5305\u62ec\u7ec4\u540d\u3001\u522b\u540d\u3001\u57df\u540d\u548cIP\u5730\u5740\u3002\u8be5\u6587\u4ef6\u9ed8\u8ba4\u4f4d\u4e8e\/etc\/ansible\u76ee\u5f55\u4e2d\u3002\u5728\u6b64\u6b65\u9aa4\u4e2d\uff0c\u60a8\u5c06\u6dfb\u52a0\u5148\u51b3\u6761\u4ef6\u90e8\u5206\u6240\u521b\u5efa\u7684Ansible\u4e3b\u673a\u7684IP\u5730\u5740\uff0c\u4ee5\u4fbf\u60a8\u53ef\u4ee5\u9488\u5bf9\u5b83\u4eec\u8fd0\u884c\u60a8\u7684Ansible\u5267\u672c\u3002<\/p>\n<p>\u9996\u5148\uff0c\u4f7f\u7528nano\u6216\u4f60\u949f\u7231\u7684\u6587\u672c\u7f16\u8f91\u5668\u6253\u5f00hosts\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\"><span class=\"token function\">sudo<\/span> <span class=\"token function\">nano<\/span> \/etc\/ansible\/hosts\r\n<\/li><\/ol>\r\n<\/code><\/pre>\n<p>\u5728\u6587\u4ef6\u7684\u4ecb\u7ecd\u6027\u8bc4\u8bba\u4e4b\u540e\uff0c\u6dfb\u52a0\u4ee5\u4e0b\u51e0\u884c\u5185\u5bb9\uff1a<\/p>\n<div>\/etc\/ansible\/hosts \u53ef\u4ee5\u7528\u4ee5\u4e0b\u65b9\u5f0f\u8fdb\u884c\u8f6c\u8ff0\uff1a<\/div>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">...<\/span>\r\n\r\n<mark>host1<\/mark> ansible_host=<mark>host1<span class=\"token punctuation\">-<\/span>public<span class=\"token punctuation\">-<\/span>ip<span class=\"token punctuation\">-<\/span>address<\/mark>\r\n<mark>host2<\/mark> ansible_host=<mark>host2<span class=\"token punctuation\">-<\/span>public<span class=\"token punctuation\">-<\/span>ip<span class=\"token punctuation\">-<\/span>address<\/mark>\r\n<mark>host3<\/mark> ansible_host=<mark>host3<span class=\"token punctuation\">-<\/span>public<span class=\"token punctuation\">-<\/span>ip<span class=\"token punctuation\">-<\/span>address<\/mark>\r\n\r\n<span class=\"token punctuation\">[<\/span><mark>initial<\/mark><span class=\"token punctuation\">]<\/span>\r\n<mark>host1<\/mark>\r\n<mark>host2<\/mark>\r\n<mark>host3<\/mark>\r\n\r\n<span class=\"token punctuation\">[<\/span><mark>ongoing<\/mark><span class=\"token punctuation\">]<\/span>\r\n<mark>host1<\/mark>\r\n<mark>host2<\/mark>\r\n<mark>host3<\/mark>\r\n<\/code><\/pre>\n<p>host1\u3001host2\u548chost3\u90fd\u662f\u4f60\u60f3\u8981\u81ea\u52a8\u5316\u521d\u59cb\u670d\u52a1\u5668\u8bbe\u7f6e\u7684\u6bcf\u4e2a\u4e3b\u673a\u7684\u522b\u540d\u3002\u4f7f\u7528\u522b\u540d\u53ef\u4ee5\u66f4\u5bb9\u6613\u5730\u5728\u5176\u4ed6\u5730\u65b9\u5f15\u7528\u4e3b\u673a\u3002ansible_host\u662fAnsible\u8fde\u63a5\u53d8\u91cf\uff0c\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u6307\u5411\u76ee\u6807\u4e3b\u673a\u7684IP\u5730\u5740\u3002<\/p>\n<p>\u521d\u59cb\u548c\u6301\u7eed\u662fAnsible\u4e3b\u673a\u7684\u793a\u4f8b\u7ec4\u540d\u79f0\u3002\u9009\u62e9\u80fd\u591f\u6e05\u695a\u4e86\u89e3\u4e3b\u673a\u7528\u9014\u7684\u7ec4\u540d\u79f0\u3002\u4ee5\u8fd9\u79cd\u65b9\u5f0f\u5bf9\u4e3b\u673a\u8fdb\u884c\u5206\u7ec4\uff0c\u53ef\u4ee5\u5c06\u5b83\u4eec\u4f5c\u4e3a\u4e00\u4e2a\u5355\u5143\u6765\u5904\u7406\u3002\u4e3b\u673a\u53ef\u4ee5\u5c5e\u4e8e\u591a\u4e2a\u7ec4\u3002\u672c\u6559\u7a0b\u4e2d\u7684\u4e3b\u673a\u5df2\u5206\u914d\u5230\u4e24\u4e2a\u4e0d\u540c\u7684\u7ec4\uff0c\u56e0\u4e3a\u5b83\u4eec\u5c06\u5728\u4e24\u4e2a\u4e0d\u540c\u7684playbook\u4e2d\u4f7f\u7528\uff1a\u521d\u59cb\u7ec4\u7528\u4e8e\u7b2c6\u6b65\u7684\u521d\u59cb\u670d\u52a1\u5668\u8bbe\u7f6e\uff0c\u6301\u7eed\u7ec4\u7528\u4e8e\u7b2c8\u6b65\u7684\u540e\u7eed\u670d\u52a1\u5668\u7ba1\u7406\u3002<\/p>\n<p>hostN\u7684\u516c\u5171IP\u5730\u5740\u662f\u6bcf\u4e2aAnsible\u4e3b\u673a\u7684IP\u5730\u5740\u3002\u8bf7\u786e\u4fdd\u7528\u5c06\u53c2\u4e0e\u81ea\u52a8\u5316\u7684\u670d\u52a1\u5668\u7684IP\u5730\u5740\u66ff\u6362host1\u7684\u516c\u5171IP\u5730\u5740\u548c\u968f\u540e\u7684\u884c\u3002<\/p>\n<p>\u5f53\u60a8\u5b8c\u6210\u5bf9\u6587\u4ef6\u7684\u4fee\u6539\u540e\uff0c\u8bf7\u4fdd\u5b58\u5e76\u5173\u95ed\u5b83\u3002<\/p>\n<p>\u5728\u6e05\u5355\u6587\u4ef6\u4e2d\u5b9a\u4e49\u4e3b\u673a\u53ef\u4ee5\u5e2e\u52a9\u60a8\u6307\u5b9a\u8981\u4f7f\u7528Ansible\u81ea\u52a8\u5316\u8bbe\u7f6e\u7684\u4e3b\u673a\u3002\u5728\u4e0b\u4e00\u6b65\u4e2d\uff0c\u60a8\u5c06\u514b\u9686\u5305\u542b\u793a\u4f8b\u5267\u672c\u7684\u5b58\u50a8\u5e93\uff0c\u4ee5\u5b9e\u73b0\u591a\u670d\u52a1\u5668\u8bbe\u7f6e\u7684\u81ea\u52a8\u5316\u3002<\/p>\n<h2>\u6b65\u9aa43 \u2014 \u514b\u9686Ansible Ubuntu\u521d\u59cb\u670d\u52a1\u5668\u8bbe\u7f6e\u5b58\u50a8\u5e93<\/h2>\n<p>\u5728\u8fd9\u4e2a\u6b65\u9aa4\u4e2d\uff0c\u60a8\u5c06\u4eceGitHub\u514b\u9686\u4e00\u4e2a\u5305\u542b\u6b64\u81ea\u52a8\u5316\u6240\u9700\u6587\u4ef6\u7684\u793a\u4f8b\u4ed3\u5e93\u3002<\/p>\n<p>\u8fd9\u4e2a\u4ed3\u5e93\u5305\u542b\u4e86\u4e00\u4e2a\u6837\u4f8b\u591a\u670d\u52a1\u5668\u81ea\u52a8\u5316\u7684\u4e09\u4e2a\u6587\u4ef6\uff1ainitial.yml\uff0congoing.yml\uff0c\u548cvars\/default.yml\u3002initial.yml\u6587\u4ef6\u662f\u5305\u542b\u7740\u5bf9Ansible\u4e3b\u673a\u8fdb\u884c\u521d\u59cb\u8bbe\u7f6e\u7684plays\u548ctasks\u7684\u4e3b\u8981playbook\u3002ongoing.yml\u6587\u4ef6\u5305\u542b\u4e86\u5bf9\u4e3b\u673a\u8fdb\u884c\u521d\u59cb\u670d\u52a1\u5668\u8bbe\u7f6e\u540e\u7684\u6301\u7eed\u7ef4\u62a4\u7684\u4efb\u52a1\u3002vars\/default.yml\u6587\u4ef6\u5305\u542b\u4e86\u5728\u7b2c6\u6b65\u548c\u7b2c8\u6b65\u4e24\u4e2aplaybooks\u4e2d\u5c06\u88ab\u8c03\u7528\u7684\u53d8\u91cf\u3002<\/p>\n<p>\u8981\u514b\u9686\u8fd9\u4e2a\u4ed3\u5e93\uff0c\u8bf7\u8f93\u5165\u4ee5\u4e0b\u547d\u4ee4\uff1a<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\"><span class=\"token function\">git<\/span> clone https:\/\/github.com\/do-community\/ansible-ubuntu.git\r\n<\/li><\/ol>\r\n<\/code><\/pre>\n<p>\u6216\u8005\uff0c\u5982\u679c\u60a8\u5df2\u5c06SSH\u5bc6\u94a5\u6dfb\u52a0\u5230\u60a8\u7684GitHub\u8d26\u6237\u4e2d\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u65b9\u5f0f\u514b\u9686\u5b58\u50a8\u5e93\uff1a<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\">git@github.com:do-community\/ansible-ubuntu.git\r\n<\/li><\/ol>\r\n<\/code><\/pre>\n<p>\u4f60\u73b0\u5728\u7684\u5de5\u4f5c\u76ee\u5f55\u4e0b\u4f1a\u6709\u4e00\u4e2a\u540d\u4e3aansible-ubuntu\u7684\u6587\u4ef6\u5939\u3002\u8fdb\u5165\u5b83\uff1a<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\"><span class=\"token builtin class-name\">cd<\/span> ansible-ubuntu\r\n<\/li><\/ol>\r\n<\/code><\/pre>\n<p>\u5728\u63a5\u4e0b\u6765\u7684\u6559\u7a0b\u4e2d\uff0c\u90a3\u5c06\u662f\u4f60\u7684\u5de5\u4f5c\u76ee\u5f55\u3002<\/p>\n<p>\u5728\u8fd9\u4e00\u6b65\u9aa4\u4e2d\uff0c\u60a8\u901a\u8fc7Ansible\u83b7\u53d6\u4e86\u81ea\u52a8\u5316\u591a\u4e2aUbuntu 22.04\u670d\u52a1\u5668\u7684\u793a\u4f8b\u6587\u4ef6\u3002\u4e3a\u4e86\u51c6\u5907\u4e0e\u60a8\u7684\u4e3b\u673a\u76f8\u5173\u7684\u4fe1\u606f\u6587\u4ef6\uff0c\u60a8\u63a5\u4e0b\u6765\u5c06\u66f4\u65b0vars\/default.yml\u6587\u4ef6\u4ee5\u4f7f\u5176\u9002\u7528\u4e8e\u60a8\u7684\u7cfb\u7edf\u3002<\/p>\n<h2>\u7b2c\u56db\u6b65 &#8211; \u4fee\u6539Ansible\u53d8\u91cf<\/h2>\n<p>\u8fd9\u4e2a\u624b\u518c\u5c06\u5f15\u7528\u4e00\u4e9b\u81ea\u52a8\u5316\u6240\u9700\u7684\u4fe1\u606f\uff0c\u8fd9\u4e9b\u4fe1\u606f\u53ef\u80fd\u9700\u8981\u968f\u65f6\u95f4\u66f4\u65b0\u3002\u5c06\u8fd9\u4e9b\u4fe1\u606f\u653e\u5728\u4e00\u4e2a\u53d8\u91cf\u6587\u4ef6\u4e2d\uff0c\u5e76\u5728\u624b\u518c\u4e2d\u8c03\u7528\u8fd9\u4e9b\u53d8\u91cf\uff0c\u6bd4\u5728\u624b\u518c\u5185\u90e8\u786c\u7f16\u7801\u66f4\u9ad8\u6548\u3002\u5728\u6b64\u6b65\u9aa4\u4e2d\uff0c\u60a8\u5c06\u4fee\u6539\u53d8\u91cf\u6587\u4ef6vars\/default.yml\u4e2d\u7684\u53d8\u91cf\uff0c\u4ee5\u7b26\u5408\u60a8\u7684\u504f\u597d\u548c\u8bbe\u7f6e\u9700\u6c42\u3002<\/p>\n<p>\u9996\u5148\uff0c\u4f7f\u7528nano\u6216\u60a8\u559c\u6b22\u7684\u6587\u672c\u7f16\u8f91\u5668\u6253\u5f00\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\"><span class=\"token function\">nano<\/span> vars\/default.yml\r\n<\/li><\/ol>\r\n<\/code><\/pre>\n<p>\u4f60\u5c06\u4f1a\u5ba1\u6838\u6587\u4ef6\u5185\u5bb9\uff0c\u5176\u4e2d\u5305\u62ec\u4ee5\u4e0b\u53d8\u91cf:<\/p>\n<div>\u9ed8\u8ba4.yml\u6587\u4ef6\u4e2d\u7684\u53d8\u91cf<\/div>\n<pre class=\"post-pre\"><code><span class=\"token key atrule\">create_user<\/span><span class=\"token punctuation\">:<\/span> <mark>sammy<\/mark>\r\n\r\n<span class=\"token key atrule\">ssh_port<\/span><span class=\"token punctuation\">:<\/span> <mark><span class=\"token number\">5995<\/span><\/mark>\r\n\r\n<span class=\"token key atrule\">copy_local_key<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"{{ lookup('file', lookup('env','HOME') + '\/.ssh\/<mark>id_rsa.pub<\/mark>') }}\"<\/span>\r\n<\/code><\/pre>\n<p>create_user\u53d8\u91cf\u7684\u503c\u5e94\u8be5\u662f\u5c06\u5728\u6bcf\u4e2a\u4e3b\u673a\u4e0a\u521b\u5efa\u7684sudo\u7528\u6237\u7684\u540d\u79f0\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u5b83\u662fsammy\uff0c\u4f46\u60a8\u53ef\u4ee5\u6839\u636e\u559c\u597d\u6765\u547d\u540d\u8be5\u7528\u6237\u3002<\/p>\n<p>ssh_port\u53d8\u91cf\u4fdd\u5b58\u4e86\u5728\u8bbe\u7f6e\u5b8c\u6210\u4e4b\u540e\u8fde\u63a5\u5230Ansible\u4e3b\u673a\u65f6\u4f7f\u7528\u7684SSH\u7aef\u53e3\u3002SSH\u7684\u9ed8\u8ba4\u7aef\u53e3\u662f22\uff0c\u4f46\u662f\u66f4\u6539\u5b83\u5c06\u663e\u8457\u51cf\u5c11\u5bf9\u670d\u52a1\u5668\u7684\u81ea\u52a8\u653b\u51fb\u6b21\u6570\u3002\u8fd9\u4e2a\u66f4\u6539\u662f\u53ef\u9009\u7684\uff0c\u4f46\u5c06\u63d0\u5347\u4e3b\u673a\u7684\u5b89\u5168\u6027\u3002\u60a8\u5e94\u8be5\u9009\u62e9\u4e00\u4e2a\u57281024\u523065535\u4e4b\u95f4\u7684\u8f83\u5c11\u77e5\u540d\u7684\u7aef\u53e3\uff0c\u5e76\u4e14\u6b64\u7aef\u53e3\u5728Ansible\u4e3b\u673a\u4e0a\u6ca1\u6709\u88ab\u5176\u4ed6\u5e94\u7528\u7a0b\u5e8f\u4f7f\u7528\u3002\u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\uff0c\u60a8\u6b63\u5728\u4f7f\u7528\u7aef\u53e35995\u3002<\/p>\n<div class=\"post-conf-note\">\n<p class=\"post-note\">\n<p class=\"post-conf-desc\">Note<\/p>\n<div>\u6ce8\u610f\uff1a\u5982\u679c\u4f60\u7684\u63a7\u5236\u8282\u70b9\u6b63\u5728\u8fd0\u884c\u4e00\u4e2aLinux\u53d1\u884c\u7248\uff0c\u8bf7\u9009\u62e9\u4e00\u4e2a\u5927\u4e8e1023\u7684\u6570\u5b57\uff0c\u5e76\u5728\/etc\/services\u4e2d\u4f7f\u7528grep\u547d\u4ee4\u8fdb\u884c\u67e5\u627e\u3002\u4f8b\u5982\uff0c\u8fd0\u884cgrep 5995 \/etc\/services\u4ee5\u68c0\u67e55995\u662f\u5426\u88ab\u4f7f\u7528\u3002\u5982\u679c\u6ca1\u6709\u8f93\u51fa\uff0c\u5219\u8bf4\u660e\u8be5\u7aef\u53e3\u4e0d\u5b58\u5728\u4e8e\u8be5\u6587\u4ef6\u4e2d\uff0c\u4f60\u53ef\u4ee5\u5c06\u5176\u5206\u914d\u7ed9\u53d8\u91cf\u3002\u5982\u679c\u4f60\u7684\u63a7\u5236\u8282\u70b9\u4e0d\u662f\u4e00\u4e2aLinux\u53d1\u884c\u7248\uff0c\u800c\u4e14\u4f60\u4e0d\u77e5\u9053\u5728\u4f60\u7684\u7cfb\u7edf\u4e0a\u5982\u4f55\u627e\u5230\u5176\u76f8\u5f53\u4e8e\u7684\u4fe1\u606f\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u670d\u52a1\u540d\u79f0\u548c\u4f20\u8f93\u534f\u8bae\u7aef\u53e3\u53f7\u6ce8\u518c\u8868\u3002<\/div>\n<\/div>\n<p>copy_local_key\u53d8\u91cf\u5f15\u7528\u4e86\u63a7\u5236\u8282\u70b9\u7684SSH\u516c\u94a5\u6587\u4ef6\u3002\u5982\u679c\u8be5\u6587\u4ef6\u7684\u540d\u79f0\u662fid_rsa.pub\uff0c\u5219\u5728\u8be5\u884c\u4e2d\u4e0d\u9700\u8981\u8fdb\u884c\u4efb\u4f55\u66f4\u6539\u3002\u5426\u5219\uff0c\u8bf7\u5c06\u5176\u66f4\u6539\u4e3a\u4e0e\u60a8\u7684\u63a7\u5236\u8282\u70b9\u7684SSH\u516c\u94a5\u6587\u4ef6\u5339\u914d\u3002\u60a8\u53ef\u4ee5\u5728\u63a7\u5236\u8282\u70b9\u7684~\/.ssh\u76ee\u5f55\u4e0b\u627e\u5230\u8be5\u6587\u4ef6\u3002\u5f53\u60a8\u5728\u7b2c5\u6b65\u4e2d\u8fd0\u884c\u4e3b\u8981\u7684playbook\u5e76\u521b\u5efa\u5177\u6709sudo\u6743\u9650\u7684\u7528\u6237\u540e\uff0cAnsible\u63a7\u5236\u5668\u5c06\u628a\u516c\u94a5\u6587\u4ef6\u590d\u5236\u5230\u7528\u6237\u7684\u4e3b\u76ee\u5f55\u4e2d\uff0c\u8fd9\u6837\u60a8\u5c31\u53ef\u4ee5\u5728\u670d\u52a1\u5668\u8fdb\u884c\u521d\u59cb\u5316\u8bbe\u7f6e\u4e4b\u540e\u4f7f\u7528\u8be5\u7528\u6237\u901a\u8fc7SSH\u8fdb\u884c\u767b\u5f55\u3002<\/p>\n<p>\u5f53\u4f60\u4fee\u6539\u5b8c\u6587\u4ef6\u540e\uff0c\u8bf7\u4fdd\u5b58\u5e76\u5173\u95ed\u5b83\u3002<\/p>\n<p>\u73b0\u5728\u4f60\u5df2\u7ecf\u5728vars\/default.yml\u6587\u4ef6\u4e2d\u4e3a\u53d8\u91cf\u8d4b\u503c\uff0c\u5f53\u6267\u884c\u7b2c6\u6b65\u548c\u7b2c8\u6b65\u7684playbook\u65f6\uff0cAnsible\u5c06\u80fd\u591f\u8c03\u7528\u8fd9\u4e9b\u53d8\u91cf\u3002\u5728\u4e0b\u4e00\u6b65\u4e2d\uff0c\u4f60\u5c06\u4f7f\u7528Ansible Vault\u6765\u521b\u5efa\u5e76\u4fdd\u62a4\u6bcf\u4e2a\u4e3b\u673a\u4e0a\u5c06\u8981\u521b\u5efa\u7684\u7528\u6237\u7684\u5bc6\u7801\u3002<\/p>\n<h2>\u7b2c\u4e94\u6b65-\u4f7f\u7528Ansible Vault\u521b\u5efa\u52a0\u5bc6\u5bc6\u7801\u6587\u4ef6\u3002<\/h2>\n<p>\u4f7f\u7528 Ansible Vault \u53ef\u4ee5\u521b\u5efa\u548c\u52a0\u5bc6\u6587\u4ef6\u548c\u53d8\u91cf\uff0c\u8fd9\u4e9b\u6587\u4ef6\u548c\u53d8\u91cf\u53ef\u4ee5\u5728 playbooks \u4e2d\u5f15\u7528\u3002\u4f7f\u7528 Ansible Vault \u53ef\u4ee5\u786e\u4fdd\u5728\u6267\u884c playbook \u65f6\u654f\u611f\u4fe1\u606f\u4e0d\u4ee5\u660e\u6587\u5f62\u5f0f\u4f20\u8f93\u3002\u5728\u6b64\u6b65\u9aa4\u4e2d\uff0c\u60a8\u5c06\u521b\u5efa\u548c\u52a0\u5bc6\u4e00\u4e2a\u5305\u542b\u53d8\u91cf\u7684\u6587\u4ef6\uff0c\u8fd9\u4e9b\u53d8\u91cf\u7684\u503c\u5c06\u7528\u4e8e\u4e3a\u6bcf\u4e2a\u4e3b\u673a\u7684 sudo \u7528\u6237\u521b\u5efa\u5bc6\u7801\u3002\u901a\u8fc7\u4ee5\u8fd9\u79cd\u65b9\u5f0f\u4f7f\u7528 Ansible Vault\uff0c\u53ef\u4ee5\u786e\u4fdd\u5728\u521d\u59cb\u670d\u52a1\u5668\u8bbe\u7f6e\u671f\u95f4\u548c\u4e4b\u540e\u7684 playbook \u4e2d\uff0c\u5bc6\u7801\u4e0d\u4f1a\u4ee5\u660e\u6587\u65b9\u5f0f\u5f15\u7528\u3002<\/p>\n<p>\u4ecd\u7136\u5728ansible-ubuntu\u76ee\u5f55\u4e2d\uff0c\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u521b\u5efa\u5e76\u6253\u5f00\u4e00\u4e2a\u4fdd\u9669\u5e93\u6587\u4ef6\uff1a<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\">ansible-vault create <mark>secret<\/mark>\r\n<\/li><\/ol>\r\n<\/code><\/pre>\n<p>\u5f53\u63d0\u793a\u65f6\uff0c\u8f93\u5165\u5e76\u786e\u8ba4\u4e00\u4e2a\u5bc6\u7801\uff0c\u7528\u4e8e\u52a0\u5bc6\u79d8\u5bc6\u6587\u4ef6\u3002\u8fd9\u5c31\u662f\u4fdd\u9669\u5e93\u5bc6\u7801\u3002\u5728\u6267\u884c\u7b2c6\u6b65\u548c\u7b2c8\u6b65\u7684playbook\u65f6\uff0c\u60a8\u5c06\u9700\u8981\u4fdd\u9669\u5e93\u5bc6\u7801\uff0c\u56e0\u6b64\u8bf7\u8bb0\u4f4f\u5b83\u3002<\/p>\n<p>\u8f93\u5165\u5e76\u786e\u8ba4\u4fdd\u9669\u5e93\u5bc6\u7801\u540e\uff0c\u79d8\u5bc6\u6587\u4ef6\u5c06\u5728\u4e0eshell\u7684EDITOR\u73af\u5883\u53d8\u91cf\u94fe\u63a5\u7684\u6587\u672c\u7f16\u8f91\u5668\u4e2d\u6253\u5f00\u3002\u5c06\u4ee5\u4e0b\u884c\u6dfb\u52a0\u5230\u6587\u4ef6\u4e2d\uff0c\u540c\u65f6\u66ff\u6362type_a_strong_password_here\u548ctype_a_salt_here\u7684\u503c\uff1a<\/p>\n<div>~\/ansible-ubuntu\/secret \u7684\u4e2d\u6587\u539f\u6587\u5982\u4e0b\uff1a<\/div>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\">password: <mark>type_a_strong_password_here<\/mark>\r\n<\/li><li data-prefix=\"$\">password_salt: <mark>type_a_salt_here<\/mark>\r\n<\/li><\/ol>\r\n<\/code><\/pre>\n<p>`password`\u53d8\u91cf\u7684\u503c\u5c06\u662f\u5728\u6bcf\u4e2a\u4e3b\u673a\u4e0a\u521b\u5efa\u7684sudo\u7528\u6237\u7684\u5b9e\u9645\u5bc6\u7801\u3002`password_salt`\u53d8\u91cf\u4f7f\u7528\u76d0\u4f5c\u4e3a\u5176\u503c\u3002\u76d0\u662f\u4efb\u4f55\u957f\u4e14\u968f\u673a\u7684\u503c\uff0c\u7528\u4e8e\u751f\u6210\u54c8\u5e0c\u5bc6\u7801\u3002\u60a8\u53ef\u4ee5\u4f7f\u7528\u5b57\u6bcd\u6216\u5b57\u6bcd\u6570\u5b57\u5b57\u7b26\u4e32\uff0c\u4f46\u4ec5\u4f7f\u7528\u6570\u5b57\u5b57\u7b26\u4e32\u53ef\u80fd\u65e0\u6548\u3002\u5728\u751f\u6210\u54c8\u5e0c\u5bc6\u7801\u65f6\u6dfb\u52a0\u76d0\u4f7f\u5f97\u731c\u6d4b\u5bc6\u7801\u6216\u7834\u89e3\u54c8\u5e0c\u66f4\u52a0\u56f0\u96be\u3002\u5728\u6267\u884c\u6b65\u9aa46\u548c\u6b65\u9aa48\u4e2d\u7684playbooks\u65f6\uff0c\u8fd9\u4e24\u4e2a\u53d8\u91cf\u5c06\u88ab\u8c03\u7528\u3002<\/p>\n<div class=\"post-conf-note\">\n<p class=\"post-note\">\n<p class=\"post-conf-desc\">Note<\/p>\n<div>\u6ce8\u610f\uff1a\u5728\u6d4b\u8bd5\u4e2d\uff0c\u6211\u4eec\u53d1\u73b0\u4ec5\u4f7f\u7528\u6570\u5b57\u5b57\u7b26\u7ec4\u6210\u7684\u76d0\u5728\u6b65\u9aa46\u548c\u6b65\u9aa48\u4e2d\u8fd0\u884cplaybook\u65f6\u4f1a\u51fa\u73b0\u95ee\u9898\u3002\u7136\u800c\uff0c\u4ec5\u4f7f\u7528\u5b57\u6bcd\u5b57\u7b26\u7ec4\u6210\u7684\u76d0\u662f\u6709\u6548\u7684\u3002\u540c\u65f6\uff0c\u4f7f\u7528\u5b57\u6bcd\u548c\u6570\u5b57\u7684\u7ec4\u5408\u4e5f\u662f\u6709\u6548\u7684\u3002\u8bf7\u8bb0\u4f4f\u8fd9\u4e00\u70b9\uff0c\u5728\u6307\u5b9a\u76d0\u503c\u65f6\u8981\u8003\u8651\u8fd9\u4e9b\u60c5\u51b5\u3002<\/div>\n<\/div>\n<p>\u5f53\u60a8\u5b8c\u6210\u4fee\u6539\u6587\u4ef6\u65f6\uff0c\u8bf7\u4fdd\u5b58\u5e76\u5173\u95ed\u5b83\u3002<\/p>\n<p>\u60a8\u73b0\u5728\u5df2\u7ecf\u521b\u5efa\u4e86\u4e00\u4e2a\u5305\u542b\u53d8\u91cf\u7684\u52a0\u5bc6\u5bc6\u7801\u6587\u4ef6\uff0c\u8fd9\u4e9b\u53d8\u91cf\u5c06\u7528\u4e8e\u4e3a\u4e3b\u673a\u4e0a\u7684sudo\u7528\u6237\u521b\u5efa\u5bc6\u7801\u3002\u5728\u4e0b\u4e00\u6b65\u4e2d\uff0c\u60a8\u5c06\u901a\u8fc7\u8fd0\u884c\u4e3bAnsible playbook\u6765\u81ea\u52a8\u5b8c\u6210\u5728\u7b2c2\u6b65\u4e2d\u6307\u5b9a\u7684\u670d\u52a1\u5668\u7684\u521d\u59cb\u8bbe\u7f6e\u3002<\/p>\n<h2>\u7b2c\u516d\u6b65 \u2014 \u5728\u4f60\u7684Ansible\u4e3b\u673a\u4e0a\u8fd0\u884c\u4e3b\u8981\u7684Playbook\u3002<\/h2>\n<p>\u5728\u8fd9\u4e00\u6b65\u9aa4\u4e2d\uff0c\u60a8\u5c06\u4f7f\u7528Ansible\u81ea\u52a8\u5316\u521d\u59cb\u670d\u52a1\u5668\u8bbe\u7f6e\uff0c\u6570\u91cf\u4e0e\u60a8\u5728\u6e05\u5355\u6587\u4ef6\u4e2d\u6307\u5b9a\u7684\u670d\u52a1\u5668\u76f8\u540c\u3002\u60a8\u5c06\u9996\u5148\u68c0\u67e5\u4e3b\u8981\u5267\u672c\u4e2d\u5b9a\u4e49\u7684\u4efb\u52a1\u3002\u7136\u540e\uff0c\u60a8\u5c06\u5bf9\u4e3b\u673a\u6267\u884c\u8be5\u5267\u672c\u3002<\/p>\n<p>\u4e00\u4e2aAnsible playbook\u7531\u4e00\u4e2a\u6216\u591a\u4e2aplay\u7ec4\u6210\uff0c\u6bcf\u4e2aplay\u5305\u542b\u4e00\u4e2a\u6216\u591a\u4e2a\u4efb\u52a1\u3002\u4f60\u5c06\u5bf9\u4f60\u7684Ansible\u4e3b\u673a\u8fd0\u884c\u7684\u793a\u4f8bplaybook\u5305\u542b\u4e86\u4e24\u4e2aplay\uff0c\u5171\u670914\u4e2a\u4efb\u52a1\u3002<\/p>\n<p>\u5728\u8fd0\u884c\u5267\u672c\u4e4b\u524d\uff0c\u60a8\u5c06\u5ba1\u67e5\u5176\u8bbe\u7f6e\u8fc7\u7a0b\u4e2d\u6d89\u53ca\u7684\u6bcf\u4e2a\u4efb\u52a1\u3002\u9996\u5148\uff0c\u4f7f\u7528nano\u6216\u60a8\u559c\u6b22\u7684\u6587\u672c\u7f16\u8f91\u5668\u6253\u5f00\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\"><span class=\"token function\">nano<\/span> initial.yml\r\n<\/li><\/ol>\r\n<\/code><\/pre>\n<h3>\u5267\u76ee1: \u6f14\u51fa<\/h3>\n<p>\u6587\u4ef6\u7684\u7b2c\u4e00\u90e8\u5206\u5305\u542b\u4ee5\u4e0b\u5173\u952e\u5b57\uff0c\u8fd9\u4e9b\u5173\u952e\u5b57\u4f1a\u5f71\u54cd\u5267\u672c\u7684\u884c\u4e3a\u3002<\/p>\n<div>initial.yml\u7684\u521d\u59cb\u8bbe\u7f6e\u3002<\/div>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> <mark>Initial server setup tasks<\/mark>\r\n  <span class=\"token key atrule\">hosts<\/span><span class=\"token punctuation\">:<\/span> <mark>initial<\/mark>\r\n  <span class=\"token key atrule\">remote_user<\/span><span class=\"token punctuation\">:<\/span> root\r\n  <span class=\"token key atrule\">vars_files<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token punctuation\">-<\/span> vars\/default.yml\r\n    <span class=\"token punctuation\">-<\/span> secret\r\n<span class=\"token punctuation\">...<\/span>\r\n<\/code><\/pre>\n<p>\u540d\u79f0\u662f\u620f\u5267\u7684\u4e00\u4e2a\u7b80\u77ed\u63cf\u8ff0\uff0c\u5b83\u5c06\u5728\u620f\u5267\u8fd0\u884c\u65f6\u663e\u793a\u5728\u7ec8\u7aef\u4e2d\u3002hosts\u5173\u952e\u5b57\u6307\u793a\u620f\u5267\u7684\u76ee\u6807\u4e3b\u673a\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u4f20\u9012\u7ed9\u5173\u952e\u5b57\u7684\u6a21\u5f0f\u662f\u4f60\u5728\u7b2c2\u6b65\u4e2d\u5728\/etc\/ansible\/hosts\u6587\u4ef6\u4e2d\u6307\u5b9a\u7684\u4e3b\u673a\u7ec4\u540d\u79f0\u3002\u4f60\u4f7f\u7528remote_user\u5173\u952e\u5b57\u544a\u8bc9Ansible\u63a7\u5236\u5668\u8981\u4f7f\u7528\u7684\u7528\u6237\u540d\u6765\u767b\u5f55\u4e3b\u673a\uff08\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\u662froot\uff09\u3002vars_files\u5173\u952e\u5b57\u6307\u5411\u5305\u542b\u620f\u5267\u5728\u6267\u884c\u4efb\u52a1\u65f6\u5c06\u5f15\u7528\u7684\u53d8\u91cf\u7684\u6587\u4ef6\u3002<\/p>\n<p>\u901a\u8fc7\u8fd9\u4e2a\u8bbe\u7f6e\uff0cAnsible \u63a7\u5236\u5668\u4f1a\u5c1d\u8bd5\u901a\u8fc7 SSH \u7684 22 \u7aef\u53e3\u4ee5 root \u7528\u6237\u8eab\u4efd\u767b\u5f55\u5230\u4e3b\u673a\u3002\u5bf9\u4e8e\u6bcf\u4e2a\u6210\u529f\u767b\u5f55\u7684\u4e3b\u673a\uff0c\u5b83\u4f1a\u62a5\u544a\u4e00\u4e2a\u201cok\u201d\u7684\u54cd\u5e94\u3002\u5426\u5219\uff0c\u5b83\u4f1a\u62a5\u544a\u670d\u52a1\u5668\u4e0d\u53ef\u8bbf\u95ee\uff0c\u5e76\u5f00\u59cb\u6267\u884c\u4e0e\u6210\u529f\u767b\u5f55\u7684\u4e3b\u673a\u76f8\u5173\u7684 play \u7684\u4efb\u52a1\u3002\u5982\u679c\u60a8\u8981\u624b\u52a8\u5b8c\u6210\u6b64\u8bbe\u7f6e\uff0c\u8fd9\u4e2a\u81ea\u52a8\u5316\u8fc7\u7a0b\u4f1a\u53d6\u4ee3\u4f7f\u7528 ssh root@host-ip-address \u767b\u5f55\u5230\u4e3b\u673a\u3002<\/p>\n<p>\u5173\u952e\u8bcd\u90e8\u5206\u4e4b\u540e\u662f\u4e00\u4e2a\u6309\u987a\u5e8f\u6267\u884c\u7684\u4efb\u52a1\u5217\u8868\u3002\u4e0e\u620f\u5267\u4e00\u6837\uff0c\u6bcf\u4e2a\u4efb\u52a1\u90fd\u4ee5\u4e00\u4e2a\u540d\u79f0\u5f00\u59cb\uff0c\u8be5\u540d\u79f0\u63d0\u4f9b\u4e86\u4efb\u52a1\u5c06\u5b8c\u6210\u7684\u7b80\u8981\u63cf\u8ff0\u3002<\/p>\n<h4>\u4efb\u52a11\uff1a\u66f4\u65b0\u7f13\u5b58<\/h4>\n<p>\u5728playbook\u4e2d\u7684\u7b2c\u4e00\u4e2a\u4efb\u52a1\u662f\u66f4\u65b0\u8f6f\u4ef6\u5305\u6570\u636e\u5e93\u3002<\/p>\n<div>\u521d\u59cb.yml<\/div>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">...<\/span>\r\n<span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> <mark>update cache<\/mark>\r\n  <span class=\"token key atrule\">ansible.builtin.apt<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">update_cache<\/span><span class=\"token punctuation\">:<\/span> yes\r\n<span class=\"token punctuation\">...<\/span>\r\n<\/code><\/pre>\n<p>\u8fd9\u4e2a\u4efb\u52a1\u5c06\u4f7f\u7528ansible.builtin.apt\u6a21\u5757\u66f4\u65b0\u8f6f\u4ef6\u5305\u6570\u636e\u5e93\uff0c\u8fd9\u4e5f\u662f\u4e3a\u4ec0\u4e48\u5b83\u88ab\u5b9a\u4e49\u4e3aupdate_cache: yes\u3002\u8be5\u4efb\u52a1\u5b9e\u73b0\u4e86\u4e0e\u767b\u5f55\u5230Ubuntu\u670d\u52a1\u5668\u5e76\u8f93\u5165sudo apt update\u76f8\u540c\u7684\u529f\u80fd\uff0c\u901a\u5e38\u662f\u66f4\u65b0\u6240\u6709\u5df2\u5b89\u88c5\u7684\u8f6f\u4ef6\u5305\u4e4b\u524d\u7684\u51c6\u5907\u5de5\u4f5c\u3002<\/p>\n<h4>\u4efb\u52a12\uff1a\u66f4\u65b0\u6240\u6709\u5df2\u5b89\u88c5\u7684\u8f6f\u4ef6\u5305<\/h4>\n<p>\u5267\u672c\u4e2d\u7684\u7b2c\u4e8c\u4e2a\u4efb\u52a1\u662f\u66f4\u65b0\u8f6f\u4ef6\u5305\u3002<\/p>\n<div>\u521d\u59cb.yml<\/div>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">...<\/span>\r\n<span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> <mark>Update all installed packages<\/mark>\r\n  <span class=\"token key atrule\">ansible.builtin.apt<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"*\"<\/span>\r\n    <span class=\"token key atrule\">state<\/span><span class=\"token punctuation\">:<\/span> latest\r\n<span class=\"token punctuation\">...<\/span>\r\n<\/code><\/pre>\n<p>\u5c31\u50cf\u7b2c\u4e00\u4e2a\u4efb\u52a1\u4e00\u6837\uff0c\u8fd9\u4e2a\u4efb\u52a1\u4e5f\u4f7f\u7528\u4e86ansible.builtin.apt\u6a21\u5757\u3002\u5728\u8fd9\u91cc\uff0c\u4f60\u901a\u8fc7\u4f7f\u7528\u901a\u914d\u7b26\uff08\u540d\u79f0\uff1a&#8221;*&#8221;\uff09\u548c\u72b6\u6001\u4e3a\u6700\u65b0\uff08state\uff1alatest\uff09\u6765\u786e\u4fdd\u6240\u6709\u5df2\u5b89\u88c5\u7684\u8f6f\u4ef6\u5305\u90fd\u662f\u6700\u65b0\u7684\uff0c\u8fd9\u76f8\u5f53\u4e8e\u767b\u5f55\u5230\u4f60\u7684\u670d\u52a1\u5668\u4e0a\u5e76\u8fd0\u884csudo apt upgrade -y\u547d\u4ee4\u3002<\/p>\n<h4>\u4efb\u52a13\uff1a\u786e\u4fddNTP\u670d\u52a1\u6b63\u5728\u8fd0\u884c\u3002<\/h4>\n<p>\u5728playbook\u4e2d\u7684\u7b2c\u4e09\u4e2a\u4efb\u52a1\u662f\u786e\u4fdd\u7f51\u7edc\u65f6\u95f4\u534f\u8bae\uff08NTP\uff09\u5b88\u62a4\u8fdb\u7a0b\u5904\u4e8e\u6d3b\u52a8\u72b6\u6001\u3002<\/p>\n<div>\u521d\u59cb\u7684.yml\u6587\u4ef6<\/div>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">...<\/span>\r\n<span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> <mark>Make sure NTP service is running<\/mark>\r\n  <span class=\"token key atrule\">ansible.builtin.systemd<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">state<\/span><span class=\"token punctuation\">:<\/span> started\r\n    <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> systemd<span class=\"token punctuation\">-<\/span>timesyncd\r\n<span class=\"token punctuation\">...<\/span>\r\n<\/code><\/pre>\n<p>\u8fd9\u4e2a\u4efb\u52a1\u8c03\u7528ansible.builtin.systemd\u6a21\u5757\u6765\u786e\u4fddsystemd-timesyncd\uff0c\u5373NTP\u5b88\u62a4\u7a0b\u5e8f\u6b63\u5728\u8fd0\u884c\uff08\u72b6\u6001\uff1a\u5df2\u542f\u52a8\uff09\u3002\u5f53\u60a8\u5e0c\u671b\u786e\u4fdd\u60a8\u7684\u670d\u52a1\u5668\u4fdd\u6301\u76f8\u540c\u7684\u65f6\u95f4\u65f6\uff0c\u53ef\u4ee5\u8fd0\u884c\u8fd9\u6837\u7684\u4efb\u52a1\uff0c\u8fd9\u53ef\u4ee5\u5e2e\u52a9\u5728\u8fd9\u4e9b\u670d\u52a1\u5668\u4e0a\u8fd0\u884c\u5206\u5e03\u5f0f\u5e94\u7528\u7a0b\u5e8f\u3002<\/p>\n<h4>\u4efb\u52a14: \u786e\u4fdd\u6211\u4eec\u6709\u4e00\u4e2asudo\u7ec4<\/h4>\n<p>\u5267\u672c\u4e2d\u7684\u7b2c\u56db\u4e2a\u4efb\u52a1\u662f\u9a8c\u8bc1\u662f\u5426\u5b58\u5728sudo\u7fa4\u7ec4\u3002<\/p>\n<div>\u521d\u59cb.yml<\/div>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">...<\/span>\r\n<span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> <mark>Make sure we have a 'sudo' group<\/mark>\r\n  <span class=\"token key atrule\">ansible.builtin.group<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> sudo\r\n    <span class=\"token key atrule\">state<\/span><span class=\"token punctuation\">:<\/span> present\r\n<span class=\"token punctuation\">...<\/span>\r\n<\/code><\/pre>\n<p>\u6b64\u4efb\u52a1\u8c03\u7528ansible.builtin.group\u6a21\u5757\u6765\u68c0\u67e5\u4e3b\u673a\u4e0a\u662f\u5426\u5b58\u5728\u540d\u4e3asudo\u7684\u7ec4\uff08\u72b6\u6001\uff1a\u51fa\u73b0\uff09\u3002\u56e0\u4e3a\u60a8\u7684\u4e0b\u4e00\u4e2a\u4efb\u52a1\u4f9d\u8d56\u4e3b\u673a\u4e0a\u5b58\u5728sudo\u7ec4\uff0c\u6240\u4ee5\u6b64\u4efb\u52a1\u4f1a\u68c0\u67e5sudo\u7ec4\u7684\u5b58\u5728\uff0c\u4ee5\u786e\u4fdd\u4e0b\u4e00\u4e2a\u4efb\u52a1\u4e0d\u4f1a\u5931\u8d25\u3002<\/p>\n<h4>\u4efb\u52a15\uff1a\u521b\u5efa\u4e00\u4e2a\u5177\u6709sudo\u7279\u6743\u7684\u7528\u6237<\/h4>\n<p>\u64ad\u653e\u624b\u518c\u4e2d\u7684\u7b2c\u4e94\u4e2a\u4efb\u52a1\u662f\u4f7f\u7528sudo\u7279\u6743\u521b\u5efa\u60a8\u7684\u975eroot\u7528\u6237\u3002<\/p>\n<div>\u6700\u521d.yml<\/div>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">...<\/span>\r\n<span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> <mark>Create a user with sudo privileges<\/mark>\r\n  <span class=\"token key atrule\">ansible.builtin.user<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"{{ create_user }}\"<\/span>\r\n    <span class=\"token key atrule\">state<\/span><span class=\"token punctuation\">:<\/span> present\r\n    <span class=\"token key atrule\">groups<\/span><span class=\"token punctuation\">:<\/span> sudo\r\n    <span class=\"token key atrule\">append<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">true<\/span>\r\n    <span class=\"token key atrule\">create_home<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">true<\/span>\r\n    <span class=\"token key atrule\">shell<\/span><span class=\"token punctuation\">:<\/span> \/bin\/bash\r\n    <span class=\"token key atrule\">password<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"{{ password | password_hash('sha512', password_salt) }}\"<\/span>\r\n    <span class=\"token key atrule\">update_password<\/span><span class=\"token punctuation\">:<\/span> on_create\r\n<span class=\"token punctuation\">...<\/span>\r\n<\/code><\/pre>\n<p>\u8fd9\u91cc\uff0c\u60a8\u901a\u8fc7\u8c03\u7528ansible\u5185\u7f6e\u7684user\u6a21\u5757\u5728\u6bcf\u4e2a\u4e3b\u673a\u4e0a\u521b\u5efa\u4e00\u4e2a\u7528\u6237\uff0c\u5e76\u5c06sudo\u7ec4\u9644\u52a0\u5230\u7528\u6237\u7684\u7ec4\u4e2d\u3002\u7528\u6237\u7684\u540d\u79f0\u662f\u4ecevars\/default.yml\u4e2d\u6307\u5b9a\u7684create_user\u53d8\u91cf\u7684\u503c\u6d3e\u751f\u800c\u6765\u3002\u6b64\u4efb\u52a1\u8fd8\u786e\u4fdd\u4e3a\u7528\u6237\u521b\u5efa\u4e00\u4e2a\u4e3b\u76ee\u5f55\uff0c\u5e76\u6307\u5b9a\u6b63\u786e\u7684shell\u3002<\/p>\n<p>\u4f7f\u7528\u5bc6\u7801\u53c2\u6570\u548c\u5728\u6b65\u9aa45\u4e2d\u8bbe\u7f6e\u7684\u5bc6\u7801\u548c\u76d0\u7684\u7ec4\u5408\uff0c\u8c03\u7528SHA-512\u5bc6\u7801\u54c8\u5e0c\u7b97\u6cd5\u7684\u51fd\u6570\u4e3a\u7528\u6237\u751f\u6210\u4e86\u4e00\u4e2a\u54c8\u5e0c\u5bc6\u7801\u3002\u4e0e\u79d8\u5bc6\u4fdd\u9669\u5e93\u6587\u4ef6\u914d\u5bf9\uff0c\u5bc6\u7801\u6c38\u8fdc\u4e0d\u4f1a\u4ee5\u660e\u6587\u5f62\u5f0f\u4f20\u9012\u7ed9\u63a7\u5236\u5668\u3002\u901a\u8fc7\u4f7f\u7528update_password\uff0c\u53ef\u4ee5\u786e\u4fdd\u53ea\u6709\u5728\u521b\u5efa\u7528\u6237\u7684\u7b2c\u4e00\u6b21\u624d\u8bbe\u7f6e\u54c8\u5e0c\u5bc6\u7801\u3002\u5982\u679c\u91cd\u65b0\u8fd0\u884cplaybook\uff0c\u5bc6\u7801\u5c06\u4e0d\u4f1a\u91cd\u65b0\u751f\u6210\u3002<\/p>\n<h4>\u4efb\u52a16: \u4e3a\u8fdc\u7a0b\u7528\u6237\u8bbe\u7f6e\u6388\u6743\u5bc6\u94a5<\/h4>\n<p>\u5267\u672c\u4e2d\u7684\u7b2c\u516d\u4e2a\u4efb\u52a1\u4e3a\u60a8\u7684\u7528\u6237\u8bbe\u5b9a\u4e86\u5173\u952e\u3002<\/p>\n<div>\u521d\u59cb\u7684.yml\u6587\u4ef6<\/div>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">...<\/span>\r\n<span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> <mark>Set authorized key for remote user<\/mark>\r\n  <span class=\"token key atrule\">ansible.posix.authorized_key<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">user<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"{{ create_user }}\"<\/span>\r\n    <span class=\"token key atrule\">state<\/span><span class=\"token punctuation\">:<\/span> present\r\n    <span class=\"token key atrule\">key<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"{{ copy_local_key }}\"<\/span>\r\n<span class=\"token punctuation\">...<\/span>\r\n<\/code><\/pre>\n<p>\u901a\u8fc7\u8c03\u7528ansible.posix.authorized_key\uff0c\u5728\u8fd9\u4e2a\u4efb\u52a1\u4e2d\uff0c\u4f60\u53ef\u4ee5\u5c06\u4f60\u7684\u516c\u5171SSH\u5bc6\u94a5\u590d\u5236\u5230\u4e3b\u673a\u4e0a\u3002\u53d8\u91cfuser\u7684\u503c\u662f\u5728\u524d\u4e00\u4e2a\u4efb\u52a1\u4e2d\u5728\u4e3b\u673a\u4e0a\u521b\u5efa\u7684\u7528\u6237\u540d\uff0c\u800ckey\u6307\u5411\u8981\u590d\u5236\u7684\u5bc6\u94a5\u3002\u8fd9\u4e24\u4e2a\u53d8\u91cf\u5728var\/default.yml\u6587\u4ef6\u4e2d\u5b9a\u4e49\u3002\u8fd9\u4e2a\u4efb\u52a1\u7684\u6548\u679c\u4e0e\u624b\u52a8\u8fd0\u884cssh-copy-id\u547d\u4ee4\u76f8\u540c\u3002<\/p>\n<h4>\u4efb\u52a17\uff1a\u7981\u6b62root\u7528\u6237\u7684\u8fdc\u7a0b\u767b\u5f55<\/h4>\n<p>\u5728\u624b\u518c\u4e2d\u7684\u7b2c\u4e03\u4e2a\u4efb\u52a1\u662f\u7981\u7528\u6839\u7528\u6237\u7684\u8fdc\u7a0b\u767b\u5f55\u3002<\/p>\n<div>\u521d\u59cb.yml<\/div>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">...<\/span>\r\n<span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> <mark>Disable remote login for root<\/mark>\r\n  <span class=\"token key atrule\">ansible.builtin.lineinfile<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">path<\/span><span class=\"token punctuation\">:<\/span> \/etc\/ssh\/sshd_config\r\n    <span class=\"token key atrule\">state<\/span><span class=\"token punctuation\">:<\/span> present\r\n    <span class=\"token key atrule\">regexp<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">'^PermitRootLogin yes'<\/span>\r\n    <span class=\"token key atrule\">line<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">'PermitRootLogin no'<\/span>\r\n<span class=\"token punctuation\">...<\/span>\r\n<\/code><\/pre>\n<p>\u63a5\u4e0b\u6765\uff0c\u60a8\u8c03\u7528ansible.builtin.lineinfile\u6a21\u5757\u3002\u6b64\u4efb\u52a1\u4f7f\u7528\u6b63\u5219\u8868\u8fbe\u5f0f\uff08regexp\uff09\u5728\/etc\/ssh\/sshd_config\u6587\u4ef6\u4e2d\u67e5\u627e\u4ee5PermitRootLogin\u5f00\u5934\u7684\u884c\uff0c\u5e76\u7528line\u7684\u503c\u8fdb\u884c\u66ff\u6362\u3002\u6b64\u4efb\u52a1\u786e\u4fdd\u5728\u8fd0\u884c\u6b64playbook\u540e\uff0c\u65e0\u6cd5\u901a\u8fc7root\u8d26\u6237\u8fdb\u884c\u8fdc\u7a0b\u767b\u5f55\u3002\u53ea\u6709\u901a\u8fc7\u4efb\u52a16\u521b\u5efa\u7684\u7528\u6237\u8d26\u6237\u624d\u80fd\u6210\u529f\u8fdc\u7a0b\u767b\u5f55\u3002\u901a\u8fc7\u7981\u7528\u8fdc\u7a0broot\u767b\u5f55\uff0c\u60a8\u786e\u4fdd\u53ea\u6709\u666e\u901a\u7528\u6237\u624d\u80fd\u767b\u5f55\uff0c\u5e76\u4e14\u9700\u8981\u7279\u6743\u5347\u7ea7\u65b9\u6cd5\uff08\u901a\u5e38\u662fsudo\uff09\u624d\u80fd\u83b7\u53d6\u7ba1\u7406\u5458\u6743\u9650\u3002<\/p>\n<h4>\u4efb\u52a18\uff1a\u66f4\u6539SSH\u7aef\u53e3<\/h4>\n<p>\u7b2c\u516b\u4e2a\u4efb\u52a1\u5728\u624b\u518c\u4e2d\u6539\u53d8\u4e86SSH\u7aef\u53e3\u3002<\/p>\n<div>\u6700\u521d\u7684.yml\u6587\u4ef6<\/div>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">...<\/span>\r\n<span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Change the SSH port\r\n  <span class=\"token key atrule\">ansible.builtin.lineinfile<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">path<\/span><span class=\"token punctuation\">:<\/span> \/etc\/ssh\/sshd_config\r\n    <span class=\"token key atrule\">state<\/span><span class=\"token punctuation\">:<\/span> present\r\n    <span class=\"token key atrule\">regexp<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">'^#Port 22'<\/span>\r\n    <span class=\"token key atrule\">line<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">'Port \"{{ ssh_port }}\"'<\/span>\r\n<span class=\"token punctuation\">...<\/span>\r\n<\/code><\/pre>\n<p>\u56e0\u4e3aSSH\u4fa6\u542c\u5728\u4f17\u6240\u5468\u77e5\u7684\u7aef\u53e322\u4e0a\uff0c\u6240\u4ee5\u5b83\u5f80\u5f80\u5bb9\u6613\u53d7\u5230\u9488\u5bf9\u8be5\u7aef\u53e3\u7684\u81ea\u52a8\u5316\u653b\u51fb\u3002\u901a\u8fc7\u66f4\u6539SSH\u4fa6\u542c\u7684\u7aef\u53e3\uff0c\u53ef\u4ee5\u51cf\u5c11\u5bf9\u4e3b\u673a\u7684\u81ea\u52a8\u5316\u653b\u51fb\u6b21\u6570\u3002\u6b64\u4efb\u52a1\u4f7f\u7528\u76f8\u540c\u7684ansible.builtin.lineinfile\u6a21\u5757\uff0c\u5728SSH\u5b88\u62a4\u7a0b\u5e8f\u7684\u914d\u7f6e\u6587\u4ef6\u4e2d\u641c\u7d22\u4ee5\u6b63\u5219\u8868\u8fbe\u5f0f\u5f00\u5934\u7684\u884c\uff0c\u5e76\u5c06\u5176\u503c\u66f4\u6539\u4e3aline\u53c2\u6570\u7684\u503c\u3002 SSH\u4fa6\u542c\u7684\u65b0\u7aef\u53e3\u53f7\u5c06\u662f\u60a8\u5728\u7b2c4\u6b65\u4e2d\u5206\u914d\u7ed9ssh_port\u53d8\u91cf\u7684\u7aef\u53e3\u53f7\u3002\u5728\u6b64\u64ad\u653e\u7ed3\u675f\u65f6\u91cd\u65b0\u542f\u52a8\u4e3b\u673a\u540e\uff0c\u5c06\u65e0\u6cd5\u901a\u8fc7\u7aef\u53e322\u767b\u5f55\u4e3b\u673a\u3002<\/p>\n<h4>\u4efb\u52a19: UFW &#8211; \u5141\u8bb8SSH\u8fde\u63a5<\/h4>\n<p>\u5728\u64ad\u653e\u624b\u518c\u4e2d\u7684\u7b2c\u4e5d\u4e2a\u4efb\u52a1\u5141\u8bb8SSH\u6d41\u91cf\u901a\u8fc7\u3002<\/p>\n<div>\u6700\u521d\u7684.yml\u6587\u4ef6\u3002<\/div>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">...<\/span>\r\n<span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> <mark>UFW <span class=\"token punctuation\">-<\/span> Allow SSH connections<\/mark>\r\n  <span class=\"token key atrule\">community.general.ufw<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">rule<\/span><span class=\"token punctuation\">:<\/span> allow\r\n    <span class=\"token key atrule\">port<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"{{ ssh_port }}\"<\/span>\r\n<span class=\"token punctuation\">...<\/span>\r\n<\/code><\/pre>\n<p>\u5728\u8fd9\u91cc\uff0c\u60a8\u8c03\u7528 community.general.ufw \u6a21\u5757\u6765\u5141\u8bb8 SSH \u6d41\u91cf\u901a\u8fc7\u9632\u706b\u5899\u3002\u8bf7\u6ce8\u610f\uff0cSSH \u7684\u7aef\u53e3\u53f7\u4e0d\u662f 22\uff0c\u800c\u662f\u60a8\u5728\u7b2c\u56db\u6b65\u7684 vars\/default.yml \u6587\u4ef6\u4e2d\u6307\u5b9a\u7684\u81ea\u5b9a\u4e49\u7aef\u53e3\u53f7\u3002\u6b64\u4efb\u52a1\u76f8\u5f53\u4e8e\u624b\u52a8\u8fd0\u884c ufw allow 5995\/tcp \u547d\u4ee4\u3002<\/p>\n<h4>\u4efb\u52a110\uff1aSSH\u7684\u86ee\u529b\u653b\u51fb\u9632\u62a4<\/h4>\n<p>\u7b2c\u5341\u4e2a\u4efb\u52a1\u662f\u9632\u8303\u66b4\u529b\u7834\u89e3\u653b\u51fb\u3002<\/p>\n<div>initial.yml \u7684\u521d\u59cb\u914d\u7f6e\u6587\u4ef6\u3002<\/div>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">...<\/span>\r\n<span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> <mark>Brute<span class=\"token punctuation\">-<\/span>force attempt protection for SSH<\/mark>\r\n  <span class=\"token key atrule\">community.general.ufw<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">rule<\/span><span class=\"token punctuation\">:<\/span> limit\r\n    <span class=\"token key atrule\">port<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"{{ ssh_port }}\"<\/span>\r\n    <span class=\"token key atrule\">proto<\/span><span class=\"token punctuation\">:<\/span> tcp\r\n<span class=\"token punctuation\">...<\/span>\r\n<\/code><\/pre>\n<p>\u518d\u6b21\u8c03\u7528community.general.ufw\u6a21\u5757\uff0c\u6b64\u4efb\u52a1\u4f7f\u7528\u901f\u7387\u9650\u5236\u89c4\u5219\uff0c\u572830\u79d2\u7684\u65f6\u95f4\u8303\u56f4\u5185\u62d2\u7edd\u8fde\u63a5\u5230SSH\u7aef\u53e3\u7684IP\u5730\u5740\uff0c\u5982\u679c\u8fde\u63a5\u5c1d\u8bd5\u5931\u8d25\u4e86\u516d\u6b21\u6216\u66f4\u591a\u6b21\u3002proto\u53c2\u6570\u6307\u5411\u76ee\u6807\u534f\u8bae\uff08\u5728\u672c\u4f8b\u4e2d\u4e3aTCP\uff09\u3002<\/p>\n<h4>\u4efb\u52a111\uff1aUFW &#8211; \u7981\u6b62\u5176\u4ed6\u7684\u4f20\u5165\u6d41\u91cf\u5e76\u542f\u7528UFW\u3002<\/h4>\n<p>\u7b2c\u5341\u4e00\u9879\u4efb\u52a1\u4f7f\u9632\u706b\u5899\u542f\u7528\u3002<\/p>\n<div>\u521d\u59cb\u7684.yml<\/div>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">...<\/span>\r\n<span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> <mark>UFW <span class=\"token punctuation\">-<\/span> Deny other incoming traffic and enable UFW<\/mark>\r\n  <span class=\"token key atrule\">community.general.ufw<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">state<\/span><span class=\"token punctuation\">:<\/span> enabled\r\n    <span class=\"token key atrule\">policy<\/span><span class=\"token punctuation\">:<\/span> deny\r\n    <span class=\"token key atrule\">direction<\/span><span class=\"token punctuation\">:<\/span> incoming\r\n<span class=\"token punctuation\">...<\/span>\r\n<\/code><\/pre>\n<p>\u5728\u8fd9\u4e2a\u4efb\u52a1\u4e2d\uff0c\u4ecd\u7136\u4f9d\u8d56\u4e8ecommunity.general.ufw\u6a21\u5757\uff0c\u4f60\u53ef\u4ee5\u542f\u7528\u9632\u706b\u5899\uff08\u72b6\u6001\uff1a\u542f\u7528\uff09\u5e76\u8bbe\u7f6e\u9ed8\u8ba4\u7b56\u7565\uff0c\u62d2\u7edd\u6240\u6709\u4f20\u5165\u7684\u6d41\u91cf\u3002<\/p>\n<h4>\u4efb\u52a112\uff1a\u5220\u9664\u4e0d\u518d\u9700\u8981\u7684\u4f9d\u8d56\u9879\u3002<\/h4>\n<p>\u5728\u8fd9\u4e2a\u5267\u4e2d\u7684\u7b2c\u5341\u4e8c\u4e2a\u4efb\u52a1\u662f\u6e05\u7406\u8f6f\u4ef6\u5305\u7684\u4f9d\u8d56\u5173\u7cfb\u3002<\/p>\n<div>\u6700\u521d\u7684.yml<\/div>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">...<\/span>\r\n<span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> <mark>Remove dependencies that are no longer required<\/mark>\r\n  <span class=\"token key atrule\">ansible.builtin.apt<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">autoremove<\/span><span class=\"token punctuation\">:<\/span> yes\r\n<span class=\"token punctuation\">...<\/span>\r\n<\/code><\/pre>\n<p>\u901a\u8fc7\u518d\u6b21\u8c03\u7528ansible.builtin.apt\u6a21\u5757\uff0c\u6b64\u4efb\u52a1\u5c06\u5220\u9664\u670d\u52a1\u5668\u4e0a\u4e0d\u518d\u9700\u8981\u7684\u8f6f\u4ef6\u5305\u4f9d\u8d56\u5173\u7cfb\uff0c\u8fd9\u76f8\u5f53\u4e8e\u624b\u52a8\u8fd0\u884csudo apt autoremove\u547d\u4ee4\u3002<\/p>\n<h4>\u4efb\u52a113\uff1a\u91cd\u65b0\u542f\u52a8SSH\u5b88\u62a4\u7a0b\u5e8f<\/h4>\n<p>\u5728\u8fd9\u672c\u64cd\u4f5c\u624b\u518c\u4e2d\uff0c\u7b2c\u5341\u4e09\u4e2a\u4efb\u52a1\u662f\u91cd\u65b0\u542f\u52a8SSH\u3002<\/p>\n<div>\u9996\u5148.yml<\/div>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">...<\/span>\r\n<span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> <mark>Restart the SSH daemon<\/mark>\r\n  <span class=\"token key atrule\">ansible.builtin.systemd<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">state<\/span><span class=\"token punctuation\">:<\/span> restarted\r\n    <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> ssh\r\n<\/code><\/pre>\n<p>\u6700\u540e\u7684\u4efb\u52a1\u8c03\u7528ansible.builtin.systemd\u6a21\u5757\u6765\u91cd\u65b0\u542f\u52a8SSH\u5b88\u62a4\u7a0b\u5e8f\u3002\u5fc5\u987b\u91cd\u65b0\u542f\u52a8\u5b88\u62a4\u7a0b\u5e8f\u4ee5\u4f7f\u5bf9\u5b88\u62a4\u7a0b\u5e8f\u914d\u7f6e\u6587\u4ef6\u6240\u505a\u7684\u66f4\u6539\u751f\u6548\u3002\u8fd9\u4e2a\u4efb\u52a1\u4e0e\u4f7f\u7528sudo systemctl restart ssh\u91cd\u65b0\u542f\u52a8\u5b88\u62a4\u7a0b\u5e8f\u5177\u6709\u76f8\u540c\u7684\u6548\u679c\u3002<\/p>\n<p>\u6700\u5f00\u59cb\u901a\u8fc722\u53f7\u7aef\u53e3\u4f5c\u4e3a\u8d85\u7ea7\u7ba1\u7406\u5458\u8eab\u4efd\uff08root\uff09\u8fde\u63a5\u5230\u4e3b\u673a\uff0c\u4f46\u524d\u9762\u7684\u4efb\u52a1\u5df2\u7ecf\u6539\u53d8\u4e86\u7aef\u53e3\u53f7\u5e76\u7981\u7528\u4e86\u8fdc\u7a0broot\u767b\u5f55\u3002\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\u5728\u6b64\u9636\u6bb5\u60a8\u9700\u8981\u91cd\u65b0\u542f\u52a8SSH\u5b88\u62a4\u7a0b\u5e8f\u7684\u539f\u56e0\u3002\u7b2c\u4e8c\u4e2a\u9636\u6bb5\u5c06\u4f7f\u7528\u4e0d\u540c\u7684\u8fde\u63a5\u51ed\u636e\uff08\u7528\u6237\u540d\u4ee3\u66ffroot\u548c\u65b0\u5b9a\u4e49\u7684\u975e22\u53f7\u7aef\u53e3\u53f7\uff09\u3002<\/p>\n<h3>\u8fdb\u884c\u6e38\u620f2\uff1a\u5728\u521d\u59cb\u8bbe\u7f6e\u540e\u91cd\u65b0\u542f\u52a8\u4e3b\u673a<\/h3>\n<p>\u8fd9\u4e2a\u5267\u672c\u5728\u7b2c\u4e00\u573a\u5267\u4e2d\u7684\u6700\u540e\u4e00\u4e2a\u4efb\u52a1\u6210\u529f\u5b8c\u6210\u540e\u5f00\u59cb\u3002\u5b83\u53d7\u4ee5\u4e0b\u5173\u952e\u5b57\u7684\u5f71\u54cd\uff1a<\/p>\n<div>\u9664\u4e86\u521d\u8bd5\u9636\u6bb5\u7684checkbox\u9ed8\u8ba4\u503c\u6ca1\u6709\u88ab\u4fee\u6539\u5916\uff0c\u5176\u4ed6\u914d\u7f6e\u6587\u4ef6\u5747\u6ca1\u6709\u4fee\u6539\u3002<\/div>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">...<\/span>\r\n<span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> <mark>Rebooting hosts after initial setup<\/mark>\r\n  <span class=\"token key atrule\">hosts<\/span><span class=\"token punctuation\">:<\/span> initial\r\n  <span class=\"token key atrule\">port<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"{{ ssh_port }}\"<\/span>\r\n  <span class=\"token key atrule\">remote_user<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"{{ create_user }}\"<\/span>\r\n  <span class=\"token key atrule\">become<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">true<\/span>\r\n  <span class=\"token key atrule\">vars_files<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token punctuation\">-<\/span> vars\/default.yml\r\n    <span class=\"token punctuation\">-<\/span> ~\/secret\r\n  <span class=\"token key atrule\">vars<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">ansible_become_pass<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"{{ password }}\"<\/span>\r\n<span class=\"token punctuation\">...<\/span>\r\n<\/code><\/pre>\n<p>\u4f20\u9012\u7ed9hosts\u5173\u952e\u5b57\u7684\u6a21\u5f0f\u662f\u5728\u7b2c\u4e8c\u6b65\u4e2d\u5728\/etc\/ansible\/hosts\u6587\u4ef6\u4e2d\u6307\u5b9a\u7684\u521d\u59cb\u7ec4\u540d\u3002\u56e0\u4e3a\u60a8\u5c06\u65e0\u6cd5\u518d\u4f7f\u7528\u9ed8\u8ba4\u7684SSH\u7aef\u53e322\u767b\u5f55\u5230\u4e3b\u673a\uff0c\u6240\u4ee5\u7aef\u53e3\u5173\u952e\u5b57\u6307\u5411\u5728\u7b2c\u56db\u6b65\u914d\u7f6e\u7684\u81ea\u5b9a\u4e49SSH\u7aef\u53e3\u3002<\/p>\n<p>\u5728\u7b2c\u4e00\u6b21\u64ad\u653e\u4e2d\uff0cAnsible\u63a7\u5236\u5668\u4ee5root\u7528\u6237\u8eab\u4efd\u767b\u5f55\u5230\u4e3b\u673a\u4e0a\u3002\u901a\u8fc7\u7b2c\u4e00\u6b21\u64ad\u653e\u7981\u7528\u4e86\u8fdc\u7a0broot\u767b\u5f55\uff0c\u73b0\u5728\u60a8\u9700\u8981\u6307\u5b9aAnsible\u63a7\u5236\u5668\u5e94\u4ee5\u54ea\u4e2a\u7528\u6237\u8eab\u4efd\u767b\u5f55\u3002remote_user\u5173\u952e\u5b57\u6307\u793aAnsible\u63a7\u5236\u5668\u4ee5\u5728\u7b2c\u4e00\u6b21\u64ad\u653e\u7684\u7b2c5\u4e2a\u4efb\u52a1\u521b\u5efa\u7684sudo\u7528\u6237\u8eab\u4efd\u767b\u5f55\u5230\u6bcf\u4e2a\u4e3b\u673a\u4e0a\u3002<\/p>\n<p>&#8220;\u4f7f\u7528become\u5173\u952e\u5b57\u6307\u5b9a\u5728\u6307\u5b9a\u7684\u4e3b\u673a\u4e0a\u6267\u884c\u4efb\u52a1\u65f6\u4f7f\u7528\u7279\u6743\u5347\u7ea7\u3002\u8be5\u5173\u952e\u5b57\u6307\u793aAnsible\u63a7\u5236\u5668\u5728\u9700\u8981\u65f6\u4ee5root\u7279\u6743\u6267\u884c\u4e3b\u673a\u4e0a\u7684\u4efb\u52a1\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u63a7\u5236\u5668\u5c06\u4f7f\u7528sudo\u5047\u8bberoot\u7279\u6743\u3002ansible_become_pass\u5173\u952e\u5b57\u8bbe\u7f6e\u7279\u6743\u5347\u7ea7\u5bc6\u7801\uff0c\u8fd9\u662f\u7528\u4e8e\u5047\u8bberoot\u7279\u6743\u7684\u5bc6\u7801\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u5b83\u6307\u5411\u4f7f\u7528Ansible Vault\u5728\u7b2c5\u6b65\u4e2d\u914d\u7f6e\u7684\u5bc6\u7801\u53d8\u91cf\u3002&#8221;<\/p>\n<p>\u9664\u4e86\u6307\u5411 vars\/default.yml \u6587\u4ef6\u5916\uff0cvars_files \u5173\u952e\u5b57\u8fd8\u6307\u5411\u60a8\u5728\u7b2c5\u6b65\u4e2d\u914d\u7f6e\u7684\u79d8\u5bc6\u6587\u4ef6\uff0c\u8be5\u6587\u4ef6\u544a\u8bc9 Ansible \u63a7\u5236\u5668\u5728\u54ea\u91cc\u627e\u5230\u5bc6\u7801\u53d8\u91cf\u3002<\/p>\n<p>\u5728\u5173\u952e\u5b57\u90e8\u5206\u4e4b\u540e\uff0c\u5c06\u6267\u884c\u8fd9\u4e2a\u5267\u672c\u4e2d\u552f\u4e00\u7684\u4efb\u52a1\u3002<\/p>\n<h4>\u4efb\u52a114\uff1a\u91cd\u542f\u6240\u6709\u4e3b\u673a\u3002<\/h4>\n<div class=\"post-conf-note\">\n<p class=\"post-note\">\n<p class=\"post-conf-desc\">Note<\/p>\n<div>\u6ce8\u610f\uff1a\u867d\u7136\u8fd9\u662f\u7b2c\u4e8c\u4e2a\u5267\u672c\u7684\u7b2c\u4e00\u4e2a\u4efb\u52a1\uff0c\u4f46\u7f16\u53f7\u4e3a\u4efb\u52a114\uff0c\u56e0\u4e3aAnsible\u63a7\u5236\u5668\u5c06\u5176\u89c6\u4e3aPlay 2\u7684Task 1\uff0c\u800c\u4e0d\u662fplaybook\u7684Task 14\u3002<\/div>\n<\/div>\n<p>\u64ad\u653e\u624b\u518c\u7684\u6700\u540e\u4e00\u4e2a\u4efb\u52a1\u5c06\u91cd\u65b0\u542f\u52a8\u6240\u6709\u4e3b\u673a\u3002<\/p>\n<div>\u521d\u59cb.yml<\/div>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">...<\/span>\r\n<span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> <mark>Reboot all hosts<\/mark>\r\n  <span class=\"token key atrule\">ansible.builtin.reboot<\/span><span class=\"token punctuation\">:<\/span>\r\n<\/code><\/pre>\n<p>\u5728\u5b8c\u6210\u9996\u6b21\u64cd\u4f5c\u540e\u91cd\u542f\u4e3b\u673a\uff0c\u5373\u53ef\u4f7f\u5185\u6838\u6216\u5e93\u7684\u4efb\u4f55\u66f4\u65b0\u5728\u60a8\u5f00\u59cb\u5b89\u88c5\u5e94\u7528\u7a0b\u5e8f\u4e4b\u524d\u751f\u6548\u3002<\/p>\n<p>\u5b8c\u6574\u7684\u5267\u672c\u6587\u4ef6\u5982\u4e0b\u6240\u793a\uff1a<\/p>\n<div>\u521d\u59cb.yml<\/div>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Initial server setup tasks\r\n  <span class=\"token key atrule\">hosts<\/span><span class=\"token punctuation\">:<\/span> initial\r\n  <span class=\"token key atrule\">remote_user<\/span><span class=\"token punctuation\">:<\/span> root\r\n  <span class=\"token key atrule\">vars_files<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token punctuation\">-<\/span> vars\/default.yml\r\n    <span class=\"token punctuation\">-<\/span> secret\r\n\r\n  <span class=\"token key atrule\">tasks<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> update cache\r\n      <span class=\"token key atrule\">ansible.builtin.apt<\/span><span class=\"token punctuation\">:<\/span>\r\n        <span class=\"token key atrule\">update_cache<\/span><span class=\"token punctuation\">:<\/span> yes\r\n\r\n    <span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Update all installed packages\r\n      <span class=\"token key atrule\">ansible.builtin.apt<\/span><span class=\"token punctuation\">:<\/span>\r\n        <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"*\"<\/span>\r\n        <span class=\"token key atrule\">state<\/span><span class=\"token punctuation\">:<\/span> latest\r\n\r\n    <span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Make sure NTP service is running\r\n      <span class=\"token key atrule\">ansible.builtin.systemd<\/span><span class=\"token punctuation\">:<\/span>\r\n        <span class=\"token key atrule\">state<\/span><span class=\"token punctuation\">:<\/span> started\r\n        <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> systemd<span class=\"token punctuation\">-<\/span>timesyncd\r\n\r\n    <span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Make sure we have a 'sudo' group\r\n      <span class=\"token key atrule\">ansible.builtin.group<\/span><span class=\"token punctuation\">:<\/span>\r\n        <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> sudo\r\n        <span class=\"token key atrule\">state<\/span><span class=\"token punctuation\">:<\/span> present\r\n\r\n    <span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Create a user with sudo privileges\r\n      <span class=\"token key atrule\">ansible.builtin.user<\/span><span class=\"token punctuation\">:<\/span>\r\n        <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"{{ create_user }}\"<\/span>\r\n        <span class=\"token key atrule\">state<\/span><span class=\"token punctuation\">:<\/span> present\r\n        <span class=\"token key atrule\">groups<\/span><span class=\"token punctuation\">:<\/span> sudo\r\n        <span class=\"token key atrule\">append<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">true<\/span>\r\n        <span class=\"token key atrule\">create_home<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">true<\/span>\r\n        <span class=\"token key atrule\">shell<\/span><span class=\"token punctuation\">:<\/span> \/bin\/bash\r\n        <span class=\"token key atrule\">password<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"{{ password | password_hash('sha512', password_salt) }}\"<\/span>\r\n        <span class=\"token key atrule\">update_password<\/span><span class=\"token punctuation\">:<\/span> on_create\r\n\r\n    <span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Set authorized key for remote user\r\n      <span class=\"token key atrule\">ansible.builtin.authorized_key<\/span><span class=\"token punctuation\">:<\/span>\r\n        <span class=\"token key atrule\">user<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"{{ create_user }}\"<\/span>\r\n        <span class=\"token key atrule\">state<\/span><span class=\"token punctuation\">:<\/span> present\r\n        <span class=\"token key atrule\">key<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"{{ copy_local_key }}\"<\/span>\r\n\r\n    <span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Disable remote login for root\r\n      <span class=\"token key atrule\">ansible.builtin.lineinfile<\/span><span class=\"token punctuation\">:<\/span>\r\n        <span class=\"token key atrule\">path<\/span><span class=\"token punctuation\">:<\/span> \/etc\/ssh\/sshd_config\r\n        <span class=\"token key atrule\">state<\/span><span class=\"token punctuation\">:<\/span> present\r\n        <span class=\"token key atrule\">regexp<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">'^PermitRootLogin yes'<\/span>\r\n        <span class=\"token key atrule\">line<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">'PermitRootLogin no'<\/span>\r\n\r\n    <span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Change the SSH port\r\n      <span class=\"token key atrule\">ansible.builtin.lineinfile<\/span><span class=\"token punctuation\">:<\/span>\r\n        <span class=\"token key atrule\">path<\/span><span class=\"token punctuation\">:<\/span> \/etc\/ssh\/sshd_config\r\n        <span class=\"token key atrule\">state<\/span><span class=\"token punctuation\">:<\/span> present\r\n        <span class=\"token key atrule\">regexp<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">'^#Port 22'<\/span>\r\n        <span class=\"token key atrule\">line<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">'Port \"{{ ssh_port }}\"'<\/span>\r\n\r\n    <span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> UFW <span class=\"token punctuation\">-<\/span> Allow SSH connections\r\n      <span class=\"token key atrule\">community.general.ufw<\/span><span class=\"token punctuation\">:<\/span>\r\n        <span class=\"token key atrule\">rule<\/span><span class=\"token punctuation\">:<\/span> allow\r\n        <span class=\"token key atrule\">port<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"{{ ssh_port }}\"<\/span>\r\n\r\n    <span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Brute<span class=\"token punctuation\">-<\/span>force attempt protection for SSH\r\n      <span class=\"token key atrule\">community.general.ufw<\/span><span class=\"token punctuation\">:<\/span>\r\n        <span class=\"token key atrule\">rule<\/span><span class=\"token punctuation\">:<\/span> limit\r\n        <span class=\"token key atrule\">port<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"{{ ssh_port }}\"<\/span>\r\n        <span class=\"token key atrule\">proto<\/span><span class=\"token punctuation\">:<\/span> tcp\r\n\r\n    <span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> UFW <span class=\"token punctuation\">-<\/span> Deny other incoming traffic and enable UFW\r\n      <span class=\"token key atrule\">community.general.ufw<\/span><span class=\"token punctuation\">:<\/span>\r\n        <span class=\"token key atrule\">state<\/span><span class=\"token punctuation\">:<\/span> enabled\r\n        <span class=\"token key atrule\">policy<\/span><span class=\"token punctuation\">:<\/span> deny\r\n        <span class=\"token key atrule\">direction<\/span><span class=\"token punctuation\">:<\/span> incoming\r\n\r\n    <span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Remove dependencies that are no longer required\r\n      <span class=\"token key atrule\">ansible.builtin.apt<\/span><span class=\"token punctuation\">:<\/span>\r\n        <span class=\"token key atrule\">autoremove<\/span><span class=\"token punctuation\">:<\/span> yes\r\n\r\n    <span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Restart the SSH daemon\r\n      <span class=\"token key atrule\">ansible.builtin.systemd<\/span><span class=\"token punctuation\">:<\/span>\r\n        <span class=\"token key atrule\">state<\/span><span class=\"token punctuation\">:<\/span> restarted\r\n        <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> ssh\r\n\r\n<span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Rebooting hosts after initial setup\r\n  <span class=\"token key atrule\">hosts<\/span><span class=\"token punctuation\">:<\/span> initial\r\n  <span class=\"token key atrule\">port<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"{{ ssh_port }}\"<\/span>\r\n  <span class=\"token key atrule\">remote_user<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"{{ create_user }}\"<\/span>\r\n  <span class=\"token key atrule\">become<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">true<\/span>\r\n  <span class=\"token key atrule\">vars_files<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token punctuation\">-<\/span> vars\/default.yml\r\n    <span class=\"token punctuation\">-<\/span> secret\r\n  <span class=\"token key atrule\">vars<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">ansible_become_pass<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"{{ password }}\"<\/span>\r\n\r\n  <span class=\"token key atrule\">tasks<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Reboot all hosts\r\n      <span class=\"token key atrule\">ansible.builtin.reboot<\/span><span class=\"token punctuation\">:<\/span>\r\n<\/code><\/pre>\n<p>\u5f53\u5b8c\u6210\u5bf9\u6587\u4ef6\u7684\u5ba1\u6838\u540e\uff0c\u4fdd\u5b58\u5e76\u5173\u95ed\u5b83\u3002<\/p>\n<div class=\"post-conf-note\">\n<p class=\"post-note\">\n<p class=\"post-conf-desc\">Note<\/p>\n<div>\u6ce8\u610f\uff1a\u60a8\u53ef\u4ee5\u5411playbook\u4e2d\u6dfb\u52a0\u65b0\u4efb\u52a1\u6216\u4fee\u6539\u73b0\u6709\u4efb\u52a1\u3002\u4f46\u662f\uff0c\u66f4\u6539YAML\u6587\u4ef6\u53ef\u80fd\u4f1a\u635f\u574f\u5b83\uff0c\u56e0\u4e3aYAML\u5bf9\u7f29\u8fdb\u975e\u5e38\u654f\u611f\uff0c\u6240\u4ee5\u5982\u679c\u9009\u62e9\u7f16\u8f91\u6587\u4ef6\u7684\u4efb\u4f55\u65b9\u9762\uff0c\u8bf7\u5c0f\u5fc3\u64cd\u4f5c\u3002\u6709\u5173\u5982\u4f55\u7f16\u5199Ansible playbooks\u7684\u66f4\u591a\u4fe1\u606f\uff0c\u8bf7\u5173\u6ce8\u6211\u4eec\u7684\u7cfb\u5217\u6587\u7ae0\u300a\u5982\u4f55\u7f16\u5199Ansible Playbooks\u300b\u3002<\/div>\n<\/div>\n<p>\u73b0\u5728\u60a8\u53ef\u4ee5\u8fd0\u884c\u8fd9\u4e2a\u5267\u672c\u3002\u9996\u5148\uff0c\u68c0\u67e5\u8bed\u6cd5\u3002<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\">ansible-playbook --syntax-check --ask-vault-pass <mark>initial.yml<\/mark>\r\n<\/li><\/ol>\r\n<\/code><\/pre>\n<p>\u5728\u7b2c5\u6b65\u4e2d\uff0c\u60a8\u5c06\u88ab\u63d0\u793a\u8f93\u5165\u60a8\u521b\u5efa\u7684\u4fdd\u9669\u5e93\u5bc6\u7801\u3002\u5982\u679c\u9a8c\u8bc1\u6210\u529f\u540e\u6ca1\u6709YAML\u8bed\u6cd5\u9519\u8bef\uff0c\u8f93\u51fa\u7ed3\u679c\u5c06\u662f\uff1a<\/p>\n<pre class=\"post-pre\"><code><div class=\"secondary-code-label\" title=\"Output\">Output<\/div>playbook: <mark>initial.yml<\/mark>\r\n<\/code><\/pre>\n<p>\u60a8\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u8fd0\u884c\u8be5\u6587\u4ef6\uff1a<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\">ansible-playbook --ask-vault-pass <mark>initial.yml<\/mark>\r\n<\/li><\/ol>\r\n<\/code><\/pre>\n<p>\u4f60\u5c06\u518d\u6b21\u88ab\u8981\u6c42\u8f93\u5165\u4fdd\u9669\u5e93\u5bc6\u7801\u3002\u5728\u6210\u529f\u9a8c\u8bc1\u540e\uff0cAnsible\u63a7\u5236\u5668\u5c06\u4ee5root\u7528\u6237\u8eab\u4efd\u767b\u5f55\u6bcf\u4e2a\u4e3b\u673a\uff0c\u5e76\u6267\u884cplaybook\u4e2d\u7684\u6240\u6709\u4efb\u52a1\u3002\u4e0e\u5176\u5728\u6bcf\u4e2a\u670d\u52a1\u5668\u4e0a\u5206\u522b\u8fd0\u884cssh root@node-ip-address\u547d\u4ee4\uff0cAnsible\u4f1a\u8fde\u63a5\u5230\/etc\/ansible\/hosts\u4e2d\u6307\u5b9a\u7684\u6240\u6709\u8282\u70b9\uff0c\u7136\u540e\u6267\u884cplaybook\u4e2d\u7684\u4efb\u52a1\u3002<\/p>\n<p>\u5728\u672c\u6559\u7a0b\u7684\u793a\u4f8b\u4e3b\u673a\u4e0a\uff0cAnsible\u5927\u7ea6\u9700\u8981\u4e09\u5206\u949f\u6765\u5b8c\u6210\u8de8\u4e09\u4e2a\u4e3b\u673a\u7684\u4efb\u52a1\u3002\u4efb\u52a1\u5b8c\u6210\u540e\uff0c\u60a8\u5c06\u6536\u5230\u4ee5\u4e0b\u8f93\u51fa\uff1a<\/p>\n<pre class=\"post-pre\"><code><div class=\"secondary-code-label\" title=\"Output\">Output<\/div>PLAY RECAP *****************************************************************************************************\r\n<mark>host1<\/mark>   : ok=16   changed=11    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   \r\n<mark>host2<\/mark>   : ok=16   changed=11    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   \r\n<mark>host3<\/mark>   : ok=16   changed=11    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0\r\n<\/code><\/pre>\n<p>\u6bcf\u4e2a\u6210\u529f\u8bc4\u4f30\u7684\u4efb\u52a1\u548c\u73a9\u95f9\u5173\u952e\u5b57\u90e8\u5206\u90fd\u5c06\u8ba1\u7b97\u5728&#8221;ok&#8221;\u5217\u7684\u6570\u91cf\u4e2d\u3002\u5728\u4e24\u4e2a\u6e38\u620f\u4e2d\u5171\u670914\u4e2a\u4efb\u52a1\uff0c\u5728\u6240\u6709\u8bc4\u4f30\u6210\u529f\u7684\u60c5\u51b5\u4e0b\uff0c\u603b\u6570\u4e3a16\u3002\u5728\u5df2\u8bc4\u4f30\u7684\u4efb\u52a1\u4e2d\uff0c\u53ea\u670911\u4e2a\u5bfc\u81f4\u670d\u52a1\u5668\u7684\u6539\u53d8\uff0c\u8868\u793a\u5728&#8221;changed&#8221;\u5217\u4e2d\u3002<\/p>\n<p>\u65e0\u6cd5\u8bbf\u95ee\u7684\u8ba1\u6570\u663e\u793a\u4e86Ansible\u63a7\u5236\u5668\u65e0\u6cd5\u767b\u5f55\u7684\u4e3b\u673a\u6570\u91cf\u3002\u6ca1\u6709\u4efb\u4f55\u4efb\u52a1\u5931\u8d25\uff0c\u56e0\u6b64\u5931\u8d25\u7684\u6570\u91cf\u4e3a0\u3002<\/p>\n<p>\u5f53\u4efb\u52a1\u4e2d\u6307\u5b9a\u7684\u6761\u4ef6\u4e0d\u6ee1\u8db3\u65f6\uff08\u901a\u5e38\u4f7f\u7528when\u53c2\u6570\uff09\uff0c\u4efb\u52a1\u5c06\u88ab\u8df3\u8fc7\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\u6ca1\u6709\u4efb\u52a1\u4f1a\u88ab\u8df3\u8fc7\uff0c\u4f46\u662f\u5728\u7b2c\u516b\u6b65\u4e2d\u5c06\u4f1a\u751f\u6548\u3002<\/p>\n<p>\u6700\u540e\u4e24\u5217\uff08\u5df2\u6551\u63f4\u548c\u5df2\u5ffd\u7565\uff09\u4e0e\u9488\u5bf9\u5267\u672c\u6216\u4efb\u52a1\u7684\u9519\u8bef\u5904\u7406\u76f8\u5173\u3002<\/p>\n<p>\u60a8\u73b0\u5728\u5df2\u6210\u529f\u4f7f\u7528Ansible\u81ea\u52a8\u5316\u4e86\u591a\u4e2aUbuntu 22.04\u670d\u52a1\u5668\u7684\u521d\u59cb\u670d\u52a1\u5668\u8bbe\u7f6e\uff0c\u53ea\u9700\u6267\u884c\u4e00\u6761\u547d\u4ee4\u5373\u53ef\u5b8c\u6210playbook\u4e2d\u6307\u5b9a\u7684\u6240\u6709\u4efb\u52a1\u3002<\/p>\n<p>\u4e3a\u4e86\u786e\u4fdd\u4e00\u5207\u5982\u9884\u671f\u822c\u5de5\u4f5c\u987a\u5229\uff0c\u63a5\u4e0b\u6765\u60a8\u5c06\u767b\u5f55\u5176\u4e2d\u4e00\u4e2a\u4e3b\u673a\u6765\u9a8c\u8bc1\u8bbe\u7f6e\u3002<\/p>\n<h2>\uff08\u53ef\u9009\uff09\u6b65\u9aa47 \u2014 \u624b\u52a8\u68c0\u67e5\u670d\u52a1\u5668\u8bbe\u7f6e<\/h2>\n<p>\u4e3a\u4e86\u786e\u8ba4\u524d\u4e00\u6b65\u9aa4\u7ed3\u675f\u65f6\u7684\u64ad\u653e\u603b\u7ed3\u8f93\u51fa\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528\u4e4b\u524d\u914d\u7f6e\u7684\u51ed\u636e\u767b\u5f55\u5230\u5176\u4e2d\u4e00\u53f0\u4e3b\u673a\uff0c\u4ee5\u9a8c\u8bc1\u8bbe\u7f6e\u3002\u51fa\u4e8e\u5b66\u4e60\u76ee\u7684\uff0c\u8fd9\u4e9b\u64cd\u4f5c\u662f\u53ef\u9009\u7684\uff0c\u56e0\u4e3aAnsible\u603b\u7ed3\u62a5\u544a\u4e86\u51c6\u786e\u7684\u5b8c\u6210\u60c5\u51b5\u3002<\/p>\n<p>\u9996\u5148\uff0c\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u767b\u5f55\u5230\u5176\u4e2d\u4e00\u4e2a\u4e3b\u673a\uff1a<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\"><span class=\"token function\">ssh<\/span> <span class=\"token parameter variable\">-p<\/span> <mark><span class=\"token number\">5995<\/span><\/mark> <mark>sammy<\/mark>@<mark>host1-public-ip-address<\/mark>\r\n<\/li><\/ol>\r\n<\/code><\/pre>\n<p>\u5728\u6b65\u9aa44\u4e2d\uff0c\u60a8\u4f7f\u7528\u201c -p\u201d\u9009\u9879\u6307\u5411\u60a8\u4e3aSSH\u914d\u7f6e\u7684\u81ea\u5b9a\u4e49\u7aef\u53e3\u53f7\uff085995\uff09\uff0c\u800c\u5728\u6b65\u9aa46\u4e2d\u521b\u5efa\u7684\u7528\u6237\u662fsammy\u3002\u5982\u679c\u60a8\u80fd\u591f\u901a\u8fc7\u8be5\u7aef\u53e3\u767b\u5f55\u5230\u4e3b\u673a\u5e76\u4f7f\u7528\u8be5\u7528\u6237\uff0c\u5c31\u8bf4\u660eAnsible\u6210\u529f\u5b8c\u6210\u4e86\u8fd9\u4e9b\u4efb\u52a1\u3002<\/p>\n<p>\u767b\u5f55\u540e\uff0c\u68c0\u67e5\u60a8\u662f\u5426\u80fd\u591f\u66f4\u65b0\u8f6f\u4ef6\u5305\u6570\u636e\u5e93\u3002<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\"><span class=\"token function\">sudo<\/span> <span class=\"token function\">apt<\/span> update\r\n<\/li><\/ol>\r\n<\/code><\/pre>\n<p>\u5982\u679c\u63d0\u793a\u8f93\u5165\u5bc6\u7801\uff0c\u5e76\u4e14\u4f60\u53ef\u4ee5\u7528\u5728\u7b2c5\u6b65\u4e2d\u8bbe\u7f6e\u7684\u5bc6\u7801\u8fdb\u884c\u9a8c\u8bc1\uff0c\u90a3\u4e48\u4f60\u53ef\u4ee5\u786e\u8ba4Ansible\u6210\u529f\u5b8c\u6210\u4e86\u521b\u5efa\u7528\u6237\u548c\u8bbe\u7f6e\u7528\u6237\u5bc6\u7801\u7684\u4efb\u52a1\u3002<\/p>\n<p>\u65e2\u7136\u4f60\u77e5\u9053\u5b89\u88c5\u624b\u518c\u7684\u64cd\u4f5c\u6210\u529f\u4e86\uff0c\u73b0\u5728\u4f60\u53ef\u4ee5\u8fd0\u884c\u7b2c\u4e8c\u672c\u624b\u518c\u8fdb\u884c\u6301\u7eed\u6027\u7ef4\u62a4\u3002<\/p>\n<h2>\uff08\u53ef\u9009\uff09\u7b2c\u516b\u6b65 &#8211; \u4f7f\u7528Ansible\u8fdb\u884c\u4e3b\u673a\u7684\u6301\u7eed\u7ef4\u62a4<\/h2>\n<p>\u5728\u7b2c6\u6b65\u4e2d\u6267\u884c\u7684\u521d\u59cb\u670d\u52a1\u5668\u8bbe\u7f6e\u64ad\u653e\u4e66\u5c06\u6839\u636e\u60a8\u7684\u9700\u6c42\u6269\u5c55\u5230\u4efb\u610f\u6570\u91cf\u7684\u670d\u52a1\u5668\uff0c\u4f46\u5728\u521d\u59cb\u8bbe\u7f6e\u4e4b\u540e\u65e0\u6cd5\u7ba1\u7406\u4e3b\u673a\u3002\u867d\u7136\u60a8\u53ef\u4ee5\u5206\u522b\u767b\u5f55\u6bcf\u53f0\u4e3b\u673a\u6765\u8fd0\u884c\u547d\u4ee4\uff0c\u4f46\u968f\u7740\u60a8\u540c\u65f6\u5904\u7406\u66f4\u591a\u670d\u52a1\u5668\uff0c\u6b64\u8fc7\u7a0b\u65e0\u6cd5\u6269\u5c55\u3002\u4f5c\u4e3a\u7b2c3\u6b65\u7684\u4e00\u90e8\u5206\uff0c\u60a8\u8fd8\u63d0\u53d6\u4e86\u4e00\u4e2aongoing.yml\u64ad\u653e\u4e66\uff0c\u53ef\u7528\u4e8e\u6301\u7eed\u7ef4\u62a4\u3002\u5728\u672c\u6b65\u9aa4\u4e2d\uff0c\u60a8\u5c06\u8fd0\u884congoing.yml\u64ad\u653e\u4e66\uff0c\u4ee5\u81ea\u52a8\u5316\u672c\u6559\u7a0b\u4e2d\u8bbe\u7f6e\u7684\u4e3b\u673a\u7684\u6301\u7eed\u7ef4\u62a4\u3002<\/p>\n<p>\u5728\u8fd0\u884cplaybook\u4e4b\u524d\uff0c\u60a8\u5c06\u4f1a\u67e5\u770b\u6bcf\u4e2a\u4efb\u52a1\u3002\u9996\u5148\uff0c\u4f7f\u7528nano\u6216\u60a8\u559c\u6b22\u7684\u6587\u672c\u7f16\u8f91\u5668\u6253\u5f00\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\"><span class=\"token function\">nano<\/span> ongoing.yml\r\n<\/li><\/ol>\r\n<\/code><\/pre>\n<p>\u4e0e\u6700\u521d\u7684\u8bbe\u7f6e\u624b\u518c\u4e0d\u540c\uff0c\u7ef4\u62a4\u624b\u518c\u53ea\u5305\u542b\u4e00\u4e2a\u64cd\u4f5c\u6b65\u9aa4\u548c\u8f83\u5c11\u7684\u4efb\u52a1\u3002<\/p>\n<h3>\u5267\u672c1: \u64ad\u653e\u6e38\u620f<\/h3>\n<p>\u6587\u4ef6\u7b2c\u4e00\u90e8\u5206\u4e2d\u7684\u4ee5\u4e0b\u5173\u952e\u8bcd\u4f1a\u5f71\u54cd\u620f\u5267\u7684\u884c\u4e3a\u65b9\u5f0f\uff1a<\/p>\n<div>\u6301\u7eed\u7684.yml<\/div>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">hosts<\/span><span class=\"token punctuation\">:<\/span> <mark>ongoing<\/mark>\r\n  <span class=\"token key atrule\">port<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"{{ ssh_port }}\"<\/span>\r\n  <span class=\"token key atrule\">remote_user<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"{{ create_user }}\"<\/span>\r\n  <span class=\"token key atrule\">become<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">true<\/span>\r\n  <span class=\"token key atrule\">vars_files<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token punctuation\">-<\/span> vars\/default.yml\r\n    <span class=\"token punctuation\">-<\/span> secret\r\n  <span class=\"token key atrule\">vars<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">ansible_become_pass<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"{{ password }}\"<\/span>\r\n<span class=\"token punctuation\">...<\/span>\r\n<\/code><\/pre>\n<p>\u9664\u4e86\u4f20\u9012\u7ed9&#8221;hosts&#8221;\u5173\u952e\u5b57\u7684\u7ec4\u5916\uff0c\u8fd9\u4e9b\u5173\u952e\u5b57\u4e0e\u8bbe\u7f6eplaybook\u7684\u7b2c\u4e8c\u4e2a\u4efb\u52a1\u4e2d\u4f7f\u7528\u7684\u5173\u952e\u5b57\u662f\u76f8\u540c\u7684\u3002<\/p>\n<p>\u5173\u952e\u8bcd\u540e\u9762\u662f\u6309\u987a\u5e8f\u6267\u884c\u7684\u4efb\u52a1\u5217\u8868\u3002\u548c\u8bbe\u7f6e\u5267\u672c\u4e00\u6837\uff0c\u7ef4\u62a4\u5267\u672c\u4e2d\u7684\u6bcf\u4e2a\u4efb\u52a1\u90fd\u4ee5\u540d\u79f0\u5f00\u59cb\uff0c\u63cf\u8ff0\u4e86\u8be5\u4efb\u52a1\u5c06\u8981\u5b8c\u6210\u7684\u7b80\u8981\u6982\u8ff0\u3002<\/p>\n<h4>\u4efb\u52a11\uff1a\u66f4\u65b0\u7f13\u5b58<\/h4>\n<p>\u7b2c\u4e00\u4e2a\u4efb\u52a1\u662f\u66f4\u65b0\u5305\u6570\u636e\u5e93\u3002<\/p>\n<div>\u8fdb\u884c\u4e2d\u7684.yml<\/div>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">...<\/span>\r\n<span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> <mark>update cache<\/mark>\r\n  <span class=\"token key atrule\">ansible.builtin.apt<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">update_cache<\/span><span class=\"token punctuation\">:<\/span> yes\r\n<span class=\"token punctuation\">...<\/span>\r\n<\/code><\/pre>\n<p>\u6b64\u4efb\u52a1\u5c06\u4f7f\u7528ansible.builtin.apt\u6a21\u5757\u66f4\u65b0\u8f6f\u4ef6\u5305\u6570\u636e\u5e93\uff0c\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\u5b83\u5b9a\u4e49\u4e3aupdate_cache: yes\u3002\u8fd9\u4e2a\u4efb\u52a1\u5b9e\u73b0\u7684\u6548\u679c\u4e0e\u767b\u5f55\u5230Ubuntu\u670d\u52a1\u5668\u5e76\u8f93\u5165sudo apt update\u76f8\u540c\uff0c\u8fd9\u901a\u5e38\u662f\u5b89\u88c5\u8f6f\u4ef6\u5305\u6216\u66f4\u65b0\u6240\u6709\u5df2\u5b89\u88c5\u8f6f\u4ef6\u5305\u7684\u524d\u594f\u3002<\/p>\n<h4>\u4efb\u52a12\uff1a\u66f4\u65b0\u6240\u6709\u5df2\u5b89\u88c5\u7684\u8f6f\u4ef6\u5305\u3002<\/h4>\n<p>\u7b2c\u4e8c\u4e2a\u4efb\u52a1\u662f\u66f4\u65b0\u8f6f\u4ef6\u5305\u3002<\/p>\n<div>\u6b63\u5728\u8fdb\u884c\u4e2d.yml (zh\u00e8ngz\u00e0i j\u00ecnx\u00edng zh\u014dng.yml)<\/div>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">...<\/span>\r\n<span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> <mark>Update all installed packages<\/mark>\r\n  <span class=\"token key atrule\">ansible.builtin.apt<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"*\"<\/span>\r\n    <span class=\"token key atrule\">state<\/span><span class=\"token punctuation\">:<\/span> latest\r\n<span class=\"token punctuation\">...<\/span>\r\n<\/code><\/pre>\n<p>\u4e0e\u7b2c\u4e00\u4e2a\u4efb\u52a1\u7c7b\u4f3c\uff0c\u8fd9\u4e2a\u4efb\u52a1\u4e5f\u4f7f\u7528ansible.builtin.apt\u6a21\u5757\u3002\u5728\u8fd9\u91cc\uff0c\u4f60\u53ef\u4ee5\u5229\u7528\u901a\u914d\u7b26\uff08name\uff1a&#8221;*&#8221;\uff09\u548cstate: latest\u6765\u786e\u4fdd\u6240\u6709\u5b89\u88c5\u7684\u8f6f\u4ef6\u5305\u90fd\u662f\u6700\u65b0\u7684\uff0c\u8fd9\u76f8\u5f53\u4e8e\u767b\u5f55\u670d\u52a1\u5668\u5e76\u8fd0\u884csudo apt upgrade -y\u547d\u4ee4\u3002<\/p>\n<h4>\u4efb\u52a13\uff1a\u786e\u4fddNTP\u670d\u52a1\u6b63\u5728\u8fd0\u884c\u3002<\/h4>\n<p>\u5267\u672c\u4e2d\u7684\u7b2c\u4e09\u9879\u4efb\u52a1\u662f\u786e\u4fdd NTP Daemon \u5df2\u8bbe\u7f6e\u597d\u3002<\/p>\n<div>\u8fdb\u884c\u4e2d\u7684.yml<\/div>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">...<\/span>\r\n<span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> <mark>Make sure NTP service is running<\/mark>\r\n  <span class=\"token key atrule\">ansible.builtin.systemd<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">state<\/span><span class=\"token punctuation\">:<\/span> started\r\n    <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> systemd<span class=\"token punctuation\">-<\/span>timesyncd\r\n<span class=\"token punctuation\">...<\/span>\r\n<\/code><\/pre>\n<p>\u4e3a\u4e86\u786e\u4fdd\u670d\u52a1\u5668\u4e0a\u7684\u6d3b\u52a8\u670d\u52a1\u4fdd\u6301\u6d3b\u52a8\u72b6\u6001\uff0c\u53ef\u80fd\u4f1a\u6709\u5404\u79cd\u539f\u56e0\u5bfc\u81f4\u5176\u5931\u8d25\uff0c\u56e0\u6b64\u4f60\u5e0c\u671b\u786e\u4fdd\u8fd9\u4e9b\u670d\u52a1\u4fdd\u6301\u6d3b\u52a8\u72b6\u6001\u3002\u4e3a\u4e86\u5b9e\u73b0\u8fd9\u4e00\u76ee\u6807\uff0c\u4f7f\u7528ansible.builtin.systemd\u6a21\u5757\u6765\u786e\u4fddsystemd-timesyncd\uff08NTP\u5b88\u62a4\u7a0b\u5e8f\uff09\u4fdd\u6301\u6d3b\u52a8\u72b6\u6001\uff08\u72b6\u6001\uff1a\u5df2\u542f\u52a8\uff09\u3002<\/p>\n<h4>\u4efb\u52a14\uff1aUFW &#8211; \u5b83\u662f\u5426\u6b63\u5728\u8fd0\u884c\uff1f<\/h4>\n<p>\u7b2c\u56db\u4e2a\u4efb\u52a1\u662f\u68c0\u67e5UFW\u9632\u706b\u5899\u7684\u72b6\u6001\u3002<\/p>\n<div>\u8fdb\u884c\u4e2d\u7684.yml<\/div>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">...<\/span>\r\n<span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> <mark>UFW <span class=\"token punctuation\">-<\/span> Is it running<span class=\"token punctuation\">?<\/span><\/mark>\r\n  <span class=\"token key atrule\">ansible.builtin.command<\/span><span class=\"token punctuation\">:<\/span> ufw status\r\n    <span class=\"token key atrule\">register<\/span><span class=\"token punctuation\">:<\/span> <mark>ufw_status<\/mark>\r\n<span class=\"token punctuation\">...<\/span>\r\n<\/code><\/pre>\n<p>\u4f60\u53ef\u4ee5\u4f7f\u7528sudo ufw status\u547d\u4ee4\u5728Ubuntu\u4e0a\u68c0\u67e5UFW\u9632\u706b\u5899\u7684\u72b6\u6001\u3002\u8f93\u51fa\u7684\u7b2c\u4e00\u884c\u5c06\u663e\u793a\u201cStatus: active\u201d\u6216\u201cStatus: inactive\u201d\u3002\u6b64\u4efb\u52a1\u4f7f\u7528ansible.builtin.command\u6a21\u5757\u8fd0\u884c\u76f8\u540c\u7684\u547d\u4ee4\uff0c\u7136\u540e\u5c06\u8f93\u51fa\u4fdd\u5b58\uff08\u6ce8\u518c\uff09\u5230ufw_status\u53d8\u91cf\u4e2d\u3002\u4e0b\u4e00\u4e2a\u4efb\u52a1\u5c06\u67e5\u8be2\u8be5\u53d8\u91cf\u7684\u503c\u3002<\/p>\n<h4>\u4efb\u52a15\uff1aUFW-\u542f\u7528UFW\u5e76\u62d2\u7edd\u4f20\u5165\u6d41\u91cf\u3002<\/h4>\n<p>\u5982\u679cUFW\u9632\u706b\u5899\u5df2\u7ecf\u505c\u6b62\uff0c\u5219\u7b2c\u4e94\u4e2a\u4efb\u52a1\u5c06\u91cd\u65b0\u542f\u7528\u5b83\u3002<\/p>\n<div>\u6301\u7eed\u4e2d.yml<\/div>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">...<\/span>\r\n<span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> <mark>UFW <span class=\"token punctuation\">-<\/span> Enable UFW and deny incoming traffic<\/mark>\r\n  <span class=\"token key atrule\">community.general.ufw<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">state<\/span><span class=\"token punctuation\">:<\/span> enabled\r\n  <span class=\"token key atrule\">when<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"'inactive' in ufw_status.stdout\"<\/span>\r\n<span class=\"token punctuation\">...<\/span>\r\n<\/code><\/pre>\n<p>\u5f53ufw_status\u53d8\u91cf\u7684\u8f93\u51fa\u4e2d\u51fa\u73b0\u201cinactive\u201d\u4e00\u8bcd\u65f6\uff0c\u8be5\u4efb\u52a1\u8c03\u7528community.general.ufw\u6a21\u5757\u4ec5\u542f\u7528\u9632\u706b\u5899\u3002\u5982\u679c\u9632\u706b\u5899\u5904\u4e8e\u6d3b\u52a8\u72b6\u6001\uff0c\u5219\u4e0d\u6ee1\u8db3when\u6761\u4ef6\uff0c\u4efb\u52a1\u88ab\u6807\u8bb0\u4e3a\u8df3\u8fc7\u3002<\/p>\n<h4>\u4efb\u52a16\uff1a\u79fb\u9664\u4e0d\u518d\u9700\u8981\u7684\u4f9d\u8d56\u9879<\/h4>\n<p>\u8fd9\u672c\u624b\u518c\u7684\u7b2c\u516d\u4e2a\u4efb\u52a1\u662f\u6e05\u7406\u8f6f\u4ef6\u5305\u4f9d\u8d56\u5173\u7cfb\u3002<\/p>\n<div>\u6301\u7eed\u4e2d.yml<\/div>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">...<\/span>\r\n<span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> <mark>Remove dependencies that are no longer required<\/mark>\r\n  <span class=\"token key atrule\">ansible.builtin.apt<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">autoremove<\/span><span class=\"token punctuation\">:<\/span> yes\r\n<span class=\"token punctuation\">...<\/span>\r\n<\/code><\/pre>\n<p>\u901a\u8fc7\u8c03\u7528ansible.builtin.apt\u6a21\u5757\u6765\u6267\u884c\u8be5\u4efb\u52a1\uff0c\u8be5\u6a21\u5757\u76f8\u5f53\u4e8e\u8fd0\u884csudo apt autoremove\u547d\u4ee4\uff0c\u5b83\u4f1a\u79fb\u9664\u670d\u52a1\u5668\u4e0a\u4e0d\u518d\u9700\u8981\u7684\u8f6f\u4ef6\u5305\u4f9d\u8d56\u5173\u7cfb\u3002<\/p>\n<h4>\u4efb\u52a17\uff1a\u68c0\u67e5\u662f\u5426\u9700\u8981\u91cd\u65b0\u542f\u52a8<\/h4>\n<p>\u7b2c\u4e03\u9879\u4efb\u52a1\u68c0\u67e5\u662f\u5426\u9700\u8981\u91cd\u65b0\u542f\u52a8\u3002<\/p>\n<div>\u76ee\u524d\u6b63\u5728\u8fdb\u884c\u7684.yml<\/div>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">...<\/span>\r\n<span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> <mark>Check if reboot required<\/mark>\r\n  <span class=\"token key atrule\">ansible.builtin.stat<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">path<\/span><span class=\"token punctuation\">:<\/span> \/var\/run\/reboot<span class=\"token punctuation\">-<\/span>required\r\n  <span class=\"token key atrule\">register<\/span><span class=\"token punctuation\">:<\/span> <mark>reboot_required<\/mark>\r\n<span class=\"token punctuation\">...<\/span>\r\n<\/code><\/pre>\n<p>\u5728Ubuntu\u4e0a\uff0c\u65b0\u5b89\u88c5\u6216\u5347\u7ea7\u7684\u8f6f\u4ef6\u5305\u5c06\u901a\u8fc7\u521b\u5efa\/var\/run\/reboot-required\u6587\u4ef6\u6765\u53d1\u51fa\u9700\u8981\u91cd\u65b0\u542f\u52a8\u7684\u4fe1\u53f7\uff0c\u4ee5\u4fbf\u4f7f\u5b89\u88c5\u6216\u5347\u7ea7\u5f15\u5165\u7684\u66f4\u6539\u751f\u6548\u3002\u60a8\u53ef\u4ee5\u4f7f\u7528stat \/var\/run\/reboot-required\u547d\u4ee4\u786e\u8ba4\u8be5\u6587\u4ef6\u662f\u5426\u5b58\u5728\u3002\u6b64\u4efb\u52a1\u8c03\u7528ansible.builtin.stat\u6a21\u5757\u6267\u884c\u76f8\u540c\u64cd\u4f5c\uff0c\u5e76\u5c06\u8f93\u51fa\u4fdd\u5b58\uff08\u6ce8\u518c\uff09\u5230reboot_required\u53d8\u91cf\u3002\u4e0b\u4e00\u4e2a\u4efb\u52a1\u5c06\u67e5\u8be2\u8be5\u53d8\u91cf\u7684\u503c\u3002<\/p>\n<h4>\u4efb\u52a18\uff1a\u5982\u679c\u9700\u8981\u7684\u8bdd\u91cd\u65b0\u542f\u52a8<\/h4>\n<p>\u7b2c\u516b\u9879\u4efb\u52a1\u5c06\u5728\u5fc5\u8981\u65f6\u91cd\u65b0\u542f\u52a8\u670d\u52a1\u5668\u3002<\/p>\n<div>\u8fdb\u884c\u4e2d\u7684.yml<\/div>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">...<\/span>\r\n<span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> <mark>Reboot if required<\/mark>\r\n  <span class=\"token key atrule\">ansible.builtin.reboot<\/span><span class=\"token punctuation\">:<\/span>\r\n  <span class=\"token key atrule\">when<\/span><span class=\"token punctuation\">:<\/span> <mark>reboot_required<\/mark>.stat.exists == true\r\n<\/code><\/pre>\n<p>\u901a\u8fc7\u67e5\u8be2\u4efb\u52a1 7 \u4e2d\u7684 reboot_required \u53d8\u91cf\uff0c\u8be5\u4efb\u52a1\u8c03\u7528 ansible.builtin.reboot \u6a21\u5757\uff0c\u4ec5\u5f53 \/var\/run\/reboot-required \u5b58\u5728\u65f6\u624d\u4f1a\u91cd\u65b0\u542f\u52a8\u4e3b\u673a\u3002\u5982\u679c\u9700\u8981\u91cd\u65b0\u542f\u52a8\u5e76\u6210\u529f\u91cd\u65b0\u542f\u52a8\u4e3b\u673a\uff0c\u5219\u5c06\u8be5\u4efb\u52a1\u6807\u8bb0\u4e3a\u5df2\u66f4\u6539\u3002\u5426\u5219\uff0cAnsible \u5728\u64ad\u653e\u6458\u8981\u4e2d\u5c06\u5176\u6807\u8bb0\u4e3a\u8df3\u8fc7\u3002<\/p>\n<p>\u6b63\u5728\u8fdb\u884c\u7684\u7ef4\u62a4\u5de5\u4f5c\u7684\u5b8c\u6574\u64cd\u4f5c\u624b\u518c\u6587\u4ef6\u5c06\u5982\u4e0b\u6240\u793a\uff1a<\/p>\n<div>\u9996\u5148.yml<\/div>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">hosts<\/span><span class=\"token punctuation\">:<\/span> ongoing\r\n  <span class=\"token key atrule\">port<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"{{ ssh_port }}\"<\/span>\r\n  <span class=\"token key atrule\">remote_user<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"{{ create_user }}\"<\/span>\r\n  <span class=\"token key atrule\">become<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">true<\/span>\r\n  <span class=\"token key atrule\">vars_files<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token punctuation\">-<\/span> vars\/default.yml\r\n    <span class=\"token punctuation\">-<\/span> secret\r\n  <span class=\"token key atrule\">vars<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token key atrule\">ansible_become_pass<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"{{ password }}\"<\/span>\r\n\r\n  <span class=\"token key atrule\">tasks<\/span><span class=\"token punctuation\">:<\/span>\r\n    <span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> update cache\r\n      <span class=\"token key atrule\">ansible.builtin.apt<\/span><span class=\"token punctuation\">:<\/span>\r\n        <span class=\"token key atrule\">update_cache<\/span><span class=\"token punctuation\">:<\/span> yes\r\n\r\n    <span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Update all installed packages\r\n      <span class=\"token key atrule\">ansible.builtin.apt<\/span><span class=\"token punctuation\">:<\/span>\r\n        <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"*\"<\/span>\r\n        <span class=\"token key atrule\">state<\/span><span class=\"token punctuation\">:<\/span> latest\r\n\r\n    <span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Make sure NTP service is running\r\n      <span class=\"token key atrule\">ansible.builtin.systemd<\/span><span class=\"token punctuation\">:<\/span>\r\n        <span class=\"token key atrule\">state<\/span><span class=\"token punctuation\">:<\/span> started\r\n        <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> systemd<span class=\"token punctuation\">-<\/span>timesyncd\r\n\r\n    <span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> UFW <span class=\"token punctuation\">-<\/span> Is it running<span class=\"token punctuation\">?<\/span>\r\n      <span class=\"token key atrule\">ansible.builtin.command<\/span><span class=\"token punctuation\">:<\/span> ufw status\r\n      <span class=\"token key atrule\">register<\/span><span class=\"token punctuation\">:<\/span> ufw_status\r\n      \r\n    <span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> UFW <span class=\"token punctuation\">-<\/span> Enable UFW and deny incoming traffic\r\n      <span class=\"token key atrule\">community.general.ufw<\/span><span class=\"token punctuation\">:<\/span>\r\n        <span class=\"token key atrule\">state<\/span><span class=\"token punctuation\">:<\/span> enabled\r\n      <span class=\"token key atrule\">when<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"'inactive' in ufw_status.stdout\"<\/span>\r\n\r\n    <span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Remove dependencies that are no longer required\r\n      <span class=\"token key atrule\">ansible.builtin.apt<\/span><span class=\"token punctuation\">:<\/span>\r\n        <span class=\"token key atrule\">autoremove<\/span><span class=\"token punctuation\">:<\/span> yes\r\n\r\n    <span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Check if reboot required\r\n      <span class=\"token key atrule\">ansible.builtin.stat<\/span><span class=\"token punctuation\">:<\/span>\r\n        <span class=\"token key atrule\">path<\/span><span class=\"token punctuation\">:<\/span> \/var\/run\/reboot<span class=\"token punctuation\">-<\/span>required\r\n      <span class=\"token key atrule\">register<\/span><span class=\"token punctuation\">:<\/span> reboot_required\r\n\r\n    <span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Reboot if required\r\n      <span class=\"token key atrule\">ansible.builtin.reboot<\/span><span class=\"token punctuation\">:<\/span>\r\n      <span class=\"token key atrule\">when<\/span><span class=\"token punctuation\">:<\/span> reboot_required.stat.exists == true\r\n<\/code><\/pre>\n<p>\u5f53\u5ba1\u6838\u5b8c\u6587\u4ef6\u540e\uff0c\u8bf7\u4fdd\u5b58\u5e76\u5173\u95ed\u5b83\u3002<\/p>\n<div class=\"post-conf-note\">\n<p class=\"post-note\">\n<p class=\"post-conf-desc\">Note<\/p>\n<div>\u6ce8\u610f\uff1a\u60a8\u53ef\u4ee5\u5411playbook\u6dfb\u52a0\u65b0\u4efb\u52a1\u6216\u4fee\u6539\u73b0\u6709\u4efb\u52a1\u3002\u7136\u800c\uff0c\u6539\u53d8YAML\u6587\u4ef6\u53ef\u80fd\u4f1a\u7834\u574f\u5b83\uff0c\u56e0\u4e3aYAML\u5bf9\u7a7a\u683c\u654f\u611f\uff0c\u6240\u4ee5\u5982\u679c\u9009\u62e9\u7f16\u8f91\u6587\u4ef6\u7684\u4efb\u4f55\u90e8\u5206\uff0c\u8bf7\u5c0f\u5fc3\u5904\u7406\u3002\u6709\u5173\u4f7f\u7528Ansible playbook\u7684\u66f4\u591a\u4fe1\u606f\uff0c\u8bf7\u5173\u6ce8\u6211\u4eec\u7684\u7cfb\u5217\u6587\u7ae0\u300a\u5982\u4f55\u7f16\u5199Ansible Playbook\u300b\u3002<\/div>\n<\/div>\n<p>\u73b0\u5728\u4f60\u53ef\u4ee5\u8fd0\u884c\u8fd9\u4e2a\u6587\u4ef6\u4e86\u3002\u9996\u5148\uff0c\u68c0\u67e5\u8bed\u6cd5\u662f\u5426\u6b63\u786e\u3002<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\">ansible-playbook --syntax-check --ask-vault-pass <mark>ongoing.yml<\/mark>\r\n<\/li><\/ol>\r\n<\/code><\/pre>\n<p>\u5728\u7b2c5\u6b65\u4e2d\uff0c\u7cfb\u7edf\u4f1a\u63d0\u793a\u60a8\u8f93\u5165\u60a8\u521b\u5efa\u7684\u4fdd\u9669\u5e93\u5bc6\u7801\u3002\u5982\u679c\u6210\u529f\u9a8c\u8bc1\u540e\uff0cYAML\u8bed\u6cd5\u6ca1\u6709\u9519\u8bef\uff0c\u8f93\u51fa\u5c06\u4e3a\uff1a<\/p>\n<pre class=\"post-pre\"><code><div class=\"secondary-code-label\" title=\"Output\">Output<\/div>playbook: <mark>ongoing.yml<\/mark>\r\n<\/code><\/pre>\n<p>\u4f60\u73b0\u5728\u53ef\u4ee5\u7528\u4ee5\u4e0b\u547d\u4ee4\u8fd0\u884c\u8fd9\u4e2a\u6587\u4ef6\u4e86\u3002<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\">ansible-playbook --ask-vault-pass <mark>ongoing.yml<\/mark>\r\n<\/li><\/ol>\r\n<\/code><\/pre>\n<p>\u5728\u6210\u529f\u9a8c\u8bc1\u540e\uff0cAnsible\u63a7\u5236\u5668\u5c06\u4ee5sammy\uff08\u6216\u60a8\u6307\u5b9a\u7684\u7528\u6237\u540d\uff09\u7684\u8eab\u4efd\u767b\u5f55\u5230\u6bcf\u4e2a\u4e3b\u673a\u4e0a\u6765\u6267\u884cplaybook\u4e2d\u7684\u4efb\u52a1\u3002\u4e0e\u5728\u6bcf\u4e2a\u670d\u52a1\u5668\u4e0a\u9010\u4e2a\u8fd0\u884cssh -p 5995 sammy@host_ip_address\u547d\u4ee4\u4e0d\u540c\uff0cAnsible\u4f1a\u8fde\u63a5\u5230\/etc\/ansible\/hosts\u4e2d\u6307\u5b9a\u7684\u6301\u7eed\u7ec4\u4e2d\u7684\u8282\u70b9\uff0c\u7136\u540e\u6267\u884cplaybook\u4e2d\u7684\u4efb\u52a1\u3002<\/p>\n<p>\u5982\u679c\u547d\u4ee4\u6210\u529f\u5b8c\u6210\uff0c\u4e0b\u9762\u7684\u8f93\u51fa\u5c06\u4f1a\u6253\u5370\u51fa\u6765\u3002<\/p>\n<pre class=\"post-pre\"><code><div class=\"secondary-code-label\" title=\"Output\">Output<\/div>PLAY RECAP *****************************************************************************************************\r\n<mark>host1<\/mark>   : ok=7   changed=2    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0   \r\n<mark>host2<\/mark>   : ok=7   changed=2    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0   \r\n<mark>host3<\/mark>   : ok=7   changed=2    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0\r\n<\/code><\/pre>\n<p>\u4e0e\u521d\u59cb\u670d\u52a1\u5668\u8bbe\u7f6e\u7684\u6e38\u620f\u6982\u8ff0\u4e0d\u540c\uff0c\u8fd9\u4e2a\u6e38\u620f\u6982\u8ff0\u8bb0\u5f55\u4e86\u4e24\u4e2a\u4efb\u52a1\u88ab\u8df3\u8fc7\u7684\u539f\u56e0\uff0c\u56e0\u4e3a\u6bcf\u4e2a\u4efb\u52a1\u7684\u6761\u4ef6\u8bbe\u7f6e\u4e2d\u7684when\u53c2\u6570\u672a\u6ee1\u8db3\u3002<\/p>\n<p>\u60a8\u53ef\u4ee5\u4f7f\u7528\u6b64\u64ad\u653e\u518c\u6765\u7ef4\u62a4\u4e3b\u673a\uff0c\u800c\u65e0\u9700\u624b\u52a8\u767b\u5f55\u6bcf\u53f0\u4e3b\u673a\u3002\u5f53\u60a8\u5728\u4e3b\u673a\u4e0a\u6784\u5efa\u548c\u5b89\u88c5\u5e94\u7528\u7a0b\u5e8f\u65f6\uff0c\u53ef\u4ee5\u5411\u64ad\u653e\u518c\u6dfb\u52a0\u4efb\u52a1\uff0c\u4ee5\u4fbf\u60a8\u8fd8\u53ef\u4ee5\u4f7f\u7528Ansible\u7ba1\u7406\u8fd9\u4e9b\u5e94\u7528\u7a0b\u5e8f\u3002<\/p>\n<h2>\u7ed3\u8bba<\/h2>\n<p>\u5728\u672c\u6559\u7a0b\u4e2d\uff0c\u60a8\u4f7f\u7528Ansible\u6765\u81ea\u52a8\u5316\u591a\u4e2aUbuntu 22.04\u670d\u52a1\u5668\u7684\u521d\u59cb\u8bbe\u7f6e\u3002\u540c\u65f6\uff0c\u60a8\u8fd8\u8fd0\u884c\u4e86\u4e00\u4e2a\u8f85\u52a9playbook\u6765\u8fdb\u884c\u8fd9\u4e9b\u670d\u52a1\u5668\u7684\u6301\u7eed\u7ef4\u62a4\u3002\u5f53\u60a8\u9700\u8981\u5728\u5206\u5e03\u5f0f\u6216\u96c6\u7fa4\u6a21\u5f0f\u4e0b\u8bbe\u7f6e\u50cfCassandra\u6216MinIO\u8fd9\u6837\u7684\u5e94\u7528\u7a0b\u5e8f\u65f6\uff0cAnsible\u81ea\u52a8\u5316\u662f\u4e00\u4e2a\u8282\u7701\u65f6\u95f4\u7684\u5de5\u5177\u3002<\/p>\n<p>\u6709\u5173Ansible\u7684\u66f4\u591a\u4fe1\u606f\u53ef\u5728\u5b98\u65b9Ansible\u6587\u6863\u7ad9\u70b9\u4e0a\u627e\u5230\u3002\u4e3a\u4e86\u8fdb\u4e00\u6b65\u5b9a\u5236\u60a8\u7684playbook\uff0c\u60a8\u53ef\u4ee5\u67e5\u9605\u4e00\u4efd\u914d\u7f6e\u7ba1\u7406\u5165\u95e8\u4ee5\u53ca\u4e00\u4efd\u914d\u7f6e\u7ba1\u7406101\uff1a\u7f16\u5199Ansible Playbooks\u7684\u6307\u5357\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5f15\u8a00 Ansible\u662f\u4e00\u79cd\u5f00\u6e90\u8f6f\u4ef6\u5de5\u5177\uff0c\u7528\u4e8e\u81ea\u52a8\u5316\u670d\u52a1\u5668\u548c\u5e94\u7528\u7a0b\u5e8f\u7684\u914d\u7f6e\u7ba1\u7406\u3001\u90e8\u7f72\u548c\u4f9b\u5e94\u3002\u60a8\u53ef\u4ee5\u4f7f\u7528Ansib [&hellip;]<\/p>\n","protected":false},"author":6,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-50751","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u5982\u4f55\u4f7f\u7528Ansible\u81ea\u52a8\u5316\u591a\u4e2aUbuntu 22.04\u670d\u52a1\u5668\u7684\u521d\u59cb\u8bbe\u7f6e - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u5982\u4f55\u4f7f\u7528ansible\u81ea\u52a8\u5316\u591a\u4e2aubuntu-22-04\u670d\u52a1\u5668\u7684\u521d\u59cb\u8bbe\u7f6e\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u5982\u4f55\u4f7f\u7528Ansible\u81ea\u52a8\u5316\u591a\u4e2aUbuntu 22.04\u670d\u52a1\u5668\u7684\u521d\u59cb\u8bbe\u7f6e\" \/>\n<meta property=\"og:description\" content=\"\u5f15\u8a00 Ansible\u662f\u4e00\u79cd\u5f00\u6e90\u8f6f\u4ef6\u5de5\u5177\uff0c\u7528\u4e8e\u81ea\u52a8\u5316\u670d\u52a1\u5668\u548c\u5e94\u7528\u7a0b\u5e8f\u7684\u914d\u7f6e\u7ba1\u7406\u3001\u90e8\u7f72\u548c\u4f9b\u5e94\u3002\u60a8\u53ef\u4ee5\u4f7f\u7528Ansib [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u5982\u4f55\u4f7f\u7528ansible\u81ea\u52a8\u5316\u591a\u4e2aubuntu-22-04\u670d\u52a1\u5668\u7684\u521d\u59cb\u8bbe\u7f6e\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-12-23T02:31:41+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-12-23T07:16:46+00:00\" \/>\n<meta name=\"author\" content=\"\u6587, \u7fd4\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u6587, \u7fd4\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8ansible%e8%87%aa%e5%8a%a8%e5%8c%96%e5%a4%9a%e4%b8%aaubuntu-22-04%e6%9c%8d%e5%8a%a1%e5%99%a8%e7%9a%84%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8ansible%e8%87%aa%e5%8a%a8%e5%8c%96%e5%a4%9a%e4%b8%aaubuntu-22-04%e6%9c%8d%e5%8a%a1%e5%99%a8%e7%9a%84%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae\/\",\"name\":\"\u5982\u4f55\u4f7f\u7528Ansible\u81ea\u52a8\u5316\u591a\u4e2aUbuntu 22.04\u670d\u52a1\u5668\u7684\u521d\u59cb\u8bbe\u7f6e - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-12-23T02:31:41+00:00\",\"dateModified\":\"2023-12-23T07:16:46+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/64d5cc7727fffbff2f9a2a8da1de3e5c\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8ansible%e8%87%aa%e5%8a%a8%e5%8c%96%e5%a4%9a%e4%b8%aaubuntu-22-04%e6%9c%8d%e5%8a%a1%e5%99%a8%e7%9a%84%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8ansible%e8%87%aa%e5%8a%a8%e5%8c%96%e5%a4%9a%e4%b8%aaubuntu-22-04%e6%9c%8d%e5%8a%a1%e5%99%a8%e7%9a%84%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8ansible%e8%87%aa%e5%8a%a8%e5%8c%96%e5%a4%9a%e4%b8%aaubuntu-22-04%e6%9c%8d%e5%8a%a1%e5%99%a8%e7%9a%84%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u5982\u4f55\u4f7f\u7528Ansible\u81ea\u52a8\u5316\u591a\u4e2aUbuntu 22.04\u670d\u52a1\u5668\u7684\u521d\u59cb\u8bbe\u7f6e\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/64d5cc7727fffbff2f9a2a8da1de3e5c\",\"name\":\"\u6587, \u7fd4\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/920c3d673e0bccacc98e5e6b7149bb3c22edd8d39cb753e5d7d7e471498118a1?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/920c3d673e0bccacc98e5e6b7149bb3c22edd8d39cb753e5d7d7e471498118a1?s=96&d=mm&r=g\",\"caption\":\"\u6587, \u7fd4\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/wenxiang\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8ansible%e8%87%aa%e5%8a%a8%e5%8c%96%e5%a4%9a%e4%b8%aaubuntu-22-04%e6%9c%8d%e5%8a%a1%e5%99%a8%e7%9a%84%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u5982\u4f55\u4f7f\u7528Ansible\u81ea\u52a8\u5316\u591a\u4e2aUbuntu 22.04\u670d\u52a1\u5668\u7684\u521d\u59cb\u8bbe\u7f6e - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u5982\u4f55\u4f7f\u7528ansible\u81ea\u52a8\u5316\u591a\u4e2aubuntu-22-04\u670d\u52a1\u5668\u7684\u521d\u59cb\u8bbe\u7f6e\/","og_locale":"zh_CN","og_type":"article","og_title":"\u5982\u4f55\u4f7f\u7528Ansible\u81ea\u52a8\u5316\u591a\u4e2aUbuntu 22.04\u670d\u52a1\u5668\u7684\u521d\u59cb\u8bbe\u7f6e","og_description":"\u5f15\u8a00 Ansible\u662f\u4e00\u79cd\u5f00\u6e90\u8f6f\u4ef6\u5de5\u5177\uff0c\u7528\u4e8e\u81ea\u52a8\u5316\u670d\u52a1\u5668\u548c\u5e94\u7528\u7a0b\u5e8f\u7684\u914d\u7f6e\u7ba1\u7406\u3001\u90e8\u7f72\u548c\u4f9b\u5e94\u3002\u60a8\u53ef\u4ee5\u4f7f\u7528Ansib [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u5982\u4f55\u4f7f\u7528ansible\u81ea\u52a8\u5316\u591a\u4e2aubuntu-22-04\u670d\u52a1\u5668\u7684\u521d\u59cb\u8bbe\u7f6e\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-12-23T02:31:41+00:00","article_modified_time":"2023-12-23T07:16:46+00:00","author":"\u6587, \u7fd4","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u6587, \u7fd4","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"4 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8ansible%e8%87%aa%e5%8a%a8%e5%8c%96%e5%a4%9a%e4%b8%aaubuntu-22-04%e6%9c%8d%e5%8a%a1%e5%99%a8%e7%9a%84%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8ansible%e8%87%aa%e5%8a%a8%e5%8c%96%e5%a4%9a%e4%b8%aaubuntu-22-04%e6%9c%8d%e5%8a%a1%e5%99%a8%e7%9a%84%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae\/","name":"\u5982\u4f55\u4f7f\u7528Ansible\u81ea\u52a8\u5316\u591a\u4e2aUbuntu 22.04\u670d\u52a1\u5668\u7684\u521d\u59cb\u8bbe\u7f6e - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-12-23T02:31:41+00:00","dateModified":"2023-12-23T07:16:46+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/64d5cc7727fffbff2f9a2a8da1de3e5c"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8ansible%e8%87%aa%e5%8a%a8%e5%8c%96%e5%a4%9a%e4%b8%aaubuntu-22-04%e6%9c%8d%e5%8a%a1%e5%99%a8%e7%9a%84%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8ansible%e8%87%aa%e5%8a%a8%e5%8c%96%e5%a4%9a%e4%b8%aaubuntu-22-04%e6%9c%8d%e5%8a%a1%e5%99%a8%e7%9a%84%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8ansible%e8%87%aa%e5%8a%a8%e5%8c%96%e5%a4%9a%e4%b8%aaubuntu-22-04%e6%9c%8d%e5%8a%a1%e5%99%a8%e7%9a%84%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u5982\u4f55\u4f7f\u7528Ansible\u81ea\u52a8\u5316\u591a\u4e2aUbuntu 22.04\u670d\u52a1\u5668\u7684\u521d\u59cb\u8bbe\u7f6e"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/64d5cc7727fffbff2f9a2a8da1de3e5c","name":"\u6587, \u7fd4","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/920c3d673e0bccacc98e5e6b7149bb3c22edd8d39cb753e5d7d7e471498118a1?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/920c3d673e0bccacc98e5e6b7149bb3c22edd8d39cb753e5d7d7e471498118a1?s=96&d=mm&r=g","caption":"\u6587, \u7fd4"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/wenxiang\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8ansible%e8%87%aa%e5%8a%a8%e5%8c%96%e5%a4%9a%e4%b8%aaubuntu-22-04%e6%9c%8d%e5%8a%a1%e5%99%a8%e7%9a%84%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/50751","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=50751"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/50751\/revisions"}],"predecessor-version":[{"id":50774,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/50751\/revisions\/50774"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=50751"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=50751"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=50751"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}