{"id":363,"date":"2021-07-28T15:48:41","date_gmt":"2021-07-28T07:48:41","guid":{"rendered":"http:\/\/egonlin.com\/?p=363"},"modified":"2024-07-18T17:18:37","modified_gmt":"2024-07-18T09:18:37","slug":"%e7%ac%ac%e4%b8%83%e8%8a%82%ef%bc%9aansible%e6%b5%81%e7%a8%8b%e6%8e%a7%e5%88%b6","status":"publish","type":"post","link":"https:\/\/egonlin.com\/?p=363","title":{"rendered":"\u7b2c\u4e03\u8282\uff1aAnsible \u5267\u672c\u91cd\u7528\u4e0e\u89e3\u8026"},"content":{"rendered":"<h1>\u4e00\u3001\u5267\u672c\u91cd\u7528\u4e0e\u89e3\u8026<\/h1>\n<p>\u5728\u5927\u578b\u9879\u76ee\u4e2d\uff0c\u6d89\u53ca\u5230\u7684\u529f\u80fd\u6a21\u5757\u591a\u4e14\u6742\uff0c\u4f60\u4e0d\u53ef\u80fd\u5168\u90e8\u653e\u5165\u4e00\u4e2aplaybook\u4e2d<br \/>\n\u4e3a\u4e86\u65b9\u4fbf\u7ba1\u7406\uff0c\u6211\u4eec\u5fc5\u987b<br \/>\n1\u3001\u5f00\u53d1\u7684\u65f6\u5019<\/p>\n<ul>\n<li>\u8981\u628a\u4e0d\u540c\u7684\u529f\u80fd\u653e\u5165\u4e0d\u540c\u7684\u6587\u4ef6\u4e2d\u5b9e\u73b0\u89e3\u8026\u5408\u5417<\/li>\n<li>\u4e00\u4e9b\u6587\u4ef6\u53ef\u4ee5\u88ab\u5171\u4eab\u5f15\u7528\u5b9e\u73b0\u590d\u7528<\/li>\n<\/ul>\n<p>2\u3001\u6267\u884c\u7684\u65f6\u5019\uff1a\u6700\u597d\u80fd\u7edf\u4e00\u5728\u4e00\u8d77\u4e00\u952e\u6267\u884c<\/p>\n<p>\u5b9e\u73b0\u65b9\u5f0f\u6709\u4e24\u79cd<br \/>\n1\u3001include\u529f\u80fd<br \/>\n2\u3001\u57fa\u4e8eroles\u8fdb\u884c\u5de5\u7a0b\u5316\u5f00\u53d1<\/p>\n<pre><code>Ansible \u7684 roles \u662f\u4e00\u79cd\u7ed3\u6784\u5316\u7684\u65b9\u5f0f\uff0c\u7528\u4e8e\u7ec4\u7ec7\u4efb\u52a1\u3001\u6a21\u677f\u3001\u6587\u4ef6\u548c\u53d8\u91cf\u3002\r\n\u6b64\u7ed3\u6784\u4f7f\u7ba1\u7406\u590d\u6742\u7684\u81ea\u52a8\u5316\u8bbe\u7f6e\u66f4\u4e3a\u7b80\u5355\uff0c\u56e0\u4e3a\u4e0e\u7279\u5b9a\u89d2\u8272\u76f8\u5173\u7684\u6240\u6709\u5185\u5bb9\u90fd\u5305\u542b\u5728\u5176\u76ee\u5f55\u4e2d\r\n\u5b83\u5c31\u8ddf\u4f60\u5f00\u53d1\u4e00\u4e2adjango\u9879\u76ee\uff0c\u4e0d\u540c\u7684\u6587\u4ef6\u653e\u5165\u4e0d\u540c\u7684\u76ee\u5f55\u91cc\u4e00\u6837\u7684\u9053\u7406<\/code><\/pre>\n<h1>\u4e8c\u3001include\u4f7f\u7528\u793a\u4f8b<\/h1>\n<h2>2.1 \u4f7f\u7528inclulde_tasks\u5f15\u5165\u5b58\u653etask\u7684\u6587\u4ef6<\/h2>\n<p>1\uff09\u628a\u4e24\u4e2a\u5c0ftask\u653e\u5165\u4e0d\u540c\u7684\u6587\u4ef6\uff0c\u6ce8\u610f\u6bcf\u4e2a\u5c0ftask\u7684\u6587\u4ef6\u662f\u65e0\u6cd5\u5355\u72ec\u8fd0\u884c\u7684<\/p>\n<pre><code class=\"language-bash\">cat &gt; play1.yml &lt;&lt; \"EOF\"\r\n- name: task1\r\n  copy:\r\n    content: \"111\"\r\n    dest: \"\/tmp\/1.txt\"\r\nEOF\r\n\r\ncat &gt; play2.yml &lt;&lt; \"EOF\"\r\n- name: task2\r\n  copy:\r\n    content: \"222\"\r\n    dest: \"\/tmp\/2.txt\"\r\nEOF<\/code><\/pre>\n<p>2\uff09\u7528include_tasks\u6307\u4ee4\u6765\u5f15\u5165task\u6587\u4ef6<\/p>\n<pre><code class=\"language-bash\">[root@m01 project]# vim main.yml\r\n- hosts: group5\r\n  tasks:\r\n    - include_tasks: \/workspace\/play1.yml\r\n    - include_tasks: \/workspace\/play2.yml<\/code><\/pre>\n<h2>2.2 \u4f7f\u7528import_playbook\u6765\u76f4\u63a5\u590d\u7528\u4e00\u6574\u4e2a\u5267\u672c<\/h2>\n<p>\u6bcf\u4e2aplaybook\u6587\u4ef6\u90fd\u662f\u4e00\u4e2a\u53ef\u4ee5\u72ec\u7acb\u8fd0\u884c\u7684\u5267\u672c\uff0c\u5982\u679c\u4f60\u60f3\u590d\u7528\u7684\u662f\u4e00\u4e2a\u6574\u4e2a\u5267\u672c\uff0c\u90a3\u9700\u8981\u4f7f\u7528import_playbook\u6307\u4ee4<\/p>\n<pre><code class=\"language-bash\">[root@m01 project]# cat main.yml \r\n- import_playbook: .\/base.yml\r\n- import_playbook: .\/nginx.yml\r\n- import_playbook: .\/php.yml\r\n- import_playbook: .\/wordpress.yml\r\n- import_playbook: .\/mariadb.yml<\/code><\/pre>\n<h1>\u4e09\u3001Ansible Roles<\/h1>\n<h2>3.1 Roles\u57fa\u672c\u6982\u8ff0<\/h2>\n<p>\u901a\u8fc7\u4f7f\u7528 roles\uff0c\u4f60\u53ef\u4ee5\u5c06\u590d\u6742\u7684\u8bbe\u7f6e\u548c\u64cd\u4f5c\u6d41\u7a0b\u5c01\u88c5\u5728\u4e00\u4e2a\u7edf\u4e00\u7684\u6587\u4ef6\u5939\u4e0b\uff0c\u8fdb\u800c\u5b9e\u73b0\u4ee3\u7801\u7684\u590d\u7528\u548c\u6a21\u5757\u5316<br \/>\n\u4f8b\u5982\u4f60\u8981\u90e8\u7f72\u8d1f\u8f7d\u5747\u8861\u3001web\u670d\u52a1\u5668\u3001nfs\u3001\u6570\u636e\u5e93\uff0c\u90a3\u4f60\u53ef\u4ee5\u521b\u5efa\u56db\u4e2arole<br \/>\n\u6bcf\u4e2arole\u90fd\u7ec4\u7ec7\u7ba1\u7406\u4e86\u597d\u4e86\u5404\u81ea\u9700\u8981\u7684\u6240\u6709\u5143\u7d20\uff08\u5305\u62ec\u4efb\u52a1\u3001\u53d8\u91cf\u3001handler\u3001\u6587\u4ef6\u7b49\uff09\u7684\u76ee\u5f55\u7ed3\u6784\u3002<\/p>\n<h2>3.2 \u521b\u5efa\u5355\u72ec\u4e00\u4e2aRole<\/h2>\n<p>\u4e00\u4e2a\u5b8c\u6574\u7684Role\u91cc\u5305\u542b\u7684\u76ee\u5f55\u548c\u6587\u4ef6\u53ef\u80fd\u8f83\u591a\uff0c\u624b\u52a8\u53bb\u521b\u5efa\u6240\u6709\u8fd9\u4e9b\u76ee\u5f55\u548c\u6587\u4ef6\u662f\u4e00\u4ef6\u6bd4\u8f83\u70e6\u4eba\u7684\u4e8b\uff0c\u597d\u5728\u53ef\u4ee5\u4f7f\u7528ansible-galaxy init ROLE_NAME\u547d\u4ee4\u6765\u5feb\u901f\u521b\u5efa\u4e00\u4e2a\u7b26\u5408Role\u6587\u4ef6\u7ec4\u7ec7\u89c4\u8303\u7684\u6846\u67b6\u3002<\/p>\n<pre><code>[root@lb workspace]# ansible-galaxy init first_role\r\n\r\n[root@lb workspace]# tree first_role\/\r\nfirst_role\/       # \u89d2\u8272\u540d\u79f0\uff0c\u6216\u8005\u53eb\u9879\u76ee\u540d\r\n\u251c\u2500\u2500 README.md\r\n\u251c\u2500\u2500 defaults      # \u9ed8\u8ba4\u7684\u53d8\u91cf\uff08\u4f18\u5148\u7ea7\u5f88\u4f4e\uff09\r\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 main.yml\r\n\u251c\u2500\u2500 files         # \u5b58\u653e\u6587\u4ef6\uff0c\u4f7f\u7528copy\u6a21\u5757\u65f6\u81ea\u52a8\u83b7\u53d6\r\n\u251c\u2500\u2500 handlers      # \u5b58\u653e\u89e6\u53d1\u5668\u7684\u914d\u7f6e\r\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 main.yml\r\n\u251c\u2500\u2500 meta          # \u4f9d\u8d56\u7684\u670d\u52a1\uff0c\u6267\u884c\u8be5\u9879\u76ee\u65f6\u5148\u6267\u884c\u5176\u4ed6\u7684\u9879\u76ee\r\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 main.yml\r\n\u251c\u2500\u2500 tasks         # \u9ed8\u8ba4\u6267\u884c\u7684playbook\r\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 main.yml\r\n\u251c\u2500\u2500 templates     # \u5b58\u653ejinja2\u6a21\u677f\uff0c\u4f7f\u7528template\u6a21\u5757\u65f6\u81ea\u52a8\u83b7\u53d6\r\n\u251c\u2500\u2500 tests\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 inventory\r\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 test.yml\r\n\u2514\u2500\u2500 vars          # \u5b58\u653e\u53d8\u91cf\r\n    \u2514\u2500\u2500 main.yml\r\n<\/code><\/pre>\n<h2>3.3 \u4e00\u4e9b\u5173\u952e\u4ecb\u7ecd<\/h2>\n<p>\u4e00\u3001Ansible Roles\u7684\u4f9d\u8d56\u5173\u7cfb\u8bf4\u660e<\/p>\n<pre><code class=\"language-bash\">`roles`\u5141\u8bb8\u4f60\u518d\u4f7f\u7528roles\u65f6\u81ea\u52a8\u5f15\u5165\u5176\u4ed6\u7684roles\u3002role\u4f9d\u8d56\u5173\u7cfb\u5b58\u50a8\u5728roles\u76ee\u5f55\u4e2dmeta\/main.yml\u6587\u4ef6\u4e2d\u3002\r\n\r\n\u4f8b\u5982\uff1a\u63a8\u9001wordpress\u5e76\u89e3\u538b\uff0c\u524d\u63d0\u6761\u4ef6\uff0c\u5fc5\u987b\u8981\u5b89\u88c5nginx\u548cphp\uff0c\u628a\u670d\u52a1\u8dd1\u8d77\u6765\uff0c\u624d\u80fd\u8fd0\u884cwordpress\u7684\u9875\u9762\uff0c\u6b64\u65f6\u6211\u4eec\u5c31\u53ef\u4ee5\u5728wordpress\u7684roles\u4e2d\u5b9a\u4e49\u4f9d\u8d56nginx\u548cphp\u7684roles<\/code><\/pre>\n<pre><code class=\"language-bash\">[root@m01 roles]# vim \/etc\/ansible\/roles\/wordpress\/meta\/main.yml\r\ndependencies:\r\n  - { role: nginx }\r\n  - { role: php }\r\n\r\n\u5982\u679c\u7f16\u5199\u4e86meta\u76ee\u5f55\u4e0b\u7684main.yml\u6587\u4ef6\uff0c\u90a3\u4e48Ansible\u4f1a\u81ea\u52a8\u5148\u6267\u884cmeta\u76ee\u5f55\u4e2dmain.yml\u6587\u4ef6\u4e2d\u7684dependencies\u6587\u4ef6\uff0c\u5982\u4e0a\u6240\u793a\uff0c\u5c31\u4f1a\u5148\u6267\u884cnginx\u548cphp\u7684\u5b89\u88c5\u3002<\/code><\/pre>\n<p>\u4e8c\u3001Role\u4e2d\u6709\u4e24\u4e2a\u5730\u65b9\u53ef\u4ee5\u5b9a\u4e49\u53d8\u91cf\uff1a<\/p>\n<ul>\n<li>(1).roles\/xxx\/defaults\/main.yml\uff1a\u7528\u4e8e\u5b9a\u4e49Role\u7684\u9ed8\u8ba4\u53d8\u91cf<\/li>\n<li>(2).roles\/xxx\/vars\/main.yml \uff1a\u7528\u4e8e\u5b9a\u4e49\u5176\u5b83\u53d8\u91cf<br \/>\n\u8fd9\u4e24\u4e2a\u6587\u4ef6\u4e4b\u95f4\u7684\u533a\u522b\u5728\u4e8e\uff0cdefaults\/main.yml\u4e2d\u5b9a\u4e49\u7684\u53d8\u91cf\u4f18\u5148\u7ea7\u4f4e\u4e8evars\/main.yml\u4e2d\u5b9a\u4e49\u7684\u53d8\u91cf\u3002\u4e8b\u5b9e\u4e0a\uff0cdefaults\/main.yml\u4e2d\u7684\u53d8\u91cf\u4f18\u5148\u7ea7\u51e0\u4e4e\u662f\u6700\u4f4e\u7684\uff0c\u57fa\u672c\u4e0a\u5176\u5b83\u4efb\u4f55\u5730\u65b9\u5b9a\u4e49\u7684\u53d8\u91cf\u90fd\u53ef\u4ee5\u8986\u76d6\u5b83\u3002<\/li>\n<\/ul>\n<h2>3.4\u3001\u57fa\u4e8eroles\u673a\u5236\u91cd\u6784playbook<\/h2>\n<p>\u57fa\u4e8eroles\u673a\u5236\u5c06https:\/\/egonlin.com\/?p=355\u7b2c\u4e09\u5c0f\u8282\u7684playbook\u8fdb\u884c\u91cd\u6784<br \/>\n<div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/egonlin.com\/wp-content\/uploads\/2021\/07\/image-1712318866628.png'><img class=\"lazyload lazyload-style-2\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  data-original=\"https:\/\/egonlin.com\/wp-content\/uploads\/2021\/07\/image-1712318866628.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"file\" \/><\/div><\/p>\n<p>\u4f60\u53ef\u4ee5git clone <a href=\"https:\/\/gitee.com\/egonlin\/ansible-playbook-test.git\">https:\/\/gitee.com\/egonlin\/ansible-playbook-test.git<\/a><br \/>\n\u628a\u4e4b\u524d\u6211\u4eec\u5199\u7684\u8fd9\u4e2a\u5267\u672c\u62c9\u5230\u672c\u5730\uff0c\u7136\u540e\u7528roles\u5b9e\u73b0\u91cd\u6784<\/p>\n<h3>1.\u914d\u7f6e\u4e3b\u673a\u6e05\u5355<\/h3>\n<pre><code class=\"language-bash\">[root@manager ~]# cat \/etc\/ansible\/hosts\r\n[lb]\r\nlb01 ansible_ssh_pass='1'\r\n\r\n[nfs_server]\r\nnfs ansible_ssh_pass='1'\r\n\r\n[web_group]\r\nweb01 ansible_ssh_pass='1'\r\nweb02 ansible_ssh_pass='1'\r\n\r\n[db_server]\r\ndb01 ansible_ssh_pass='1'\r\n\r\n[www:children]\r\nlb\r\nnfs_server\r\nweb_group\r\ndb_server\r\n<\/code><\/pre>\n<h3>2.\u914d\u7f6ehosts<\/h3>\n<pre><code>[root@manager ~]# cat \/etc\/hosts # \u6dfb\u52a0\u5982\u4e0b\u5185\u5bb9\r\n\r\n192.168.71.12 lb01\r\n192.168.71.13 nfs\r\n192.168.71.14 web01\r\n192.168.71.15 web02\r\n192.168.71.16 db01<\/code><\/pre>\n<h3>3\u3001\u521b\u5efa\u9879\u76ee\u53ca\u5404\u4e2arole<\/h3>\n<pre><code># 1\u3001\u521b\u5efa\u9879\u76ee\u76ee\u5f55\uff0c\u9879\u76ee\u540d\u5c31\u53ebroles\u5427\uff0c\u597d\u7406\u89e3\r\nmkdir \/project\r\nmkdir \/project\/roles\r\n\r\n# 2\u3001\u5728roles\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u7cfb\u5217\u7684role\r\ncd \/project\/roles          # \u5207\u6362\u5230\u5de5\u4f5c\u76ee\u5f55\u4e0b\r\nansible-galaxy init base   # \u57fa\u7840\u4f18\u5316role\r\nansible-galaxy init nfs    # \u90e8\u7f72nfs\u670d\u52a1\u7684role\r\nansible-galaxy init web    # \u90e8\u7f72web\u670d\u52a1\u7684role\r\nansible-galaxy init mysql  # \u90e8\u7f72mysql\u670d\u52a1\u7684role\r\nansible-galaxy init lb     # \u90e8\u7f72lb\u8d1f\u8f7d\u5747\u8861\u670d\u52a1\u7684role\r\nansible-galaxy init wordpress     # \u90e8\u7f72wordpress\u9879\u76ee\u7684role<\/code><\/pre>\n<h3>4\u3001base role<\/h3>\n<pre><code class=\"language-bash\">\u65e2\u7136\u662ftasks\u6587\u4ef6\uff0c\u90a3\u5fc5\u7136\u662f\u53ea\u653etasks\u4e0b\u7684\u5185\u5bb9\u5c31\u597d\u4e86\uff0c\u4f60\u5728tasks\/main.yml\u91cc\u518d\u51fa\u73b0\u5982\u4e0b\u5c42\u7ea7\u662f\u9519\u8bef\u7684\r\n- hosts: all\r\n  tasks:\r\n    - name: \u4efb\u52a11\r\n      ...\r\n    - name: \u4efb\u52a12\r\n      ...\r\n\r\n\u76f4\u63a5\u628a\u4efb\u52a11\u3001\u4efb\u52a12\u6458\u51fa\u6765\u653e\u5165tasks\/main.yml\u5373\u53ef\uff0c\u540e\u9762\u90fd\u662f\u5982\u6b64\r\n[root@m01 roles]# cat base\/tasks\/main.yml \r\n- name: Stop Selinux\r\n  selinux:\r\n    state: disabled\r\n\r\n- name: Stop Firewalld\r\n  systemd:\r\n    name: firewalld\r\n    state: stopped\r\n\r\n- name: Create www Group\r\n  group:\r\n    name: www\r\n    gid: 1666\r\n    state: present\r\n\r\n- name: Create www User\r\n  user:\r\n    name: www\r\n    uid: 1666\r\n    group: www\r\n    shell: \/sbin\/nologin\r\n    create_home: false\r\n    state: present\r\n<\/code><\/pre>\n<h3>5\u3001nfs role<\/h3>\n<p>1\u3001\u51c6\u5907\u6587\u4ef6<\/p>\n<pre><code>[root@m01 roles]# cat nfs\/files\/exports.txt\r\n\/data 192.168.71.0\/24(rw,sync,all_squash)<\/code><\/pre>\n<p>2\u3001\u7f16\u5199tasks<\/p>\n<pre><code>[root@m01 roles]# cat nfs\/tasks\/main.yml \r\n- name: Install nfs-util\r\n  yum:\r\n    name: nfs*\r\n    state: present\r\n\r\n- name: mkdir \/data\r\n  file:\r\n    path: \"\/data\"\r\n    state: directory\r\n\r\n- name: Config nfs\r\n  copy:\r\n    src: \"exports.txt\" # \u76f4\u63a5\u5f15\u7528\u6587\u4ef6\u5373\u53ef\r\n    dest: \/etc\/exports\r\n\r\n- name: Start nfs-server\r\n  systemd:\r\n    name: nfs-server\r\n    state: restarted\r\n    enabled: true\r\n<\/code><\/pre>\n<h3>6 web role<\/h3>\n<p>\u90e8\u7f72\u4e24\u53f0web\u4e0a\u7684nginx+php\u73af\u5883\uff0c\u5e76\u4e14\u6302\u8f7d\u597dnfs\u5171\u4eab\u5b58\u50a8<\/p>\n<h4>1\uff09\u51c6\u5907\u5305\u548c\u914d\u7f6e\u6587\u4ef6<\/h4>\n<p>cd \/project\/roles<br \/>\n1\u3001nginx\u7684\u5b89\u88c5\u6e90\u6587\u4ef6<\/p>\n<pre><code>cat &gt; web\/files\/nginx.repo &lt;&lt; \"EOF\"\r\n[nginx-stable]\r\nname=nginx stable repo\r\nbaseurl=http:\/\/nginx.org\/packages\/centos\/$releasever\/$basearch\/\r\ngpgcheck=1\r\nenabled=1\r\ngpgkey=https:\/\/nginx.org\/keys\/nginx_signing.key\r\nmodule_hotfixes=true\r\n\r\n[nginx-mainline]\r\nname=nginx mainline repo\r\nbaseurl=http:\/\/nginx.org\/packages\/mainline\/centos\/$releasever\/$basearch\/\r\ngpgcheck=1\r\nenabled=0\r\ngpgkey=https:\/\/nginx.org\/keys\/nginx_signing.key\r\nmodule_hotfixes=true\r\n\r\nEOF<\/code><\/pre>\n<p>2\u3001nginx\u8f6c\u53d1php-fpm\u7684\u914d\u7f6e<\/p>\n<pre><code>cat &gt; web\/files\/myweb.conf &lt;&lt; \"EOF\"\r\nserver {\r\n    listen       8181;\r\n    server_name  localhost;\r\n    location \/ {\r\n        root   \/usr\/share\/nginx\/html;\r\n        index index.php index.html;\r\n    }\r\n    location ~ \\.php$ {\r\n        fastcgi_pass   127.0.0.1:9000;\r\n        fastcgi_param  SCRIPT_FILENAME \/usr\/share\/nginx\/html$fastcgi_script_name;\r\n        fastcgi_param HTTPS on;\r\n        include        fastcgi_params;\r\n    }\r\n}\r\nEOF<\/code><\/pre>\n<p>3\u3001\u51c6\u5907\u597dphp-fpm\u7684\u914d\u7f6e\u6587\u4ef6<\/p>\n<pre><code>cat &gt; web\/files\/www.conf &lt;&lt; \"EOF\"\r\n[www]\r\nuser = www\r\ngroup = www\r\nlisten = 127.0.0.1:9000\r\nlisten.allowed_clients = 127.0.0.1\r\npm = dynamic\r\npm.max_children = 50\r\npm.start_servers = 5\r\npm.min_spare_servers = 5\r\npm.max_spare_servers = 35\r\nslowlog = \/var\/opt\/remi\/php74\/log\/php-fpm\/www-slow.log\r\nphp_admin_value[error_log] = \/var\/opt\/remi\/php74\/log\/php-fpm\/www-error.log\r\nphp_admin_flag[log_errors] = on\r\nphp_value[soap.wsdl_cache_dir]  = \/var\/opt\/remi\/php74\/lib\/php\/wsdlcache\r\nEOF<\/code><\/pre>\n<p>4\u3001\u67e5\u770b\u5982\u4e0b<\/p>\n<pre><code>[root@m01 roles]# ls web\/files\/\r\nmyweb.conf  nginx.repo  www.conf<\/code><\/pre>\n<h4>2\uff09\u7f16\u5199\u90e8\u7f72php-fpm+nginx\u7684\u5267\u672c<\/h4>\n<pre><code>[root@m01 roles]# cat web\/tasks\/main.yml \r\n# 1\u3001\u5b89\u88c5php\r\n- name: Gather OS version\r\n  command: cat \/etc\/redhat-release\r\n  register: os_version\r\n\r\n- name: Extract major version from OS version\r\n  set_fact:\r\n    os_major_version: \"{{ os_version.stdout.split()[3] | regex_replace('\\\\..*$', '') }}\"\r\n- name: Extract minor version from OS version\r\n  set_fact:\r\n    os_minor_version: \"{{ os_version.stdout.split()[3] | regex_replace('^[^.]*\\\\.', '') }}\"\r\n\r\n- name: Install rpm package for CentOS 7.9\r\n  yum:\r\n    name: http:\/\/rpms.remirepo.net\/enterprise\/remi-release-7.rpm\r\n    state: latest\r\n  when: os_major_version == '7' and os_minor_version == '9.2009'\r\n\r\n- name: Install rpm package for CentOS 9.3\r\n  yum:\r\n    name: http:\/\/rpms.remirepo.net\/enterprise\/remi-release-9.3.rpm\r\n    state: latest\r\n  when: os_major_version == '9' and os_minor_version == '3'\r\n\r\n- name: Install php-fpm\r\n  yum:\r\n    name: \r\n      - 'php74-php-pdo'\r\n      - 'php74-php-mbstring'\r\n      - 'php74-php-cli'\r\n      - 'php74-php-fpm'\r\n      - 'php74-php-mysqlnd'\r\n    state: latest\r\n\r\n- name: Config php-fpm\r\n  copy:\r\n    src: www.conf\r\n    dest: \/etc\/opt\/remi\/php74\/php-fpm.d\/www.conf\r\n  notify: restart_php\r\n\r\n- name: Start php-fpm\r\n  systemd:\r\n    name: php74-php-fpm\r\n    state: restarted\r\n    enabled: true\r\n\r\n#2\u3001\u5b89\u88c5nginx\uff0c\u914d\u7f6enginx\u4ee3\u7406php-fpm\r\n- name: copy nginx.repo\r\n  copy:\r\n    src: nginx.repo\r\n    dest: \/etc\/yum.repos.d\/nginx.repo\r\n\r\n- name: Install nginx\r\n  yum:\r\n    name: nginx\r\n    state: latest\r\n\r\n- name: Config nginx\r\n  copy:\r\n    src: myweb.conf\r\n    dest: \/etc\/nginx\/conf.d\/myweb.conf\r\n  notify: restart_nginx\r\n\r\n- name: Start nginx server\r\n  systemd:\r\n    name: nginx\r\n    state: restarted\r\n    enabled: true\r\n\r\n#3\u3001\u914d\u7f6e\u6240\u6709web\u670d\u52a1\u6302\u8f7dnfs\r\n- name: \u5b89\u88c5nfs\r\n  yum:\r\n    name: nfs-utils\r\n    state: latest\r\n\r\n- name: \u6302\u8f7d\r\n  mount:\r\n    path: \/usr\/share\/nginx\/html\r\n    src: \"{{ nfs_share_dir }}\"\r\n    fstype: nfs\r\n    opts: defaults\r\n    state: mounted\r\n<\/code><\/pre>\n<p>\u914d\u7f6e\u89e6\u53d1\u5668handler<\/p>\n<pre><code>[root@m01 roles]# cat web\/handlers\/main.yml \r\n- name: restart_php\r\n  systemd:\r\n    name: php74-php-fpm\r\n    state: restarted\r\n\r\n- name: restart_nginx\r\n  systemd:\r\n    name: nginx\r\n    state: restarted<\/code><\/pre>\n<p>\u521b\u5efa\u53d8\u91cf<\/p>\n<pre><code>[root@m01 roles]# cat web\/vars\/main.yml\r\nnfs_share_dir: \"192.168.71.13:\/data\"<\/code><\/pre>\n<h3>7 mysql role<\/h3>\n<p>\u5b89\u88c5mysql_db\u6a21\u5757<\/p>\n<pre><code>ansible-galaxy collection install community.mysql<\/code><\/pre>\n<p>\u7f16\u5199\u5267\u672c<\/p>\n<pre><code>[root@m01 roles]# cat mysql\/tasks\/main.yml \r\n- name: Download PyMySQL tar.gz\r\n  get_url:\r\n\turl: https:\/\/files.pythonhosted.org\/packages\/44\/39\/6bcb83cae0095a31b6be4511707fdf2009d3e29903a55a0494d3a9a2fac0\/PyMySQL-0.8.1.tar.gz\r\n\tdest: \/tmp\/PyMySQL-0.8.1.tar.gz\r\n\r\n- name: Extract PyMySQL tar.gz\r\n  unarchive:\r\n\tsrc: \/tmp\/PyMySQL-0.8.1.tar.gz\r\n\tdest: \/tmp\/\r\n\tremote_src: yes\r\n\r\n- name: Install PyMySQL\r\n  command:\r\n\tcmd: \"python setup.py install\"\r\n\tchdir: \"\/tmp\/PyMySQL-0.8.1\"\r\n\t\r\n\r\n\r\n- name: clear mysql\r\n  shell: \"yum remove mysql* -y\"\r\n  ignore_errors: True\r\n \r\n- name: Install mariadb\r\n  yum:\r\n    name: mariadb*\r\n    state: latest\r\n \r\n- name: init maridb\r\n  shell: \"rm -rf \/var\/lib\/mysql\/*\"\r\n \r\n- name: Start mariadb\r\n  systemd:\r\n    name: mariadb\r\n    state: restarted\r\n    enabled: true\r\n \r\n \r\n- name: create database\r\n  mysql_db:\r\n    # root\u767b\u5f55localhost\u4e0d\u5141\u8bb8\uff0c\u9700\u8981\u7528\u5957\u63a5\u5b57\u767b\u5f55\r\n    login_unix_socket: \/var\/lib\/mysql\/mysql.sock\r\n    # \u5f15\u7528\u53d8\u91cf\u540d\u5fc5\u987b\u52a0\u5f15\u53f7\uff0c\u5426\u5219\u62a5\u9519\r\n    name: \"{{ my_db.name }}\"\r\n    state: present\r\n    encoding: \"{{ my_db.encoding }}\"\r\n \r\n- name: grant all on *.* to 'bob'@'192.168.71.%' identified by '12345';\r\n  mysql_user:\r\n    login_unix_socket: \/var\/lib\/mysql\/mysql.sock\r\n    # \u5f15\u7528\u53d8\u91cf\u540d\u5fc5\u987b\u52a0\u5f15\u53f7\uff0c\u5426\u5219\u62a5\u9519\r\n    name: \"{{ my_user.name }}\"\r\n    host: \"{{ my_user.host }}\"\r\n    password: \"{{ my_user.password }}\"\r\n    priv: \"{{ my_user.priv }}\"\r\n    state: present\r\n<\/code><\/pre>\n<p>\u521b\u5efa\u53d8\u91cf\u6587\u4ef6<\/p>\n<pre><code>[root@m01 roles]# cat mysql\/vars\/main.yml\r\nmy_db:\r\n  name: wordpress\r\n  encoding: utf8mb4\r\n\r\nmy_user:\r\n  name: bob\r\n  host: 192.168.71.%\r\n  password: 12345\r\n  priv: '*.*:ALL'\r\n<\/code><\/pre>\n<h3>8 lb role<\/h3>\n<p>1) \u51c6\u5907\u6587\u4ef6<br \/>\n\u51c6\u5907nginx.repo<\/p>\n<pre><code>cat &gt; lb\/files\/nginx.repo &lt;&lt; \"EOF\"\r\n[nginx-stable]\r\nname=nginx stable repo\r\nbaseurl=http:\/\/nginx.org\/packages\/centos\/$releasever\/$basearch\/\r\ngpgcheck=1\r\nenabled=1\r\ngpgkey=https:\/\/nginx.org\/keys\/nginx_signing.key\r\nmodule_hotfixes=true\r\n\r\n[nginx-mainline]\r\nname=nginx mainline repo\r\nbaseurl=http:\/\/nginx.org\/packages\/mainline\/centos\/$releasever\/$basearch\/\r\ngpgcheck=1\r\nenabled=0\r\ngpgkey=https:\/\/nginx.org\/keys\/nginx_signing.key\r\nmodule_hotfixes=true\r\n\r\nEOF<\/code><\/pre>\n<p>\u51c6\u5907\u8bc1\u4e66<\/p>\n<pre><code>openssl genrsa -out server.key 2048 \r\nopenssl req -new -x509 -days 3650 -key server.key -out server.crt -subj \"\/C=CH\/ST=mykey\/L=mykey\/O=mykey\/OU=mykey\/CN=domain1\/CN=www.egon.com\/CN=domain3\"<\/code><\/pre>\n<p>\u653e\u7f6e\u8bc1\u4e66\u5230lb\/files\u76ee\u5f55\u4e0b<\/p>\n<pre><code>[root@m01 roles]# mv server.* lb\/files\/<\/code><\/pre>\n<p>\u51c6\u5907\u914d\u7f6e\u6587\u4ef6<\/p>\n<pre><code>cat &gt; lb\/files\/nginx.conf &lt;&lt; \"EOF\"\r\nuser nginx;\r\nworker_processes auto;\r\nerror_log \/var\/log\/nginx\/error.log;\r\npid \/run\/nginx.pid;\r\ninclude \/usr\/share\/nginx\/modules\/*.conf;\r\nevents {\r\n    worker_connections 1024;\r\n}\r\nhttp {\r\n    upstream webserver {\r\n      server 192.168.71.14:8181;\r\n      server 192.168.71.15:8181;\r\n    }\r\n    server {\r\n        listen 443 ssl;\r\n        server_name www.egon.com 192.168.71.12;\r\n        ssl_certificate \/etc\/nginx\/ssl_key\/server.crt;\r\n        ssl_certificate_key \/etc\/nginx\/ssl_key\/server.key;\r\n\r\n        location \/ {\r\n            proxy_pass  http:\/\/webserver;\r\n           # \u628a\u771f\u5b9e\u7684\u8bbf\u95ee\u8005ip\u53d1\u7ed9\u540e\u7aefweb\uff0c\u540e\u7aefweb\u4f1a\u636e\u6b64\u6765\u62fc\u63a5\u9759\u6001\u6587\u4ef6\u7684url\u5730\u5740\u4ee5\u4fbf\u8ba9\u8bbf\u95ee\u8005\u6d4f\u89c8\u5668\u53d1\u8d77\u4e8c\u6b21\u8bf7\u6c42\r\n           # \u5982\u679c\u6ca1\u6709\u4e0b\u9762\u7684\u8fd9\u6bb5\u5185\u5bb9\uff0c\u540e\u7aefweb\u4f1a\u5c06\u9759\u6001\u8d44\u6e90\u7684url\u5730\u5740\u62fc\u6210http:\/\/webserver\/static\/img\/1.jpg\u7684\u5f62\u5f0f\uff0c\u5bfc\u81f4\u8bbf\u95ee\u8005\u6d4f\u89c8\u5668\u4e8c\u6b21\u8bbf\u95ee\u5931\u8d25\r\n           proxy_set_header X-Real-IP $remote_addr;\r\n           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\r\n           proxy_set_header Host $http_host;\r\n           proxy_next_upstream error timeout http_500 http_502 http_503 http_504 http_403 http_404;\r\n        }\r\n    }\r\n    server {\r\n        listen 80;\r\n        server_name 192.168.71.12 www.egon.com;\r\n\r\n        rewrite (.*) https:\/\/$server_name$1;\r\n    }\r\n}\r\nEOF<\/code><\/pre>\n<p>\u6587\u4ef6\u603b\u5171\u8fd9\u4e48\u591a<\/p>\n<pre><code>[root@m01 roles]# ls lb\/files\/\r\nnginx.conf  nginx.repo  server.crt  server.key<\/code><\/pre>\n<p>\u7f16\u5199\u5267\u672c<\/p>\n<pre><code>[root@m01 roles]# cat lb\/tasks\/main.yml \r\n#1\u3001\u5b89\u88c5nginx\uff0c\u914d\u7f6enginx\u8d1f\u8f7d\u5747\u8861\r\n- name: clear nginx\r\n  shell: &gt;\r\n    yum remove nginx* -y ; rm -rf \/etc\/nginx \/usr\/share\/nginx\r\n\r\n- name: copy nginx.repo\r\n  copy:\r\n    src: nginx.repo\r\n    dest: \/etc\/yum.repos.d\/nginx.repo\r\n\r\n- name: Install nginx\r\n  yum:\r\n    name: nginx\r\n    state: latest\r\n\r\n- name: Create dir\r\n  file:\r\n    path: \/etc\/nginx\/ssl_key\r\n    state: directory\r\n\r\n- name: copy multiple files\r\n  copy:\r\n    src: \"{{ item.src }}\"\r\n    dest: \"{{ item.dest }}\"\r\n  with_items:\r\n    - { src: 'nginx.conf', dest: '\/etc\/nginx\/nginx.conf'}\r\n    - { src: 'server.crt', dest: '\/etc\/nginx\/ssl_key\/server.crt'}\r\n    - { src: 'server.key', dest: '\/etc\/nginx\/ssl_key\/server.key'}\r\n  notify: restart_nginx\r\n\r\n- name: Start nginx server\r\n  systemd:\r\n    name: nginx\r\n    state: restarted\r\n    enabled: true\r\n<\/code><\/pre>\n<p>\u914d\u7f6e\u89e6\u53d1\u5668<\/p>\n<pre><code>[root@m01 roles]# cat lb\/handlers\/main.yml \r\n- name: restart_nginx\r\n  systemd:\r\n    name: nginx\r\n    state: restarted<\/code><\/pre>\n<h3>9 wordpress role<\/h3>\n<p>\u51c6\u5907\u6587\u4ef6<br \/>\n1\u3001\u5b89\u88c5\u5305<\/p>\n<pre><code>wget https:\/\/wordpress.org\/latest.zip\r\nmv latest.zip  wordpress\/files\/<\/code><\/pre>\n<p>2\u3001\u51c6\u5907\u597d\u914d\u7f6e\u6587\u4ef6(\u914d\u7f6e\u4e0a\u6570\u636e\u5e93\u76f8\u5173\u4fe1\u606f)<\/p>\n<pre><code>cat &gt; wordpress\/files\/wp-config.php &lt;&lt; \"EOF\"\r\n\r\n&lt;?php\r\ndefine( 'DB_NAME', 'wordpress' );\r\ndefine( 'DB_USER', 'bob' );\r\ndefine( 'DB_PASSWORD', '12345' );\r\ndefine( 'DB_HOST', '192.168.71.16' );\r\ndefine( 'DB_CHARSET', 'utf8mb4' );\r\ndefine( 'DB_COLLATE', '' );\r\n\r\ndefine( 'AUTH_KEY',         'put your unique phrase here' );\r\ndefine( 'SECURE_AUTH_KEY',  'put your unique phrase here' );\r\ndefine( 'LOGGED_IN_KEY',    'put your unique phrase here' );\r\ndefine( 'NONCE_KEY',        'put your unique phrase here' );\r\ndefine( 'AUTH_SALT',        'put your unique phrase here' );\r\ndefine( 'SECURE_AUTH_SALT', 'put your unique phrase here' );\r\ndefine( 'LOGGED_IN_SALT',   'put your unique phrase here' );\r\ndefine( 'NONCE_SALT',       'put your unique phrase here' );\r\n\r\n$table_prefix = 'wp_';\r\ndefine( 'WP_DEBUG', false );\r\n\r\nif ( ! defined( 'ABSPATH' ) ) {\r\n    define( 'ABSPATH', __DIR__ . '\/' );\r\n}\r\n\r\nrequire_once ABSPATH . 'wp-settings.php';\r\n\r\nEOF<\/code><\/pre>\n<p>\u7f16\u5199\u5267\u672c(\u89e3\u538b\u5230nfs\u5171\u4eab\u76ee\u5f55\u91cc\u5c31\u53d1\u5e03\u7ed9\u4e86\u6240\u6709\u7684web\u670d\u52a1)<\/p>\n<pre><code>[root@m01 roles]# cat lb\/handlers\/main.yml \r\nme: restart_nginx\r\n  systemd:\r\n    name: nginx\r\n    state: restarted\r\n[root@m01 roles]# vi wordpress\/tasks\/main.yml \r\n[root@m01 roles]# cat wordpress\/tasks\/main.yml \r\n- name: mkdir \/data\r\n  copy:\r\n    src: \"latest.zip\"\r\n    dest: \"\/data\"\r\n\r\n- name: install unzip\r\n  yum:\r\n    name: unzip\r\n    state: present\r\n\r\n- name: \u53d1\u5e03\r\n  shell: unzip \/data\/latest.zip -d \/data\r\n\r\n- name: \u4f20\u9001\u914d\u7f6e\r\n  copy:\r\n    src: \"wp-config.php\"\r\n    dest: \"\/data\/wordpress\/wp-config.php\"\r\n<\/code><\/pre>\n<h3>10 \u6574\u5408\u4e3a\u4e00\u4e2aplaybook<\/h3>\n<p>\u7f16\u5199\u4e00\u4e2apalybook\u5267\u672c\uff0c\u5267\u672c\u91cc\u5f15\u5165\u5404\u4e2a\u5b50role\uff0c\u8fd0\u884c\u7684\u65f6\u5019\u8fd0\u884c\u8fd9\u4e00\u4e2aplabook\u5373\u53ef<\/p>\n<pre><code>[root@m01 roles]# cat \/project\/roles\/run.yml \r\n- name: \u4f18\u5316\u90e8\u5206\r\n  hosts: all\r\n  roles:\r\n    - base\r\n\r\n- name: \u5b89\u88c5nfs\r\n  hosts: nfs_server\r\n  roles:\r\n    - nfs\r\n\r\n- name: \u5b89\u88c5web\r\n  hosts: web_group\r\n  roles: # \u5176\u5b9e\u4f60\u53ef\u4ee5\u5c06\u5b89\u88c5web\u8fdb\u4e00\u6b65\u7ec6\u5206\u4e3anginx role\u4e0ephp role\uff0c\u7559\u7ed9\u4f60\u4f5c\u4e1a\u4e86\r\n    - web\r\n\r\n- name: \u5b89\u88c5\u6570\u636e\u5e93\r\n  hosts: db_server\r\n  roles:\r\n    - mysql\r\n\r\n- name: \u914d\u7f6e\u8d1f\u8f7d\u5747\u8861\u548c\u9ad8\u53ef\u7528\r\n  hosts: lb_server\r\n  roles:\r\n    - lb\r\n    #- keepalived  # \u9ad8\u53ef\u7528role\u7559\u7ed9\u4f60\u6765\u5b9e\u73b0\r\n\r\n- name: \u53d1\u5e03wordpress\u9879\u76ee\r\n  hosts: nfs_server\r\n  roles:\r\n    - wordpress\r\n<\/code><\/pre>\n<p>\u8865\u5145\uff1a\u5404\u4e2a\u5b50role\u91cc\u7684hosts\u5176\u5b9e\u4e0d\u7528\u6307\u5b9a\uff0crun.yml\u5df2\u7ecf\u6307\u5b9a\u4e86<\/p>\n<p>\u6267\u884c<\/p>\n<pre><code>ansible-playbook \/project\/roles\/run.yml <\/code><\/pre>\n<h3>11 \u6d4b\u8bd5<\/h3>\n<p>\u8fd0\u884c\u51fa\u9519\uff0c\u4fee\u590d\u540e\u53ef\u4ee5\u76f4\u63a5\u91cd\u65b0\u6267\u884c\uff0c\u56e0\u4e3a\u662f\u5e42\u7b49\u7684\uff0c\u6240\u4ee5\u4e0d\u5fc5\u62c5\u5fc3\u6709\u4ec0\u4e48 \u5f71\u54cd<br \/>\n\u800c\u4e14\u91cd\u590d\u6267\u884c\u540e\uff0c\u56e0\u4e3a\u4e4b\u524d\u4e00\u4e9b\u6b65\u9aa4\u5df2\u7ecf\u5b8c\u6210\u4e86\uff0c\u4f1a\u5feb\u4e00\u4e9b<\/p>\n<p>\u672c\u5730\u6dfb\u52a0\u89e3\u6790<\/p>\n<pre><code># C:\\Windows\\System32\\drivers\\etc\r\n192.168.71.12 www.egon.com<\/code><\/pre>\n<p>\u8bbf\u95ee\u8d1f\u8f7d\u5747\u8861\u5730\u5740\uff1a<a href=\"http:\/\/192.168.71.12\/wordpress\">http:\/\/192.168.71.12\/wordpress<\/a><br \/>\n<div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/egonlin.com\/wp-content\/uploads\/2021\/07\/image-1712327894672.png'><img class=\"lazyload lazyload-style-2\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  data-original=\"https:\/\/egonlin.com\/wp-content\/uploads\/2021\/07\/image-1712327894672.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"file\" \/><\/div><\/p>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/egonlin.com\/wp-content\/uploads\/2021\/07\/image-1712327932492.png'><img class=\"lazyload lazyload-style-2\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  data-original=\"https:\/\/egonlin.com\/wp-content\/uploads\/2021\/07\/image-1712327932492.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"file\" \/><\/div><\/p>\n<h3>12 \u4ee3\u7801\u5730\u5740<\/h3>\n<p>\u672c\u8282\u8bfe\u7a0b\u4ee3\u7801\u90fd\u653e\u5230\u4e86\u8fd9\u91cc\uff1a<a href=\"https:\/\/gitee.com\/egonlin\/ansible-playbook-test\">https:\/\/gitee.com\/egonlin\/ansible-playbook-test<\/a><br \/>\n\u76ee\u5f55\u4e0b\u6709\u4e00\u4e2ahosts.txt\u5185\u8bb0\u5f55\u7740\u4e0e\u672c\u8282\u5b9e\u9a8c\u76f8\u5173\u7684\u4e24\u4e2a\u6587\u4ef6\u5185\u5bb9<\/p>\n<pre><code>\/etc\/ansible\/hosts\r\n\/etc\/hosts<\/code><\/pre>\n<p>\u7ec3\u4e60\uff1a<a href=\"https:\/\/egonlin.com\/?p=9884\">https:\/\/egonlin.com\/?p=9884<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4e00\u3001\u5267\u672c\u91cd\u7528\u4e0e\u89e3\u8026 \u5728\u5927\u578b\u9879\u76ee\u4e2d\uff0c\u6d89\u53ca\u5230\u7684\u529f\u80fd\u6a21\u5757\u591a\u4e14\u6742\uff0c\u4f60\u4e0d\u53ef\u80fd\u5168\u90e8\u653e\u5165\u4e00\u4e2aplaybook\u4e2d \u4e3a\u4e86\u65b9\u4fbf\u7ba1\u7406 [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[56],"tags":[60,21,19,22,57,20],"_links":{"self":[{"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/posts\/363"}],"collection":[{"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/egonlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=363"}],"version-history":[{"count":21,"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/posts\/363\/revisions"}],"predecessor-version":[{"id":11285,"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/posts\/363\/revisions\/11285"}],"wp:attachment":[{"href":"https:\/\/egonlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=363"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/egonlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=363"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/egonlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=363"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}