{"id":144,"date":"2024-10-30T18:04:08","date_gmt":"2024-10-30T10:04:08","guid":{"rendered":"https:\/\/zhoujibin.com\/?p=144"},"modified":"2024-10-30T18:04:09","modified_gmt":"2024-10-30T10:04:09","slug":"ansible%e5%ae%9e%e7%8e%b0%e8%87%aa%e5%8a%a8%e5%8c%96%e9%83%a8%e7%bd%b2","status":"publish","type":"post","link":"https:\/\/zhoujibin.com\/?p=144","title":{"rendered":"Ansible\u5b9e\u73b0\u81ea\u52a8\u5316\u90e8\u7f72"},"content":{"rendered":"\n<p>[TOC]<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">\u8f6f\u4ef6\u5b89\u88c5<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">\u6267\u884c\u5b89\u88c5\u547d\u4ee4<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>apt install ansible\n\n# \u67e5\u770b\u7248\u672c\nansible --version\n# \u7ed3\u679c\nansible &#91;core 2.16.6]\n  config file = \/etc\/ansible\/ansible.cfg\n  configured module search path = &#91;'\/root\/.ansible\/plugins\/modules', '\/usr\/share\/ansible\/plugins\/modules']\n  ansible python module location = \/usr\/lib\/python3\/dist-packages\/ansible\n  ansible collection location = \/root\/.ansible\/collections:\/usr\/share\/ansible\/collections\n  executable location = \/usr\/bin\/ansible\n  python version = 3.10.6 (main, Nov 14 2022, 16:10:14) &#91;GCC 11.3.0] (\/usr\/bin\/python3)\n  jinja version = 3.0.3\n  libyaml = True\n\n# \u6e29\u99a8\u63d0\u793a\uff1a\u82e5\u88c5\u5931\u8d25\uff0c\u63d0\u793a`python3-crypto : Depends: python3 (&lt; 3.9) but 3.10.6-1~22.04 is to be installed`\uff0c\u53ef\u4f7f\u7528\u4e0b\u8ff0\u547d\u4ee4\u5148\u66f4\u65b0\u4ed3\u5e93\u5730\u5740\uff0c\u518d\u6267\u884c\u5b89\u88c5\u547d\u4ee4\napt update\napt install software-properties-common\napt-add-repository --yes --update ppa:ansible\/ansible\napt install ansible<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u76ee\u5f55\u8bf4\u660e<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u76ee\u5f55<\/th><th>\u5907\u6ce8<\/th><\/tr><\/thead><tbody><tr><td>\/etc\/ansible\/<\/td><td>\u4e3b\u76ee\u5f55<\/td><\/tr><tr><td>\/etc\/ansible\/ansible.cfg<\/td><td>\u914d\u7f6e\u6587\u4ef6\uff0c\u5982\u516c\u5171\u914d\u7f6e\uff0c\u683c\u5f0f\uff1a<br>[default]<br>log_path=\/var\/log\/ansible.log<\/td><\/tr><tr><td>\/etc\/ansible\/hosts<\/td><td>\u9ed8\u8ba4\u7684\u8d44\u6e90\u8bbf\u95ee\u6e05\u5355\uff0c\u5373\u53ef\u901a\u4fe1\u4e3b\u673a\u5217\u8868\uff0c\u53ef\u901a\u8fc7ansible.cfg\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684inventory\u5c5e\u6027\u66f4\u6539<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\">\u914d\u7f6e\u514d\u5bc6\u767b\u5f55(\u53ef\u9009)<\/h1>\n\n\n\n<p>\u4e0b\u8ff0\u6b65\u9aa4\u662f\u4f7f\u7528root\u7528\u6237\u64cd\u4f5c\u65f6\u7684\u8bb0\u5f55<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># \u5982\uff0c\u5728A\u673a\u5668\u4e0a\u4f7f\u7528 ssh-keygen \u547d\u4ee4\u751f\u6210id_rsa\u3001id_rsa.pub\nssh-keygen\n# \u76f4\u63a5\u4f7f\u7528\u9ed8\u8ba4\u7684\uff0c\u4e0b\u4e00\u6b65\u5373\u53ef\n# \u67e5\u770b\u5bc6\u5319\ncat ~\/.ssh\/id_rsa.pub\n# \u5728B\u673a\u5668\u4e0a\u914d\u7f6eA\u673a\u5668\u751f\u6210\u7684\u5bc6\u5319\n# \u5728\u9700\u8981\u514d\u767b\u5f55\u7684\u96c6\u7fa4\u4e0a\u5c06\u4e0a\u8ff0\u6b65\u9aa4\u751f\u6210\u7684id_rsa.pub\u7684\u5185\u5bb9\u62f7\u8d1d\u5230authorized_keys\u6587\u4ef6\u4e2d\u5373\u53ef\nvim ~\/.ssh\/authorized_keys\n# \u914d\u7f6e\u5b8c\u6bd5\u5373\u53ef\u5728B\u673a\u5668\u4e0a\u76f4\u63a5\u4f7f\u7528ssh\u547d\u4ee4\u514d\u5bc6\u767b\u5f55A\u673a\u5668\nssh A<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">\u4fee\u6539\u9ed8\u8ba4\u914d\u7f6e<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code># \u65b0\u589e\u65e5\u5fd7\u5b58\u50a8\u6587\u4ef6\ntouch \/etc\/ansible\/ansible.log\nchmod 600 \/etc\/ansible\/ansible.log\n# \u6dfb\u52a0\u914d\u7f6e\nvim \/etc\/ansible\/ansible.cfg\n# \u5728&#91;defaults]\u4e0b\u6dfb\u52a0\u5982\u4e0b\u914d\u7f6e\n# \u914d\u7f6e\u65e5\u5fd7\u8def\u5f84\nlog_path=\/etc\/ansible\/ansible.log\n# \u4e0d\u68c0\u6d4b\u4e3b\u673a\u5bc6\u94a5\uff0c\u9ed8\u8ba4\u4e3aTrue\uff0c\u5f00\u542f\u540e\u8fde\u63a5\u672c\u5730\u7684ssh\u4f1a\u63d0\u793a\uff1aUsing a SSH password instead of a key is not possible because Host Key checkingis enabl\nhost_key_checking = False\n# \u8fd9\u4e2a\u53ef\u4ee5\u63a7\u5236,\u6267\u884cansible-playbook\u65f6\u662f\u5426\u4f1a\u81ea\u52a8\u9ed8\u8ba4\u5f39\u51fa\u5f39\u51fa\u5bc6\u7801.\u9ed8\u8ba4\u4e3ano::\n# \u914d\u7f6e\u4e86\u514d\u5bc6\u767b\u5f55\uff0c\u6b64\u9009\u9879\u53ef\u4e0d\u7528\u914d\u7f6e\nask_pass=True<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">\u914d\u7f6eInventory<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">\u6e05\u5355\u914d\u7f6e<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt;&gt; \/etc\/ansible\/hosts &lt;&lt; \\EOF\n# \u6307\u5b9a\u5206\u7ec4\u540d\u79f0\uff0c\u5982\uff1acommon_hostname<\/code><\/pre>\n\n\n<p>[common_hostname]<\/p>\n\n\n\n<p>k8s-master ansible_ssh_host=192.168.13.247 ansible_ssh_port=22 ansible_ssh_user=root k8s-worker-01 ansible_ssh_host=192.168.13.16 ansible_ssh_port=22 ansible_ssh_user=root k8s-worker-02 ansible_ssh_host=192.168.13.51 ansible_ssh_port=22 ansible_ssh_user=root EOF<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u914d\u7f6e\u53c2\u6570\u8bf4\u660e<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u53c2\u6570\u540d\u79f0<\/th><th>\u5907\u6ce8<\/th><\/tr><\/thead><tbody><tr><td>ansible_ssh_host<\/td><td>\u5c06\u8981\u8fde\u63a5\u7684\u8fdc\u7a0b\u4e3b\u673a\u540d.\u4e0e\u4f60\u60f3\u8981\u8bbe\u5b9a\u7684\u4e3b\u673a\u7684\u522b\u540d\u4e0d\u540c\u7684\u8bdd,\u53ef\u901a\u8fc7\u6b64\u53d8\u91cf\u8bbe\u7f6e.<\/td><\/tr><tr><td>ansible_ssh_port<\/td><td>ssh\u7aef\u53e3\u53f7.\u5982\u679c\u4e0d\u662f\u9ed8\u8ba4\u7684\u7aef\u53e3\u53f7,\u901a\u8fc7\u6b64\u53d8\u91cf\u8bbe\u7f6e.<\/td><\/tr><tr><td>ansible_ssh_user<\/td><td>\u9ed8\u8ba4\u7684 ssh \u7528\u6237\u540d<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>\u53c2\u8003\uff1a<a href=\"http:\/\/www.ansible.com.cn\/docs\/intro_inventory.html#behavioral-parameters\">Inventory \u53c2\u6570\u7684\u8bf4\u660e<\/a><\/p>\n\n\n\n<h1 class=\"wp-block-heading\">\u7b80\u5355\u6848\u4f8b<\/h1>\n\n\n\n<p>\u82e5\u672a\u914d\u7f6e\u514d\u5bc6\u767b\u5f55\uff0c\u6267\u884c\u4e0b\u8ff0\u547d\u4ee4\u65f6\u9700\u8981\u6dfb\u52a0&#8211;ask-pass\u53c2\u6570\u5e76\u8f93\u5165\u5bc6\u7801<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u67e5\u770b\u8d44\u6e90\u4e3b\u673a\u662f\u5426\u53ef\u4ee5ping\u901a<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code># \u53ef\u4ee5\u7b80\u5199\u4e3a ansible all -m ping\uff0c-m \u9ed8\u8ba4\u503c\u4e3acommand\nansible all -m  ping\n # \u7ed3\u679c\uff1a\n 192.168.13.247 | SUCCESS =&gt; {\n    \"ansible_facts\": {\n        \"discovered_interpreter_python\": \"\/usr\/bin\/python3\"\n    },\n    \"changed\": false,\n    \"ping\": \"pong\"\n}\n192.168.13.51 | SUCCESS =&gt; {\n    \"ansible_facts\": {\n        \"discovered_interpreter_python\": \"\/usr\/bin\/python3\"\n    },\n    \"changed\": false,\n    \"ping\": \"pong\"\n}\n192.168.13.16 | SUCCESS =&gt; {\n    \"ansible_facts\": {\n        \"discovered_interpreter_python\": \"\/usr\/bin\/python3\"\n    },\n    \"changed\": false,\n    \"ping\": \"pong\"\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u8f93\u51fa\u5f53\u524d\u65f6\u95f4\u5230\u76ee\u6807\u4e3b\u673a<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code> ansible all -m shell -a \"date -R &gt; \/root\/date.txt\"<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u91cd\u542f\u76ee\u6807\u4e3b\u673a\u7684redis\u670d\u52a1<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code># state\u53ef\u9009\u503c\uff1areloaded, restarted, started, stopped\nansible ip_group_test -m service -a \"name=redis-7011 state=started\"<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">playbook\u7684\u7b80\u5355\u4f7f\u7528<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">\u670d\u52a1\u5668\u521d\u59cb\u5316<\/h2>\n\n\n\n<p>\u4fee\u6539\u4e3b\u673a\u540d\u79f0\u3001\u65b0\u589e\u7528\u6237\u3001\u914d\u7f6eIP\u548c\u57df\u540d\u6620\u5c04<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u7f16\u5199playbook<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir -p \/etc\/ansible\/playbook\/\nvim \/etc\/ansible\/playbook\/server-init.yaml\n\n# begin\n---\n- hosts: common_hostname\n  vars:\n   hostnames:\n    - ip: 192.168.13.247\n      hostname: k8s-master\n    - ip: 192.168.13.16\n      hostname: k8s-worker-01\n    - ip: 192.168.13.51\n      hostname: k8s-worker-02\n  tasks:\n    - name: \u8bbe\u7f6e\u4e3b\u673a\u540d\u79f0\n     # inventory_hostname \u4e3a\u56fa\u5b9a\u7684\u53d8\u91cf\u540d\uff0c\u4e3a\u5faa\u73af\u4e2d\u5728\/etc\/hosts\u4e2d\u5b9a\u4e49\u7684\u8d44\u6e90\u4e3b\u673a\u540d\n      shell: hostnamectl set-hostname \"{{ inventory_hostname }}\"\n    - name: \u65b0\u5efa test \u7528\u6237\n      user: \n       name: test\n       home: \/home\/test\n       shell: \/bin\/bash\n       # \u8bbe\u7f6e\u5bc6\u7801\uff0c\u6b64\u5904\u9700\u8981\u4f7f\u7528\u52a0\u5bc6\u51fd\u6570\n       password: \"{{ 'test' | password_hash }}\"\n    - name: \u5224\u65ad\u7528\u6237\u662f\u5426\u5b58\u5728 sudo \u6743\u9650\n      shell: grep -c \"test ALL=(ALL) ALL\" \/etc\/sudoers\n     # \u5c06\u7ed3\u679c\u5b58\u50a8\u5728\u53d8\u91cf\u4e2d\n      register: sudo_exist_flag\n      failed_when: sudo_exist_flag.rc == -1\n    - name: \u4e0d\u5b58\u5728sudo\u6743\u9650\u65f6\u8bbe\u7f6esudo\u6743\u9650\n      shell: sed -i '44 a test ALL=(ALL) ALL' \/etc\/sudoers\n      when: sudo_exist_flag.stdout == '0'\n    - name: \u5224\u65ad\/etc\/hosts\u4e2d\u662f\u5426\u5df2\u7ecf\u5b58\u5728ip\u3001\u57df\u540d\u914d\u7f6e\n      shell: grep -c \"{{item.ip}} {{item.hostname}}\" \/etc\/hosts\n      with_items: \"{{hostnames}}\"\n      register: hosts_exist_flag\n      failed_when: hosts_exist_flag.rc == -1\n    - name: \u5b58\u50a8ip\u3001\u57df\u540d\u914d\u7f6e\u662f\u5426\u5b58\u5728\u5224\u65ad\u7ed3\u679c\n      set_fact:\n       match_count: \"{{hosts_exist_flag.results | json_query(query_ip_match_condition) | join('') }}\"\n      vars:\n       query_ip_match_condition: \"&#91;?item.hostname=='{{inventory_hostname}}'].stdout\"\n    - name: \u3010\u5f00\u59cb\u3011\u6dfb\u52a0IP\u3001\u57df\u540d\u914d\u7f6e\n      shell: echo '\\n# ip\u3001\u57df\u540d\u914d\u7f6e begin' &gt;&gt; \/etc\/hosts\n      when: match_count == \"0\"\n    - name: \u6b63\u5728\u914d\u7f6eip\u3001\u57df\u540d\n      shell: echo '{{item.ip}} {{item.hostname}}' &gt;&gt; \/etc\/hosts\n      when: match_count == \"0\"\n      with_items: \"{{hostnames}}\"\n    - name: \u3010\u7ed3\u675f\u3011\u6dfb\u52a0IP\u3001\u57df\u540d\u914d\u7f6e\n      shell: echo '# ip\u3001\u57df\u540d\u914d\u7f6e end' &gt;&gt; \/etc\/hosts\n      when: match_count == \"0\"\n\n# end<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u6267\u884cplaybook<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>absible-playbook \/etc\/ansible\/playbook\/server-init.yaml<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u5176\u4ed6<\/h3>\n\n\n\n<p>\u5bc6\u7801\u52a0\u5bc6\u53c2\u8003\uff1ahttps:\/\/docs.ansible.com\/ansible\/latest\/collections\/ansible\/builtin\/password_hash_filter.html<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">playbook\u4e2dimport\u8bed\u53e5\u7684\u4f7f\u7528<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">\u5bfc\u5165task<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code># \u9700\u8981\u5bfc\u5165\u7684 import-task-demo.yaml\n---\n - name: import task demo\n   shell: echo hello import task demo\n# \u9700\u8981\u5f15\u5165task\u7684\u6587\u4ef6 all-task.yaml\uff0c2\u4e2a\u6587\u4ef6\u5b58\u653e\u5728\u5e73\u7ea7\u76ee\u5f55\n---\n tasks:\n  - name: demo\n    service: \n     name: httpd\n     state: started\n  - import_tasks: import-task-demo.yaml <\/code><\/pre>\n\n\n\n<p>\u53c2\u8003\uff1a<a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/collections\/ansible\/builtin\/import_tasks_module.html\">import_tasks\u7528\u6cd5<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u5bfc\u5165playbook<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code># \u9700\u8981\u5bfc\u5165\u7684 import-playbook-demo.yaml\n---\n tasks:\n  - name: import playbook demo\n    shell: echo hello import playbook demo\n# \u9700\u8981\u5f15\u5165 playbook \u7684\u6587\u4ef6 all-playbook.yaml\uff0c2\u4e2a\u6587\u4ef6\u5b58\u653e\u5728\u5e73\u7ea7\u76ee\u5f55\n---\n tasks:\n  - name: demo\n    service: \n     name: httpd\n     state: started\n- import_playbook: include-playbook-demo.yaml<\/code><\/pre>\n\n\n\n<p>\u53c2\u8003\uff1a<a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/collections\/ansible\/builtin\/import_playbook_module.html\">import_playbook\u7528\u6cd5<\/a><\/p>\n\n\n\n<h1 class=\"wp-block-heading\">playbook\u7684\u4f7f\u7528<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">\u89d2\u8272\uff08Roles\uff09\u8bf4\u660e<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>Roles \u57fa\u4e8e\u4e00\u4e2a\u5df2\u77e5\u7684\u6587\u4ef6\u7ed3\u6784\uff0c\u53bb\u81ea\u52a8\u7684\u52a0\u8f7d\u67d0\u4e9b vars_files\uff0ctasks \u4ee5\u53ca handlers<\/code><\/pre>\n\n\n\n<p>\u8be6\u60c5\u89c1\uff1a<a href=\"http:\/\/www.ansible.com.cn\/docs\/playbooks_roles.html#roles\">Role\u8be6\u89e3<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u670d\u52a1\u5668\u521d\u59cb\u5316\uff08\u8bbe\u7f6e\u4e3b\u673a\u540d\u3001\u5206\u533a\u3001\u78c1\u76d8\u6302\u8f7d\u3001\u65b0\u5efa\u7528\u6237\u3001\u914d\u7f6ehosts\uff09<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u8d44\u6e90\u6e05\u5355<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt;&gt; \/etc\/ansible\/hosts &lt;&lt; \\EOF\n# \u6307\u5b9a\u5206\u7ec4\u540d\u79f0\uff0c\u5982\uff1aserver_init\uff0c\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u8c03\u6574<\/code><\/pre>\n\n\n<p>[server_init]<\/p>\n\n\n\n<p>k8s-master ansible_ssh_host=192.168.13.247 ansible_ssh_port=22 ansible_ssh_user=root k8s-worker-01 ansible_ssh_host=192.168.13.16 ansible_ssh_port=22 ansible_ssh_user=root k8s-worker-02 ansible_ssh_host=192.168.13.51 ansible_ssh_port=22 ansible_ssh_user=root EOF<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u89d2\u8272\u76ee\u5f55<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir -p \/etc\/ansible\/roles\/server-init\/\ncd \/etc\/ansible\/roles\/server-init\/\nmkdir tasks vars<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u53d8\u91cf<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/roles\/server-init\/vars\/main.yaml &lt;&lt; \\EOF\n   hostnames:\n    - ip: 192.168.13.247\n      hostname: k8s-master\n      # \u662f\u5426\u4f7f\u7528\u9ed8\u8ba4\u914d\u7f6e\uff0c\u4e3afalse\u65f6\u5c06\u4f7f\u7528\u81ea\u5b9a\u4e49\u7684fstab\u914d\u7f6e\n      use_default_fstab: true\n      # \u4f7f\u7528\u81ea\u5b9a\u4e49\u6587\u4ef6\u7cfb\u7edf\u5c5e\u6027\uff08use_default_fstab=false\uff09\u65f6\u4e0b\u5217\u503c\u5fc5\u987b\u5b9a\u4e49\n      fstab:\n       file_system: ''\n       mount_point: ''\n       type: ''\n    - ip: 192.168.13.16\n      hostname: k8s-worker-01\n    - ip: 192.168.13.51\n      hostname: k8s-worker-02\n   # \u65b0\u5efa\u7528\u6237\u65f6\u7528\u5230\u7684\u53d8\u91cf\n   add_user:\n    name: test\n    password: test\n    home: \/home\/test\n    shell: \/bin\/bash\n    # \u662f\u5426\u5141\u8bb8\u4f7f\u7528sudo\u547d\u4ee4\n    enable_sudo: true\n   default:\n    # \u9ed8\u8ba4\u7684\u6587\u4ef6\u7cfb\u7edf\u914d\u7f6e\n    fstab:\n    # \u8bbe\u5907\u6216\u6587\u4ef6\u7cfb\u7edf\u6e90\uff1a\u53ef\u4ee5\u662f\u8bbe\u5907\u6587\u4ef6\uff08\u5982\/dev\/sda1\uff09\u3001\u5377\u6807\uff08\u5982LABEL=root\uff09\u3001UUID\uff08\u5982UUID=123e4567-e89b-12d3-a456-426655440000\uff09\u3001\u7f51\u7edc\u6587\u4ef6\u7cfb\u7edf\u8def\u5f84\uff08\u5982nfs:\/\/server\/export\/path\uff09\u7b49\n     file_system: \/dev\/vdb\n    # \u6302\u8f7d\u70b9\uff0c\u5982\uff1a\/home\n     mount_point: \/mnt\/home\n    # \u8bbe\u5907\u4e0a\u6587\u4ef6\u7cfb\u7edf\u7684\u7c7b\u578b\uff0c\u5982ext4, xfs, ntfs, swap, nfs, vfat\u7b49\n     type: 'ext4'\nEOF<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u78c1\u76d8\u5206\u533a\u4efb\u52a1<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u4f7f\u7528\u9ed8\u8ba4\u6587\u4ef6\u7cfb\u7edf\u914d\u7f6e<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/roles\/server-init\/tasks\/disk-partition-default.yaml &lt;&lt; \\EOF\n   - name: \u83b7\u5f97\u5f53\u524d\u4e3b\u673a\u4e0b\u914d\u7f6e\u7684\u6240\u6709\u81ea\u5b9a\u4e49\u53d8\u91cf\n     set_fact:\n      # \u83b7\u53d6\u5f53\u524d\u4e3b\u673a\u81ea\u5b9a\u4e49\u7684\u53d8\u91cf\n      current_host: \"{{hostnames | json_query(query_condition) }}\"\n     vars:\n     # \u67e5\u8be2\u51fa\u7684\u7ed3\u679c\u4e3a\u4e00\u4e2ajson\u6570\u7ec4\uff0c\u53d6\u7b2c\u4e00\u6761\u5373\u53ef\n      query_condition: \"&#91;?hostname=='{{inventory_hostname}}'] | &#91;0]\"\n         # \u81ea\u5b9a\u4e49\u7cfb\u7edf\u6587\u4ef6\u914d\u7f6e\u65f6\u9700\u8981\u5728\u6307\u5b9ahostnames\u4e0b\u914d\u7f6efstab\u5c5e\u6027\n   - fail: \n      msg: \"\u4f7f\u7528\u9ed8\u8ba4\u6587\u4ef6\u7cfb\u7edf\u914d\u7f6e\u65f6\u3010default.fstab.file_system\u3001default.fstab.mount_point\u3001default.fstab.type\u3011\u4e0d\u80fd\u4e3a\u7a7a\"\n     when: current_host.use_default_fstab == true and ((default.fstab.file_system | default('') | length == 0) or (default.fstab.mount_point | default('') | length == 0) or (default.fstab.type | default('') | length == 0))\n   - name: \u67e5\u627e\u6302\u8f7d\u7684\u78c1\u76d8\u76ee\u5f55\n     find:\n       paths: \"{{default.fstab.mount_point}}\"\n     register: valid_mount_point_result\n     when: current_host.use_default_fstab == true\n   - fail:\n     # \u6821\u9a8c\u6302\u8f7d\u7684\u78c1\u76d8\u76ee\u5f55\u662f\u5426\u4e3a\u7a7a \n      msg: '\u9700\u8981\u6302\u8f7d\u7684\u76ee\u5f55\uff1a{{default.fstab.mount_point}} \u4e0d\u4e3a\u7a7a'\n     when: current_host.use_default_fstab == true and valid_mount_point_result.matched &gt; 0\n   - name: \u6821\u9a8c\u865a\u62df\u78c1\u76d8\u662f\u5426\u5b58\u5728\n     stat:\n      path: \"{{default.fstab.file_system}}\"\n     register: valid_fstab_result\n     when: current_host.use_default_fstab == true\n   - fail:\n      msg: \"\u9700\u8981\u6302\u8f7d\u7684\u6587\u4ef6\u7cfb\u7edf\uff1a{{default.fstab.file_system}} \u4e0d\u5b58\u5728\"\n     when: current_host.use_default_fstab == true and valid_fstab_result.stat.exists == false\n   - name: \u65b0\u5efagpt\u5206\u533a\n     parted:\n       device: \"{{default.fstab.file_system}}\"\n       label: gpt\n       number: 1\n       state: present\n       part_type: primary\n     when: current_host.use_default_fstab == true\n   - name: \u683c\u5f0f\u5316\u5206\u533a\n     filesystem:\n      dev: \"{{default.fstab.file_system + '1'}}\"\n      fstype: \"{{default.fstab.type}}\"\n     when: current_host.use_default_fstab == true\n   - name: \u6302\u8f7d\u5206\u533a\n     mount: \n      # \u9ed8\u8ba4\u53d6\u7b2c\u4e00\u4e2a\u5206\u533a\u7684\u8bbe\u5907\u8def\u5f84\uff0c\u548c \u65b0\u5efagpt\u5206\u533a \u4e2d\u7684number\u5c5e\u6027\u4fdd\u6301\u4e00\u81f4\n      src: \"{{default.fstab.file_system + '1'}}\"\n      path: \"{{default.fstab.mount_point}}\"\n      fstype: \"{{default.fstab.type}}\"\n      state: mounted\n     when: current_host.use_default_fstab == true\nEOF<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u4f7f\u7528\u81ea\u5b9a\u4e49\u6587\u4ef6\u7cfb\u7edf\u914d\u7f6e<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/roles\/server-init\/tasks\/disk-partition-custom.yaml &lt;&lt; \\EOF\n   - name: \u83b7\u5f97\u5f53\u524d\u4e3b\u673a\u4e0b\u914d\u7f6e\u7684\u6240\u6709\u81ea\u5b9a\u4e49\u53d8\u91cf\n     set_fact:\n      # \u83b7\u53d6\u5f53\u524d\u4e3b\u673a\u81ea\u5b9a\u4e49\u7684\u53d8\u91cf\n      current_host: \"{{hostnames | json_query(query_condition) }}\"\n     vars:\n     # \u67e5\u8be2\u51fa\u7684\u7ed3\u679c\u4e3a\u4e00\u4e2ajson\u6570\u7ec4\uff0c\u53d6\u7b2c\u4e00\u6761\u5373\u53ef\n      query_condition: \"&#91;?hostname=='{{inventory_hostname}}'] | &#91;0]\"\n   # \u81ea\u5b9a\u4e49\u7cfb\u7edf\u6587\u4ef6\u914d\u7f6e\u65f6\u9700\u8981\u5728\u6307\u5b9ahostnames\u4e0b\u914d\u7f6efstab\u5c5e\u6027\n   - fail: \n      msg: \"\u4f7f\u7528\u81ea\u5b9a\u4e49\u6587\u4ef6\u7cfb\u7edf\u914d\u7f6e\u65f6\u3010{{current_host.hostname}}\u3011\u4e3b\u673a\u53d8\u91cf\u4e2d\u3010fstab.file_system\u3001fstab.mount_point\u3001fstab.type\u3011\u4e0d\u80fd\u4e3a\u7a7a\"\n     when: current_host.use_default_fstab == false and ((current_host.fstab.file_system | default('') | length == 0) or (current_host.fstab.mount_point | default('') | length == 0) or (current_host.fstab.type | default('') | length == 0))\n   - name: \u67e5\u627e\u6302\u8f7d\u7684\u78c1\u76d8\u76ee\u5f55\n     find:\n       paths: \"{{current_host.fstab.mount_point}}\"\n     register: valid_mount_point_result\n     when: current_host.use_default_fstab == false\n   - fail:\n     # \u6821\u9a8c\u6302\u8f7d\u7684\u78c1\u76d8\u76ee\u5f55\u662f\u5426\u4e3a\u7a7a \n      msg: '\u9700\u8981\u6302\u8f7d\u7684\u76ee\u5f55\uff1a{{current_host.fstab.mount_point}} \u4e0d\u4e3a\u7a7a'\n     when: current_host.use_default_fstab == false and valid_mount_point_result.matched &gt; 0\n   - name: \u6821\u9a8c\u865a\u62df\u78c1\u76d8\u662f\u5426\u5b58\u5728\n     stat:\n      path: \"{{current_host.fstab.file_system}}\"\n     register: valid_fstab_result\n     when: current_host.use_default_fstab == false\n   - fail:\n      msg: \"\u9700\u8981\u6302\u8f7d\u7684\u6587\u4ef6\u7cfb\u7edf\uff1a{{current_host.fstab.file_system}} \u4e0d\u5b58\u5728\"\n     when: current_host.use_default_fstab == false and valid_fstab_result.stat.exists == false\n   - name: \u65b0\u5efagpt\u5206\u533a\n     parted:\n       device: \"{{current_host.fstab.file_system}}\"\n       label: gpt\n       number: 1\n       state: present\n       part_type: primary\n     when: current_host.use_default_fstab == false\n   - name: \u683c\u5f0f\u5316\u5206\u533a\n     filesystem:\n      dev: \"{{current_host.fstab.file_system + '1'}}\"\n      fstype: \"{{current_host.fstab.type}}\"\n     when: current_host.use_default_fstab == false\n   - name: \u6302\u8f7d\u5206\u533a\n     mount: \n      # \u9ed8\u8ba4\u53d6\u7b2c\u4e00\u4e2a\u5206\u533a\u7684\u8bbe\u5907\u8def\u5f84\uff0c\u548c \u65b0\u5efagpt\u5206\u533a \u4e2d\u7684number\u5c5e\u6027\u4fdd\u6301\u4e00\u81f4\n      src: \"{{current_host.fstab.file_system + '1'}}\"\n      path: \"{{current_host.fstab.mount_point}}\"\n      fstype: \"{{current_host.fstab.type}}\"\n      state: mounted\n     when: current_host.use_default_fstab == false\nEOF<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u8bbe\u7f6e\u4e3b\u673a\u540d\u79f0\u4efb\u52a1<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/roles\/server-init\/tasks\/set-hostname.yaml &lt;&lt; \\EOF\n    - name: \u8bbe\u7f6e\u4e3b\u673a\u540d\u79f0\n      # inventory_hostname \u4e3a\u56fa\u5b9a\u7684\u53d8\u91cf\u540d\uff0c\u4e3a\u5faa\u73af\u4e2d\u5728\/etc\/hosts\u4e2d\u5b9a\u4e49\u7684\u522b\u540d\uff0c\u5373\u7b2c1\u5217\u7684\u503c\n      shell: hostnamectl set-hostname \"{{ inventory_hostname }}\"\nEOF<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u65b0\u5efa\u7528\u6237\u4efb\u52a1<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/roles\/server-init\/tasks\/add-user.yaml &lt;&lt; \\EOF\n    - name: \u67e5\u8be2\u7528\u6237\u4fe1\u606f\n      getent:\n        database: passwd\n      register: user_facts\n    - name: \u8bbe\u7f6e\u7528\u6237\u662f\u5426\u5b58\u5728\u6807\u8bc6\n      vars:\n       query_user_exists_condition: \"{{add_user.name}}\"\n      set_fact:\n        user_exists_flag: \"{{(ansible_facts.getent_passwd | json_query(add_user.name)) != None}}\"\n    - name: \u7528\u6237\u4e0d\u5b58\u5728\u65f6\u65b0\u589e\u7528\u6237\n      user: \n       name: \"{{add_user.name}}\"\n       home: \"{{add_user.home}}\"\n       shell: \"{{add_user.shell}}\"\n       # \u8bbe\u7f6e\u5bc6\u7801\uff0c\u6b64\u5904\u9700\u8981\u4f7f\u7528\u52a0\u5bc6\u51fd\u6570\n       password: \"{{ add_user.password | password_hash }}\"\n      when: user_exists_flag == false\n    - name: \u5224\u65ad\u7528\u6237\u662f\u5426\u5b58\u5728 sudo \u6743\u9650\n      shell: grep -c \"{{add_user.name}} ALL=(ALL) ALL\" \/etc\/sudoers\n     # \u5c06\u7ed3\u679c\u5b58\u50a8\u5728\u53d8\u91cf\u4e2d\n      register: sudo_exist_flag\n      failed_when: sudo_exist_flag.rc == -1\n      when: user_exists_flag == false\n    - name: \u7528\u6237\u5b58\u5728\u65f6\u8bbe\u7f6esudo\u6743\u9650\n      shell: sed -i '44 a {{add_user.name}} ALL=(ALL) ALL' \/etc\/sudoers\n      when: user_exists_flag == false and add_user.enable_sudo == true and sudo_exist_flag.stdout == '0'\nEOF<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u8bbe\u7f6ehosts\u4efb\u52a1<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/roles\/server-init\/tasks\/set-hosts.yaml &lt;&lt; \\EOF\n    - name: \u5224\u65ad\/etc\/hosts\u4e2d\u662f\u5426\u5df2\u7ecf\u5b58\u5728ip\u3001\u57df\u540d\u914d\u7f6e\n      shell: grep -c \"{{item.ip}} {{item.hostname}}\" \/etc\/hosts\n      with_items: \"{{hostnames}}\"\n      register: hosts_exist_flag\n      failed_when: hosts_exist_flag.rc == -1\n    - name: \u5b58\u50a8ip\u3001\u57df\u540d\u914d\u7f6e\u662f\u5426\u5b58\u5728\u5224\u65ad\u7ed3\u679c\n      set_fact:\n       match_count: \"{{hosts_exist_flag.results | json_query(query_hostname_match_condition) | join('') }}\"\n      vars:\n       query_hostname_match_condition: \"&#91;?item.hostname=='{{inventory_hostname}}'].stdout\"\n    - name: \u3010\u5f00\u59cb\u3011\u6dfb\u52a0IP\u3001\u57df\u540d\u914d\u7f6e\n      shell: echo '\\n# ip\u3001\u57df\u540d\u914d\u7f6e begin' &gt;&gt; \/etc\/hosts\n      when: match_count == \"0\"\n    - name: \u6b63\u5728\u914d\u7f6eip\u3001\u57df\u540d\n      shell: echo '{{item.ip}} {{item.hostname}}' &gt;&gt; \/etc\/hosts\n      when: match_count == \"0\"\n      with_items: \"{{hostnames}}\"\n    - name: \u3010\u7ed3\u675f\u3011\u6dfb\u52a0IP\u3001\u57df\u540d\u914d\u7f6e\n      shell: echo '# ip\u3001\u57df\u540d\u914d\u7f6e end' &gt;&gt; \/etc\/hosts\n      when: match_count == \"0\"\nEOF<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u6c47\u603b\u4efb\u52a1<\/h3>\n\n\n\n<p>\u5c06\u4e0a\u8ff0\u4efb\u52a1\u6dfb\u52a0\u81f3main.yaml\u4e2d<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/roles\/server-init\/tasks\/main.yaml &lt;&lt; \\EOF\n - import_tasks: disk-partition-default.yaml\n - import_tasks: disk-partition-custom.yaml\n - import_tasks: set-hostname.yaml\n - import_tasks: add-user.yaml\n - import_tasks: set-hosts.yaml\nEOF<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u65b0\u5efa\u6267\u884c\u6587\u4ef6<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/server-init.yaml &lt;&lt; \\EOF\n---\n- hosts: server_init\n  roles:\n   - server-init\nEOF<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u6267\u884c\u811a\u672c<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>ansible-playbook \/etc\/ansible\/server-init.yaml<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u53c2\u8003\u8fde\u63a5<\/h3>\n\n\n\n<p><a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/collections\/community\/general\/parted_module.html\">ansible-parted\u6a21\u5757\u7684\u4f7f\u7528<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u5b89\u88c5docker\u3001docker compose<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u8d44\u6e90\u6e05\u5355<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt;&gt; \/etc\/ansible\/hosts &lt;&lt; \\EOF\n# \u6307\u5b9a\u5206\u7ec4\u540d\u79f0\uff0c\u5982\uff1adocker\uff0c\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u8c03\u6574<\/code><\/pre>\n\n\n<p>[docker]<\/p>\n\n\n\n<p>k8s-master ansible_ssh_host=192.168.13.247 ansible_ssh_port=22 ansible_ssh_user=root k8s-worker-01 ansible_ssh_host=192.168.13.16 ansible_ssh_port=22 ansible_ssh_user=root k8s-worker-02 ansible_ssh_host=192.168.13.51 ansible_ssh_port=22 ansible_ssh_user=root EOF<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u89d2\u8272\u76ee\u5f55<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir -p \/etc\/ansible\/roles\/docker\/\ncd \/etc\/ansible\/roles\/docker\/\nmkdir tasks vars files files\/x86_64 files\/aarch64<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efadocker\u76f8\u5173\u6587\u4ef6<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">docker \u914d\u7f6e\u6587\u4ef6<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/roles\/docker\/files\/daemon.json &lt;&lt; \\EOF\n{\n    \"exec-opts\": &#91;\"native.cgroupdriver=systemd\"],\n    \"insecure-registries\":&#91;\"113.57.95.26:7030\"],\n    \"registry-mirrors\": &#91;\"https:\/\/kn0t2bca.mirror.aliyuncs.com\"],\n    \"data-root\":\"\/home\/zhoujibin\/docker\/root-data\/docker\",\n    \"log-driver\": \"json-file\",\n    \"log-opts\": {\n         \"max-size\": \"30m\",\n         \"max-file\": \"2\"\n     }\n}\nEOF<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">docker \u670d\u52a1\u81ea\u542f\u6587\u4ef6<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/roles\/docker\/files\/docker.service &lt;&lt; \\EOF\n&#91;Unit]\nDescription=Docker Application Container Engine\nDocumentation=https:\/\/docs.docker.com\nAfter=network-online.target firewalld.service containerd.service\nWants=network-online.target\n#Requires=docker.socket containerd.service\n\n&#91;Service]\nType=notify\n# the default is not to use systemd for cgroups because the delegate issues still\n# exists and systemd currently does not support the cgroup feature set required\n# for containers run by docker\nExecStart=\/usr\/bin\/dockerd\nExecReload=\/bin\/kill -s HUP $MAINPID\nTimeoutSec=0\nRestartSec=2\nRestart=always\n\n# Note that StartLimit* options were moved from \"Service\" to \"Unit\" in systemd 229.\n# Both the old, and new location are accepted by systemd 229 and up, so using the old location\n# to make them work for either version of systemd.\nStartLimitBurst=3\n\n# Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230.\n# Both the old, and new name are accepted by systemd 230 and up, so using the old name to make\n# this option work for either version of systemd.\nStartLimitInterval=60s\n\n# Having non-zero Limit*s causes performance problems due to accounting overhead\n# in the kernel. We recommend using cgroups to do container-local accounting.\nLimitNOFILE=infinity\nLimitNPROC=infinity\nLimitCORE=infinity\n\n# Comment TasksMax if your systemd version does not support it.\n# Only systemd 226 and above support this option.\nTasksMax=infinity\n\n# set delegate yes so that systemd does not reset the cgroups of docker containers\nDelegate=yes\n\n# kill only the docker process, not all processes in the cgroup\nKillMode=process\nOOMScoreAdjust=-500\n\n&#91;Install]\nWantedBy=multi-user.target\nEOF<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">docker\u76f8\u5173\u4e0b\u8f7d\u5730\u5740<\/h3>\n\n\n\n<p><a href=\"https:\/\/download.docker.com\/linux\/static\/stable\/\">docker\u4e0b\u8f7d<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/docker\/compose\/releases?page=1\">docker-compose\u4e0b\u8f7d<\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u53d8\u91cf<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/roles\/docker\/vars\/main.yaml &lt;&lt; \\EOF\n   hostnames:\n    - ip: 192.168.13.247\n      hostname: k8s-master\n      # \u5b89\u88c5docker\u540c\u65f6\u662f\u5426\u5b89\u88c5docker-compose\n      install_docker_compose: true\n    - ip: 192.168.13.16\n      hostname: k8s-worker-01\n      # \u5b89\u88c5docker\u540c\u65f6\u662f\u5426\u5b89\u88c5docker-compose\n      install_docker_compose: false\n    - ip: 192.168.13.51\n      hostname: k8s-worker-02\n      # \u5b89\u88c5docker\u540c\u65f6\u662f\u5426\u5b89\u88c5docker-compose\n      install_docker_compose: false\n   # docker\u5b89\u88c5\u65b9\u5f0f\uff1a\u672c\u5730\/\u7f51\u7edc\u83b7\u53d6\uff0c\u4f18\u5148\u7ea7\uff1a\u672c\u5730&gt;\u7f51\u7edc\u83b7\u53d6\n   install_docker_from:\n    # \u4ece\u672c\u5730\u5b89\u88c5\uff0cansible_facts.architecture\u53d8\u91cf\u793a\u4f8b\uff1ax86_64\u3001aarch64\n    local: \"\/etc\/ansible\/roles\/docker\/files\/{{ansible_facts.architecture}}\/docker-20.10.9.tgz\"\n   # docker\u5b89\u88c5\u65b9\u5f0f\uff1a\u672c\u5730\/\u7f51\u7edc\u83b7\u53d6\uff0c\u4f18\u5148\u7ea7\uff1a\u672c\u5730&gt;\u7f51\u7edc\u83b7\u53d6\n   install_docker_compose_from:\n    # \u4ece\u672c\u5730\u5b89\u88c5\uff0cansible_facts.architecture\u53d8\u91cf\u793a\u4f8b\uff1ax86_64\u3001aarch64\n    local: \"\/etc\/ansible\/roles\/docker\/files\/{{ansible_facts.architecture}}\/docker-compose-linux-x86_64\"\n   # docker \u81ea\u542f\u6587\u4ef6\u7684\u8def\u5f84\n   docker_service_path: \/etc\/ansible\/roles\/docker\/files\/docker.service\n   # docker daemon.json \u914d\u7f6e\u6587\u4ef6\u7684\u8def\u5f84\n   docker_daemon_path: \/etc\/ansible\/roles\/docker\/files\/daemon.json\nEOF<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u5b89\u88c5\u4efb\u52a1<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/roles\/docker\/tasks\/main.yaml &lt;&lt; \\EOF\n   - name: \u83b7\u5f97\u5f53\u524d\u4e3b\u673a\u4e0b\u914d\u7f6e\u7684\u6240\u6709\u81ea\u5b9a\u4e49\u53d8\u91cf\n     set_fact:\n      # \u83b7\u53d6\u5f53\u524d\u4e3b\u673a\u81ea\u5b9a\u4e49\u7684\u53d8\u91cf\n      current_host: \"{{hostnames | json_query(query_condition) }}\"\n     vars:\n     # \u67e5\u8be2\u51fa\u7684\u7ed3\u679c\u4e3a\u4e00\u4e2ajson\u6570\u7ec4\uff0c\u53d6\u7b2c\u4e00\u6761\u5373\u53ef\n      query_condition: \"&#91;?hostname=='{{inventory_hostname}}'] | &#91;0]\"\n         # \u81ea\u5b9a\u4e49\u7cfb\u7edf\u6587\u4ef6\u914d\u7f6e\u65f6\u9700\u8981\u5728\u6307\u5b9ahostnames\u4e0b\u914d\u7f6efstab\u5c5e\u6027\n   # \u5b89\u88c5\u65b9\u5f0f\u6821\u9a8c\n   - fail: \n      msg: \"\u5b89\u88c5docker\u65f6\u9700\u8981\u6307\u5b9a\u5b89\u88c5\u65b9\u5f0f\uff0c\u3010install_docker_from.local\u3011\u4e0d\u80fd\u4e3a\u7a7a\"\n     when: \n      - install_docker_from.local is undefined or install_docker_from.local == None or install_docker_from.local | length == 0\n   - name: \u67e5\u770bdocker\u7248\u672c\n     shell: \"docker --version\"\n     register: docker_version_result\n     failed_when: docker_version_result.rc == -1\n   - name: \u6821\u9a8cdocker\u662f\u5426\u5df2\u7ecf\u5b89\u88c5\n     fail:\n      msg: \"docker\u5df2\u5b89\u88c5\"\n     when: docker_version_result.rc == 0\n   - name:  docker\u5b89\u88c5\u5305\u76ee\u5f55\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\u81ea\u52a8\u521b\u5efa\n     file:\n      path: \"{{install_docker_from.local | dirname}}\"\n      state: directory\n     when: not (install_docker_from.local is undefined or install_docker_from.local == None or install_docker_from.local | length == 0)\n   - name: \u590d\u5236docker\u5b89\u88c5\u5305\u5230\u76ee\u6807\u4e3b\u673a\n     copy: \n      src: \"{{install_docker_from.local}}\"\n      dest: \"{{install_docker_from.local}}\"\n      backup: yes\n     when:  not (install_docker_from.local is undefined or install_docker_from.local == None or install_docker_from.local | length == 0)\n   - name: \u89e3\u538bdocker\u5b89\u88c5\u5305\n     shell:\n      cd {{install_docker_from.local | dirname }}\n      &amp;&amp; rm -rf docker\n      &amp;&amp; tar -zxvf {{install_docker_from.local}}\n      &amp;&amp; cp docker\/* \/usr\/bin\/\n     when:  not (install_docker_from.local is undefined or install_docker_from.local == None or install_docker_from.local | length == 0)\n   - name: \u590d\u5236\u81ea\u542f\u6587\u4ef6\u5230\/etc\/systemd\/system\u76ee\u5f55\n     copy: \n      src: \"{{docker_service_path}}\"\n      dest: \"\/etc\/systemd\/system\/{{docker_service_path | basename}}\"\n      backup: yes\n     when:  not (docker_service_path is undefined or docker_service_path == None or docker_service_path | length == 0)\n   - name: docker\u914d\u7f6e\u6587\u4ef6\u76ee\u5f55\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\u81ea\u52a8\u521b\u5efa\n     file:\n      path: \"\/etc\/docker\/\"\n      state: directory\n     when: not (docker_daemon_path is undefined or docker_daemon_path == None or docker_daemon_path | length == 0)\n   - name: \u590d\u5236docker\u914d\u7f6e\u6587\u4ef6daemon.json\u81f3\/etc\/docker\/\u76ee\u5f55\n     copy: \n      src: \"{{docker_daemon_path}}\"\n      dest: \"\/etc\/docker\/{{docker_daemon_path | basename}}\"\n      backup: yes\n     when:  not (docker_daemon_path is undefined or docker_daemon_path == None or docker_daemon_path | length == 0)\n   - name: \u91cd\u8f7dsystemd\u5e76\u8bbe\u7f6edocker\u5f00\u673a\u81ea\u542f\n     shell: |\n      systemctl daemon-reload\n      systemctl enable docker \n      systemctl start docker\n     when:  not (docker_service_path is undefined or docker_service_path == None or docker_service_path | length == 0)\n   - name: \u67e5\u770b\u5b89\u88c5\u6210\u529f\u7684 docker \u7248\u672c\n     shell: docker --version\n     register: installed_docker_version\n     changed_when: false\n     ignore_errors: true\n     # \u786e\u5355\u8df3\u8fc7\u5728Docker\u5bb9\u5668\u5185\u8fd0\u884c\u6b64\u4efb\u52a1\n     when: ansible_virtualization_type != \"docker\"\n   - name: \u67e5\u770bdocker-compose\u7248\u672c\n     shell: \"docker-compose\"\n     register: docker_compose_version_result\n     failed_when: docker_compose_version_result.rc == -1\n     when: current_host.install_docker_compose == true\n   - name: \u6821\u9a8c docker-compose \u662f\u5426\u5df2\u7ecf\u5b89\u88c5\n     fail:\n      msg: \"docker-compose \u5df2\u5b89\u88c5\"\n     when: \n      - current_host.install_docker_compose == true\n      - docker_compose_version_result.rc == 0\n   - name:  docker-compose \u5b89\u88c5\u5305\u76ee\u5f55\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\u81ea\u52a8\u521b\u5efa\n     file:\n      path: \"{{install_docker_compose_from.local | dirname}}\"\n      state: directory\n     when: \n      - current_host.install_docker_compose == true\n      - not (install_docker_compose_from.local is undefined or install_docker_compose_from.local == None or install_docker_compose_from.local | length == 0)\n   - name: \u590d\u5236 docker-compose \u5b89\u88c5\u5305\u5230\u76ee\u6807\u4e3b\u673a\n     copy: \n      src: \"{{install_docker_compose_from.local}}\"\n      dest: \"{{install_docker_compose_from.local}}\"\n      backup: yes\n     when:\n      - current_host.install_docker_compose == true  \n      - not (install_docker_compose_from.local is undefined or install_docker_compose_from.local == None or install_docker_compose_from.local | length == 0)\n   - name: \u5b89\u88c5 docker-compose\n     shell: | \n      cp {{install_docker_compose_from.local}} \/usr\/local\/bin\/docker-compose\n      ln -s \/usr\/local\/bin\/docker-compose \/usr\/bin\/docker-compose\n      chmod +x \/usr\/local\/bin\/docker-compose\n     when:\n      - current_host.install_docker_compose == true \n      - not (install_docker_compose_from.local is undefined or install_docker_compose_from.local == None or install_docker_compose_from.local | length == 0)\n   - name: \u67e5\u770b\u5b89\u88c5\u6210\u529f\u7684 docker-compose \u7248\u672c\n     shell: docker-compose version\n     register: installed_docker_compose_version\n     changed_when: false\n     ignore_errors: true\n     when: current_host.install_docker_compose == true\n   - name: \u67e5\u770b\u5b89\u88c5\u7684 docker \u7248\u672c\n     debug:\n      msg: \"{{installed_docker_version.stdout}}\"\n   - name: \u67e5\u770b\u5b89\u88c5\u7684 docker-compose \u7248\u672c\n     debug:\n      msg: \"{{installed_docker_compose_version.stdout}}\"\n     when: current_host.install_docker_compose == true\nEOF<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u6267\u884c\u6587\u4ef6<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/install-docker.yaml &lt;&lt; \\EOF\n---\n- hosts: docker\n  roles:\n   - docker\nEOF<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u6267\u884c\u811a\u672c<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>ansible-playbook \/etc\/ansible\/install-docker.yaml<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u5378\u8f7ddocker\u3001docker-compose\u547d\u4ee4\uff08\u4e0b\u8ff0\u547d\u4ee4\u4ec5\u5728\u6d4b\u8bd5\u65f6\u4f7f\u7528\uff09<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># \u5378\u8f7ddocker\u53c2\u8003\uff1ahttps:\/\/blog.csdn.net\/qq_45495857\/article\/details\/113743109\nservice docker stop\napt-get remove docker docker-engine docker.io containerd runc\napt-get autoremove docker*\nrm -rf \/usr\/bin\/docker\nrm -rf \/run\/docker\n\n# \u5378\u8f7ddocker-compose\nrm -rf \/usr\/local\/bin\/docker-compose\nrm -rf \/usr\/bin\/docker-compose<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">docker-compose\u5b89\u88c5nginx<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u8d44\u6e90\u6e05\u5355<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt;&gt; \/etc\/ansible\/hosts &lt;&lt; \\EOF\n# \u6307\u5b9a\u5206\u7ec4\u540d\u79f0\uff0c\u5982\uff1adocker\uff0c\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u8c03\u6574<\/code><\/pre>\n\n\n<p>[nginx]<\/p>\n\n\n\n<p>k8s-master ansible_ssh_host=192.168.13.247 ansible_ssh_port=22 ansible_ssh_user=root EOF<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u89d2\u8272\u76ee\u5f55<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir -p \/etc\/ansible\/roles\/nginx\/\ncd \/etc\/ansible\/roles\/nginx\/\nmkdir tasks vars templates files<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efanginx\u542f\u52a8\u65f6\u4f9d\u8d56\u7684\u6587\u4ef6<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">mime.types<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/roles\/nginx\/files\/mime.types &lt;&lt; \\EOF\ntypes {\n    text\/html                                        html htm shtml;\n    text\/css                                         css;\n    text\/xml                                         xml;\n    image\/gif                                        gif;\n    image\/jpeg                                       jpeg jpg;\n    application\/javascript                           js;\n    application\/atom+xml                             atom;\n    application\/rss+xml                              rss;\n\n    text\/mathml                                      mml;\n    text\/plain                                       txt;\n    text\/vnd.sun.j2me.app-descriptor                 jad;\n    text\/vnd.wap.wml                                 wml;\n    text\/x-component                                 htc;\n\n    image\/png                                        png;\n    image\/svg+xml                                    svg svgz;\n    image\/tiff                                       tif tiff;\n    image\/vnd.wap.wbmp                               wbmp;\n    image\/webp                                       webp;\n    image\/x-icon                                     ico;\n    image\/x-jng                                      jng;\n    image\/x-ms-bmp                                   bmp;\n\n    font\/woff                                        woff;\n    font\/woff2                                       woff2;\n\n    application\/java-archive                         jar war ear;\n    application\/json                                 json;\n    application\/mac-binhex40                         hqx;\n    application\/msword                               doc;\n    application\/pdf                                  pdf;\n    application\/postscript                           ps eps ai;\n    application\/rtf                                  rtf;\n    application\/vnd.apple.mpegurl                    m3u8;\n    application\/vnd.google-earth.kml+xml             kml;\n    application\/vnd.google-earth.kmz                 kmz;\n    application\/vnd.ms-excel                         xls;\n    application\/vnd.ms-fontobject                    eot;\n    application\/vnd.ms-powerpoint                    ppt;\n    application\/vnd.oasis.opendocument.graphics      odg;\n    application\/vnd.oasis.opendocument.presentation  odp;\n    application\/vnd.oasis.opendocument.spreadsheet   ods;\n    application\/vnd.oasis.opendocument.text          odt;\n    application\/vnd.openxmlformats-officedocument.presentationml.presentation\n                                                     pptx;\n    application\/vnd.openxmlformats-officedocument.spreadsheetml.sheet\n                                                     xlsx;\n    application\/vnd.openxmlformats-officedocument.wordprocessingml.document\n                                                     docx;\n    application\/vnd.wap.wmlc                         wmlc;\n    application\/x-7z-compressed                      7z;\n    application\/x-cocoa                              cco;\n    application\/x-java-archive-diff                  jardiff;\n    application\/x-java-jnlp-file                     jnlp;\n    application\/x-makeself                           run;\n    application\/x-perl                               pl pm;\n    application\/x-pilot                              prc pdb;\n    application\/x-rar-compressed                     rar;\n    application\/x-redhat-package-manager             rpm;\n    application\/x-sea                                sea;\n    application\/x-shockwave-flash                    swf;\n    application\/x-stuffit                            sit;\n    application\/x-tcl                                tcl tk;\n    application\/x-x509-ca-cert                       der pem crt;\n    application\/x-xpinstall                          xpi;\n    application\/xhtml+xml                            xhtml;\n    application\/xspf+xml                             xspf;\n    application\/zip                                  zip;\n\n    application\/octet-stream                         bin exe dll;\n    application\/octet-stream                         deb;\n    application\/octet-stream                         dmg;\n    application\/octet-stream                         iso img;\n    application\/octet-stream                         msi msp msm;\n\n    audio\/midi                                       mid midi kar;\n    audio\/mpeg                                       mp3;\n    audio\/ogg                                        ogg;\n    audio\/x-m4a                                      m4a;\n    audio\/x-realaudio                                ra;\n\n    video\/3gpp                                       3gpp 3gp;\n    video\/mp2t                                       ts;\n    video\/mp4                                        mp4;\n    video\/mpeg                                       mpeg mpg;\n    video\/quicktime                                  mov;\n    video\/webm                                       webm;\n    video\/x-flv                                      flv;\n    video\/x-m4v                                      m4v;\n    video\/x-mng                                      mng;\n    video\/x-ms-asf                                   asx asf;\n    video\/x-ms-wmv                                   wmv;\n    video\/x-msvideo                                  avi;\n}\nEOF<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efanginx\u76f8\u5173\u53d8\u91cf<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/roles\/nginx\/vars\/main.yaml &lt;&lt; \\EOF\n   nginx:\n    image: 113.57.95.26:7030\/components\/nginx\n    # \u6b64\u5904\u586b\u5199ngin\u914d\u7f6e\u6587\u4ef6\u4e2d\u7528\u5230\u7684host\uff0c\u683c\u5f0f\uff1a\u57df\u540d:ip\uff0c\u4e00\u822c\u4e3a\uff1a\u7f51\u5173\u57df\u540d+ip\n    extra_hosts:\n      - \"local.test:192.168.13.247\"\n    # \u4e0b\u5217\u7248\u672c\u5728\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u53ea\u4f1a\u9009\u62e9\u4e00\u4e2a\uff0c\u7ed3\u679c\u4f1a\u5b58\u50a8\u5728: target_compoment_version \u53d8\u91cf\u4e2d\n    component_version:\n     # amd\u67b6\u6784\u4e0b\u7684nginx\u7248\u672c\n     x86_64: 1.18\n     # arm\u67b6\u6784\u4e0b\u7684\u7248\u672c\n     arrch64: 1.18-arm64\n    # \u5b58\u653enginx compose \u6a21\u677f\u6587\u4ef6\u7684\u76ee\u5f55\n    template_compose_file_path: \/etc\/ansible\/roles\/nginx\/templates\/compose.yaml\n    # \u5b58\u653e\u6e32\u67d3\u5b8c\u6bd5\u7684 nginx compose\u6587\u4ef6\u7684\u76ee\u5f55\n    compose_file_dir: \/home\/zhoujibin\/nginx\n    # nginx\u5b89\u88c5\u76ee\u5f55\uff0c\u9ed8\u8ba4\uff1a\/etc\/nginx\n    install_dir: \n    # \u8fd0\u884cnginx\u7684\u670d\u52a1\u540d\u79f0\uff0c\u9ed8\u8ba4\u4e3a\u5f53\u524dnginx\u6240\u5728\u7684\u673a\u5668ip\n    server_name:\n    # nginx\u76d1\u542c\u7684\u7aef\u53e3\uff0c\u9ed8\u8ba48080\n    listen: 9023\n    # \u65e5\u5fd7\u76ee\u5f55\uff0c\u9ed8\u8ba4\uff1a\/etc\/nginx\/log\n    log_dir:\n    # \u670d\u52a1\u914d\u7f6e\u6587\u4ef6\u76ee\u5f55\uff0c\u9ed8\u8ba4\uff1a\/etc\/nginx\/server\n    server_dir: \n    # stream \u6a21\u5757\u8def\u5f84\uff0c\u9ed8\u8ba4\uff1a\/etc\/nginx\/stream\n    stream_dir: \n    # \u9879\u76ee\u914d\u7f6e\u540d\u79f0\uff0c\u9ed8\u8ba4\uff1adefault-server.conf\n    project_config_file_name: \n    # \u524d\u7aef\u914d\u7f6e\n    frontend:\n     # \u524d\u7aef\u9879\u76ee\u8def\u5f84\uff0c\u9ed8\u8ba4\uff1a\/etc\/nginx\/frontend\n     project_dir:\n     # \u524d\u7aef\u9879\u76ee\u8d44\u6e90\u8def\u5f84\uff0c\u9ed8\u8ba4\uff1a\/etc\/nginx\/frontend\/resource\n     project_resource_dir:\n     # \u524d\u7aef\u8bf7\u6c42url\u524d\u7f00\uff0c\u9ed8\u8ba4\/web\/\n     url_prefix:\n    # \u540e\u7aefapi\u8bf7\u6c42\u524d\u7f00\n    backend:\n     # gateway\u7f51\u5173\u57df\u540d\n     gateway: local.test\n     # \u540e\u7aefapi\u8bf7\u6c42\u524d\u7f00\n     api_prefix: \n    # \u9ad8\u5fb7\u5730\u56fe\u76f8\u5173\u914d\u7f6e\n    web_map:\n     jscode: b770bd7bfd352f641450ad377bb1e434\n     url: https:\/\/restapi.amap.com\/\n    # \u653f\u52a1\u5730\u5740\u914d\u7f6e\n    gov_map:\n     url:http:\/\/58.48.28.181:28888\/ServiceAdapter\/MAP\/\n   # docker\u76f8\u5173\u8d26\u6237\u914d\u7f6e\u4fe1\u606f\uff0c\u7528\u4e8e\u767b\u5f55\u955c\u50cf\u4ed3\u5e93\n   docker:\n    registry_url: 113.57.95.26:7030\n    username: docker\n    password: RzpwKwB1Fk\nEOF<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u6a21\u677f\u6587\u4ef6<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">nginx compose<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/roles\/nginx\/templates\/compose.yaml &lt;&lt; \\EOF\nservices:\n nginx:\n    container_name: nginx-service\n    image: \"{{nginx.image}}:{{target_compoment_version}}\"\n    volumes:\n      - {{nginx.install_dir}}:\/etc\/nginx\/\n      - {{nginx.log_dir}}:\/var\/log\/nginx\/\n      - {{nginx.frontend.project_dir}}:\/home\/project\/frontend\n      - {{nginx.frontend.project_resource_dir}}:\/home\/project\/frontend\/resource\n    extra_hosts:\n{% for host in nginx.extra_hosts %}\n     - \"{{host}}\"\n{% endfor %}\n    restart: always\n    deploy:\n        resources:\n            limits:\n                memory: 1536M\n            reservations:\n                memory: 768M\n    network_mode: \"host\"\nEOF<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">nginx.conf<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/roles\/nginx\/templates\/nginx.conf &lt;&lt; \\EOF\n\n#user  nobody;\nworker_processes  4;\n\n#error_log  logs\/error.log;\n#error_log  logs\/error.log  notice;\n#error_log  logs\/error.log  info;\n\n#pid        logs\/nginx.pid;\n\nevents {\n    worker_connections  10000;\n}\n\nhttp {\n    include       mime.types;\n    default_type  application\/octet-stream;\n\n    set_real_ip_from 0.0.0.0\/0;\n    real_ip_header  x-forwarded-for;\n    real_ip_recursive on;\n\n    include {{ nginx.server_dir}}\/*.conf;\n    client_max_body_size 50m;\n    client_body_buffer_size 50m;\n    # \u81ea\u5b9a\u4e49\u8bf7\u6c42\u5934\n    underscores_in_headers on;\n    # \u5176\u4ed6\u914d\u7f6exxx\n    server_tokens off;\n    # \u5173\u95ed\u6587\u4ef6\u7d22\u5f15\n    autoindex off;\n}\nstream {\n    include {{ nginx.stream_dir}}\/*.stream; \n}\nEOF<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">default-server.conf<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># \u9ed8\u8ba4\u7684\u670d\u52a1\u914d\u7f6e\ncat &gt; \/etc\/ansible\/roles\/nginx\/templates\/default-server.conf &lt;&lt; \\EOF\nserver {\n    listen       {{nginx.listen}};\n    server_name  {{nginx.server_name}};\n\n    charset utf-8;\n    index  index.html;\n    proxy_http_version 1.1;\n    proxy_set_header Upgrade $http_upgrade;\n    proxy_set_header Connection 'upgrade';\n    proxy_connect_timeout 180;\n    proxy_send_timeout 180;\n    proxy_read_timeout 180;\n    send_timeout 180;    \n\n    gzip on;\n    gzip_types text\/plain application\/javascript  application\/json application\/x-javascript text\/css application\/xml text\/javascript application\/x-httpd-php;\n    gzip_disable \"MSIE &#91;1-6]\\.\";\n    gzip_min_length 1k;\n    gzip_buffers 4 16k;\n    gzip_comp_level 5;\n    gzip_vary on;\n\n    # web\u524d\u7aef\u5de5\u7a0b\u8bbf\u95ee\u4ee3\u7406\n    location ^~\/{{nginx.frontend.url_prefix}} { \n       proxy_pass  http:\/\/{{nginx.backend.gateway}}\/{{nginx.frontend.url_prefix}};\n       proxy_http_version 1.1;\n       proxy_set_header Upgrade $http_upgrade;\n       proxy_set_header Connection \"upgrade\";\n    }\n\n    # \u540e\u7aefAPI \u63a5\u53e3\u4ee3\u7406\n    location ^~ \/{{nginx.backend.api_prefix}}\/ {      \n        proxy_pass  http:\/\/{{nginx.backend.gateway}}\/{{nginx.backend.api_prefix}};\n        proxy_http_version 1.1;\n        proxy_set_header Upgrade $http_upgrade;\n        proxy_set_header Connection \"upgrade\";\n        proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;\n    }\n\n    # \u524d\u7aef\u9759\u6001\u9879\u76ee\u5730\u5740\n    location \/ {\n        root {{nginx.frontend.project_dir}};\n        index index.html;\n    } \n    {% if nginx.web_map.jscode is defined and nginx.web_map.jscode \n    and  nginx.web_map.url is defined and nginx.web_map.url %}\n    # Web\u670d\u52a1API \u4ee3\u7406\n    location \/_AMapService\/ {\n      set $args \"$args&amp;jscode={{nginx.web_map.jscode}}\";\n      proxy_pass {{nginx.web_map.url}};\n    }\n    {% endif %}\n    {% if nginx.gov_map.url is defined and nginx.gov_map.url %}\n    # \u7535\u5b50\u653f\u52a1\u5730\u56fe\n    location ^~ \/ServiceAdapter\/MAP\/ {\n       proxy_pass {{nginx.gov_map.url}};\n       proxy_http_version 1.1;\n       proxy_set_header Upgrade $http_upgrade;\n       proxy_set_header Connection \"upgrade\";\n    }\n    {% endif %}}\nEOF<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u53d8\u91cf\u521d\u59cb\u5316\u4efb\u52a1<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt;  \/etc\/ansible\/roles\/nginx\/tasks\/default-var-init.yaml &lt;&lt; \\EOF\n  # nginx\u5b89\u88c5\u76ee\u5f55\uff0c\u9ed8\u8ba4\uff1a\/etc\/nginx\n - name: nginx \u5b89\u88c5\u76ee\u5f55 \u4e3a\u7a7a\u65f6\u8bbe\u7f6e\u9ed8\u8ba4\u503c\n   set_fact:\n    nginx: \"{{ nginx | combine({'install_dir':'\/etc\/nginx'}) }}\"\n   when: nginx.install_dir is undefined or nginx.install_dir == None or nginx.install_dir | length == 0\n - name: \u8fd0\u884cnginx\u7684\u670d\u52a1\u540d\u79f0\uff0c\u9ed8\u8ba4\u4e3a\u5f53\u524dnginx\u6240\u5728\u7684\u673a\u5668ip\n   set_fact:\n    nginx: \"{{ nginx | combine({'server_name': ansible_default_ipv4&#91;'address']}) }}\"\n   when: nginx.server_name is undefined or nginx.server_name == None or nginx.server_name | length == 0\n - name: nginx\u76d1\u542c\u7684\u7aef\u53e3\uff0c\u9ed8\u8ba48080\n   set_fact:\n    nginx: \"{{ nginx | combine({'listen':'8080'}) }}\"\n   when: nginx.listen is undefined or nginx.listen == None\n - name: \u65e5\u5fd7\u76ee\u5f55\uff0c\u9ed8\u8ba4\uff1a\/etc\/nginx\/log\n   set_fact:\n    nginx: \"{{ nginx | combine({'log_dir':'\/etc\/nginx\/log'}) }}\"\n   when: nginx.log_dir is undefined or nginx.log_dir == None or nginx.log_dir | length == 0\n - name: \u670d\u52a1\u914d\u7f6e\u6587\u4ef6\u76ee\u5f55\uff0c\u9ed8\u8ba4\uff1a\/etc\/nginx\/server\n   set_fact:\n    nginx: \"{{ nginx | combine({'server_dir':'\/etc\/nginx\/server'}) }}\"\n   when: nginx.server_dir is undefined or nginx.server_dir == None or nginx.server_dir | length == 0\n - name: stream \u6a21\u5757\u8def\u5f84\uff0c\u9ed8\u8ba4\uff1a\/etc\/nginx\/stream\n   set_fact:\n    nginx: \"{{ nginx | combine({'stream_dir':'\/etc\/nginx\/stream'}) }}\"\n   when: nginx.stream_dir is undefined or nginx.stream_dir == None or nginx.stream_dir | length == 0\n - name: \u524d\u7aef\u9879\u76ee\u8def\u5f84\uff0c\u9ed8\u8ba4\uff1a\/etc\/nginx\/frontend\n   set_fact:\n    nginx: \"{{ nginx | combine({'frontend': {'project_dir': '\/etc\/nginx\/frontend'}},recursive=True) }}\"\n   when: nginx.frontend.project_dir is undefined or nginx.frontend.project_dir == None or nginx.frontend.project_dir | length == 0\n - name: \u524d\u7aef\u9879\u76ee\u8d44\u6e90\u8def\u5f84\uff0c\u9ed8\u8ba4\uff1a\/etc\/nginx\/frontend\/resource\n   set_fact:\n    nginx: \"{{ nginx | combine({'frontend': {'project_resource_dir': '\/etc\/nginx\/frontend\/resource'}},recursive=True) }}\"\n   when: nginx.frontend.project_resource_dir is undefined or nginx.frontend.project_resource_dir == None or nginx.frontend.project_resource_dir | length == 0\n - name: \u524d\u7aef\u8bf7\u6c42url\u524d\u7f00\uff0c\u9ed8\u8ba4\/web\/\n   set_fact:\n    nginx: \"{{ nginx | combine({'frontend': {'url_prefix': 'web'}} ,recursive=True) }}\"\n   when: nginx.frontend.url_prefix is undefined or nginx.frontend.url_prefix == None or nginx.frontend.url_prefix | length == 0\n - name: \u540e\u7aefapi\u8bf7\u6c42\u524d\u7f00\uff0c\u9ed8\u8ba4\/api\/\n   set_fact:\n    nginx: \"{{ nginx | combine({'backend': {'api_prefix': 'api'}} ,recursive=True) }}\"\n   when: nginx.backend.api_prefix is undefined or nginx.backend.api_prefix == None or nginx.backend.api_prefix | length == 0\n - name: \u9879\u76ee\u914d\u7f6e\u540d\u79f0\uff0c\u9ed8\u8ba4\uff1adefault-server.conf\n   set_fact:\n    nginx: \"{{ nginx | combine({'project_config_file_name': 'default-server.conf'}) }}\"\n   when: nginx.project_config_file_name is undefined or nginx.project_config_file_name == None or nginx.project_config_file_name | length == 0\nEOF<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efanginx\u5b89\u88c5\u4efb\u52a1<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt;  \/etc\/ansible\/roles\/nginx\/tasks\/main.yaml &lt;&lt; \\EOF\n   # \u5b89\u88c5\u65b9\u5f0f\u6821\u9a8c\n   - fail: \n      msg: \"\u5b89\u88c5nginx\u65f6\u9700\u8981\u6307\u5b9a\u955c\u50cf\u5730\u5740\u3010nginx.image\u3011\u53ca\u955c\u50cf\u7248\u672c\u3010nginx.component_version\u3011\"\n     when: \n      - nginx.image is undefined or nginx.image == None or nginx.image | length == 0\n      - nginx.component_version.x86_64 is undefined or nginx.component_version.x86_64 == None or nginx.component_version.x86_64 | length == 0\n      - nginx.component_version.arrch64 is undefined or nginx.component_version.arrch64 == None or nginx.component_version.arrch64 | length == 0\n   - name: \u67e5\u770b nginx \u8fdb\u7a0b\u662f\u5426\u5b58\u5728\n     # \u6b64\u5904\u4f7f\u7528docker ps\u7684\u65b9\u5f0f\u5224\u65ad\n     shell: \"docker ps | grep nginx\"\n     register: nginx_process_result\n     failed_when: nginx_process_result.rc == -1\n   - name: \u6821\u9a8c nginx \u662f\u5426\u5df2\u7ecf\u5b89\u88c5\n     fail:\n      msg: \"nginx\u5df2\u5b89\u88c5\"\n     when:  nginx_process_result.stdout_lines | length &gt; 0\n   # \u5bfc\u5165\u9ed8\u8ba4\u53d8\u91cf\u5904\u7406\u4efb\u52a1\n   - import_tasks: default-var-init.yaml\n   - name:  nginx compose\u6587\u4ef6\u5b58\u653e\u76ee\u5f55\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\u81ea\u52a8\u521b\u5efa\n     file:\n      path: \"{{nginx.compose_file_dir}}\"\n      state: directory\n     when: not (nginx.compose_file_dir is undefined or nginx.compose_file_dir == None or nginx.compose_file_dir | length == 0)\n   - name: \u6839\u636e nginx compose \u6a21\u677f\u751f\u6210\u6587\u4ef6\u5e76\u5c06\u6587\u4ef6\u5230\u76ee\u6807\u4e3b\u673a\n     template: \n      src: \"{{nginx.template_compose_file_path}}\"\n      dest: \"{{nginx.compose_file_dir}}\/{{nginx.template_compose_file_path | basename}}\"\n      backup: yes\n     vars:\n      target_compoment_version: \"{{nginx.component_version&#91;ansible_facts.architecture]}}\"\n     when:  not (nginx.template_compose_file_path is undefined or nginx.template_compose_file_path == None or nginx.template_compose_file_path | length == 0)\n   - name: nginx \u5b89\u88c5\u76ee\u5f55\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\u81ea\u52a8\u521b\u5efa\n     file:\n      path: \"{{nginx.install_dir}}\"\n      state: directory\n     when: not (nginx.install_dir is undefined or nginx.install_dir == None or nginx.install_dir | length == 0)\n   - name: nginx server\u76ee\u5f55\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\u81ea\u52a8\u521b\u5efa\n     file:\n      path: \"{{nginx.server_dir}}\"\n      state: directory\n     when: not (nginx.server_dir is undefined or nginx.server_dir == None or nginx.server_dir | length == 0)\n   - name: \u6839\u636e nginx server \u6a21\u677f\u751f\u6210nginx.conf\u5e76\u5c06\u6587\u4ef6\u5230\u76ee\u6807\u4e3b\u673a\n     template: \n      src: \"nginx.conf\"\n      dest: \"{{nginx.install_dir}}\/nginx.conf\"\n      backup: yes\n   - name: \u590d\u5236 mime.types \u5230\u76ee\u6807\u673a\u5668\n     copy: \n      src: \"mime.types\"\n      dest: \"{{nginx.install_dir}}\/mime.types\"\n      backup: yes\n   - name: \u6839\u636e nginx server \u6a21\u677f\u751f\u6210\u9ed8\u8ba4\u9879\u76ee\u914d\u7f6e\u5e76\u5c06\u6587\u4ef6\u5230\u76ee\u6807\u4e3b\u673a\n     template: \n      src: \"default-server.conf\"\n      dest: \"{{nginx.server_dir}}\/{{nginx.project_config_file_name}}\"\n      backup: yes\n   - name:  nginx stream \u76ee\u5f55\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\u81ea\u52a8\u521b\u5efa\n     file:\n      path: \"{{nginx.stream}}\"\n      state: directory\n     when: not (nginx.stream is undefined or nginx.stream == None or nginx.stream | length == 0)\n   - name: \u767b\u5f55 docker\n     shell: \"docker login -u {{ docker.username }} -p {{ docker.password }} {{ docker.registry_url }}\"\n     when:\n      - not (docker.registry_url is undefined or docker.registry_url == None or docker.registry_url | length == 0)\n      - not (docker.username is undefined or docker.username == None or docker.username | length == 0)\n      - not (docker.password is undefined or docker.password == None or docker.password | length == 0)\n   - name: \u542f\u52a8 nginx\n     shell: |\n      cd \"{{nginx.compose_file_dir}}\"\n      docker-compose up -d\nEOF<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u65b0\u5efanginx\u5b89\u88c5\u6267\u884c\u6587\u4ef6<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/install-nginx.yaml &lt;&lt; \\EOF\n---\n- hosts: nginx\n  roles:\n   - nginx\nEOF<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u6267\u884c\u811a\u672c<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>ansible-playbook \/etc\/ansible\/install-nginx.yaml<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u5378\u8f7dnginx\u547d\u4ee4\uff08\u4e0b\u8ff0\u547d\u4ee4\u4ec5\u5728\u6d4b\u8bd5\u65f6\u4f7f\u7528\uff09<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>docker stop nginx-service\nrm -rf \/etc\/nginx\nrm -rf \/home\/zhoujibin\/nginx<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u5b89\u88c5jdk<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u8d44\u6e90\u6e05\u5355<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt;&gt; \/etc\/ansible\/hosts &lt;&lt; \\EOF\n# \u6307\u5b9a\u5206\u7ec4\u540d\u79f0\uff0c\u5982\uff1adocker\uff0c\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u8c03\u6574<\/code><\/pre>\n\n\n<p>[jdk]<\/p>\n\n\n\n<p>k8s-master ansible_ssh_host=192.168.13.247 ansible_ssh_port=22 ansible_ssh_user=root EOF<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u89d2\u8272\u76ee\u5f55<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir -p \/etc\/ansible\/roles\/jdk\/\ncd \/etc\/ansible\/roles\/jdk\/\nmkdir tasks vars files files\/x86_64 files\/aarch64<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u53d8\u91cf<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/roles\/jdk\/vars\/main.yaml &lt;&lt; \\EOF\n   # docker\u5b89\u88c5\u65b9\u5f0f\uff1a\u672c\u5730\/\u7f51\u7edc\u83b7\u53d6\uff0c\u4f18\u5148\u7ea7\uff1a\u672c\u5730&gt;\u7f51\u7edc\u83b7\u53d6\n   install_jdk_from:\n    # \u4ece\u672c\u5730\u5b89\u88c5\uff0cansible_facts.architecture\u53d8\u91cf\u793a\u4f8b\uff1ax86_64\u3001aarch64\n    local: \"\/etc\/ansible\/roles\/jdk\/files\/{{ansible_facts.architecture}}\/jdk-1.8.tar.gz\"\n   # jdk\u7684\u5b89\u88c5\u76ee\u5f55\n   java_home: \/usr\/lib\/jvm\n   # \u5df2\u5b58\u5728jdk\u65f6\u662f\u5426\u7ee7\u7eed\u5b89\u88c5\n   continue_if_jdk_exists: true\n   # \u89e3\u538b\u540e\u7684jdk\u6587\u4ef6\u5939\u540d\u79f0\uff0c\u9ed8\u8ba4\u548c\u538b\u7f29\u5305\u540d\u79f0\u4e00\u81f4\n   uncompress_jdk_folder_name: jdk-1.8\nEOF<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u5b89\u88c5\u4efb\u52a1<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt;  \/etc\/ansible\/roles\/jdk\/tasks\/main.yaml &lt;&lt; \\EOF\n   # \u5b89\u88c5\u65b9\u5f0f\u6821\u9a8c\n   - fail: \n      msg: \"\u5b89\u88c5jdk\u65f6\u9700\u8981\u6307\u5b9a\u5b89\u88c5\u65b9\u5f0f\uff0c\u3010install_jdk_from.local\u3011\u4e0d\u80fd\u4e3a\u7a7a\"\n     when: \n      - install_jdk_from.local is undefined or install_jdk_from.local == None or install_jdk_from.local | length == 0\n   - name: \u67e5\u770bjdk\u7248\u672c\n     shell: \"jdk --version\"\n     register: jdk_version_result\n     failed_when: jdk_version_result.rc == -1\n   - name: \u6821\u9a8cdocker\u662f\u5426\u5df2\u7ecf\u5b89\u88c5\n     fail:\n      msg: \"jdk\u5df2\u5b89\u88c5\"\n     when:\n      - continue_if_jdk_exists == false\n      - jdk_version_result.rc == 0\n   - name:  jdk \u5b89\u88c5\u5305\u76ee\u5f55\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\u81ea\u52a8\u521b\u5efa\n     file:\n      path: \"{{install_jdk_from.local | dirname}}\"\n      state: directory\n     when: not (install_jdk_from.local is undefined or install_jdk_from.local == None or install_jdk_from.local | length == 0)\n   - name:  jdk \u5b89\u88c5\u76ee\u5f55\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\u81ea\u52a8\u521b\u5efa\n     file:\n      path: \"{{java_home}}\"\n      state: directory\n     when: not (java_home is undefined or java_home == None or java_home | length == 0)\n   - name: \u590d\u5236 jdk \u5b89\u88c5\u5305\u5230\u76ee\u6807\u4e3b\u673a\n     copy: \n      src: \"{{install_jdk_from.local}}\"\n      dest: \"{{install_jdk_from.local}}\"\n      backup: yes\n     when: not (install_jdk_from.local is undefined or install_jdk_from.local == None or install_jdk_from.local | length == 0)\n   - name: \u89e3\u538b jdk \u5230\u6307\u5b9a\u76ee\u5f55\n     shell: | \n      tar -zxvf \"{{install_jdk_from.local}}\" -C \"{{java_home}}\"\n     when:\n      - not (install_jdk_from.local is undefined or install_jdk_from.local == None or install_jdk_from.local | length == 0)\n      - not (java_home is undefined or java_home == None or java_home | length == 0)\n   - name: \u8bbe\u7f6e JAVA_HOME\n     lineinfile:\n      path:  \/etc\/profile\n      line: \"export JAVA_HOME={{java_home}}\/{{uncompress_jdk_folder_name}}\"\n      state: present\n      insertafter: EOF\n     when: \n      - not (java_home is undefined or java_home == None or java_home | length == 0)\n      - not (uncompress_jdk_folder_name is undefined or uncompress_jdk_folder_name == None or uncompress_jdk_folder_name | length == 0)\n   - name: \u8bbe\u7f6e JRE_HOME\n     lineinfile:\n      path: \/etc\/profile\n      line: \"export JRE_HOME=$JAVA_HOME\/jre\"\n      state: present\n      insertafter: EOF\n   - name: \u8bbe\u7f6e CLASSPATH\n     lineinfile:\n      path: \/etc\/profile\n      line: \"export CLASSPATH=.:$JAVA_HOME\/lib:$JRE_HOME\/lib\"\n      state: present\n      insertafter: EOF\n   - name: \u8bbe\u7f6e PATH\n     lineinfile:\n      path:  \/etc\/profile\n      line: \"export PATH=$JAVA_HOME\/bin:$PATH\"\n      state: present\n      insertafter: EOF\n   - name: \u67e5\u770b \u5b89\u88c5\u6210\u529f\u7684 jdk\u7248\u672c\n     shell:\n      cmd: |\n       source \/etc\/profile\n       java -version\n      executable: \/bin\/bash\n     args:\n      executable: \/bin\/bash\n     register: install_jdk_version_result\n     failed_when: install_jdk_version_result.rc == -1\n   - name: \u6253\u5370\u5b89\u88c5\u6210\u529f\u7684 jdk \u7248\u672c\n     debug:\n      msg: \"{{install_jdk_version_result.stderr_lines}}\"\nEOF<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u6267\u884c\u6587\u4ef6<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/install-jdk.yaml &lt;&lt; \\EOF\n---\n- hosts: jdk\n  roles:\n   - jdk\nEOF<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u6267\u884c\u811a\u672c<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>ansible-playbook \/etc\/ansible\/install-jdk.yaml<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u5b89\u88c5kafka<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u8d44\u6e90\u6e05\u5355<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt;&gt; \/etc\/ansible\/hosts &lt;&lt; \\EOF\n# \u6307\u5b9a\u5206\u7ec4\u540d\u79f0\uff0c\u5982\uff1akafka\uff0c\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u8c03\u6574<\/code><\/pre>\n\n\n<p>[kafka]<\/p>\n\n\n\n<p>k8s-master ansible_ssh_host=192.168.13.247 ansible_ssh_port=22 ansible_ssh_user=root k8s-worker-01 ansible_ssh_host=192.168.13.16 ansible_ssh_port=22 ansible_ssh_user=root k8s-worker-02 ansible_ssh_host=192.168.13.51 ansible_ssh_port=22 ansible_ssh_user=root EOF<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u89d2\u8272\u76ee\u5f55<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir -p \/etc\/ansible\/roles\/kafka\/\ncd \/etc\/ansible\/roles\/kafka\/\nmkdir tasks vars files templates<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u53d8\u91cf<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/roles\/kafka\/vars\/main.yaml &lt;&lt; \\EOF\n # \u96c6\u7fa4\u5b89\u88c5\u65f6\u9700\u8981\u914d\u7f6e\u591a\u53f0\u673a\u5668\nhostnames:\n - ip: 192.168.13.247\n   hostname: k8s-master\n   zookeeper:\n    # \u96c6\u7fa4\u73af\u5883\u4e2d\u6bcf\u53f0\u673a\u5668\u4e0a\u5bf9\u5e94\u7684zookeeper\u673a\u5668\u6807\u8bc6\n    myid: 1\n    # zooKeeper\u76d1\u542c\u5ba2\u6237\u7aef\u8fde\u63a5\u7684\u7aef\u53e3\u53f7\uff0c\u9ed8\u8ba4\uff1a2181\n    client_port:\n    # \u6570\u636e\u540c\u6b65\u7aef\u53e3\uff0c\u9ed8\u8ba4\uff1a2888\n    data_sync_port: \n    # \u9009\u4e3e\u7aef\u53e3\uff0c\u9ed8\u8ba4\uff1a3888\n    elect_port: \n   kafka:\n    # \u7f13\u5b58\u4ee3\u7406\uff0cKafka\u96c6\u7fa4\u4e2d\u7684\u4e00\u53f0\u6216\u591a\u53f0\u670d\u52a1\u5668\u7edf\u79f0broker.\n    broke_id: 0\n    # kafka\u76d1\u542c\u7684\u7aef\u53e3\uff0c\u9ed8\u8ba4\uff1a9092\n    listener_port: \n    # kafka\u5173\u8054\u7684\u6240\u6709zookeeper\u7684ip:\u7aef\u53e3\u914d\u7f6e\n    zookeeper_list:\n    # \u9ed8\u8ba4\uff1a9999\n    jmx_port: \n - ip: 192.168.13.16\n   hostname: k8s-worker-01\n   zookeeper:\n    # \u96c6\u7fa4\u73af\u5883\u4e2d\u6bcf\u53f0\u673a\u5668\u4e0a\u5bf9\u5e94\u7684zookeeper\u673a\u5668\u6807\u8bc6\n    myid: 2\n    # zooKeeper\u76d1\u542c\u5ba2\u6237\u7aef\u8fde\u63a5\u7684\u7aef\u53e3\u53f7\uff0c\u9ed8\u8ba4\uff1a2181\n    client_port:\n    # \u6570\u636e\u540c\u6b65\u7aef\u53e3\uff0c\u9ed8\u8ba4\uff1a2888\n    data_sync_port:\n    # \u9009\u4e3e\u7aef\u53e3\uff0c\u9ed8\u8ba4\uff1a3888\n    elect_port:\n   kafka:\n    # \u7f13\u5b58\u4ee3\u7406\uff0cKafka\u96c6\u7fa4\u4e2d\u7684\u4e00\u53f0\u6216\u591a\u53f0\u670d\u52a1\u5668\u7edf\u79f0broker.\n    broke_id: 1\n    # kafka\u76d1\u542c\u7684\u7aef\u53e3\uff0c\u9ed8\u8ba4\uff1a9092\n    listener_port:\n    #  kafka\u5173\u8054\u7684\u6240\u6709zookeeper\u7684ip:\u7aef\u53e3\u914d\u7f6e\n    zookeeper_list:\n    # \u9ed8\u8ba4\uff1a9999\n    jmx_port: \n - ip: 192.168.13.51\n   hostname: k8s-worker-02\n   zookeeper:\n   # \u96c6\u7fa4\u73af\u5883\u4e2d\u6bcf\u53f0\u673a\u5668\u4e0a\u5bf9\u5e94\u7684zookeeper\u673a\u5668\u6807\u8bc6\n    myid: 3\n    # zooKeeper\u76d1\u542c\u5ba2\u6237\u7aef\u8fde\u63a5\u7684\u7aef\u53e3\u53f7\uff0c\u9ed8\u8ba4\uff1a2181\n    client_port:\n    # \u6570\u636e\u540c\u6b65\u7aef\u53e3\uff0c\u9ed8\u8ba4\uff1a2888\n    data_sync_port:\n    # \u9009\u4e3e\u7aef\u53e3\uff0c\u9ed8\u8ba4\uff1a3888\n    elect_port:\n   kafka:\n    # \u7f13\u5b58\u4ee3\u7406\uff0cKafka\u96c6\u7fa4\u4e2d\u7684\u4e00\u53f0\u6216\u591a\u53f0\u670d\u52a1\u5668\u7edf\u79f0broker.\n    broke_id: 2\n    # kafka\u76d1\u542c\u7684\u7aef\u53e3\uff0c\u9ed8\u8ba4\uff1a9092\n    listener_port:\n    #  kafka\u5173\u8054\u7684\u6240\u6709zookeeper\u7684ip:\u7aef\u53e3\u914d\u7f6e\n    zookeeper_list:\n    # \u9ed8\u8ba4\uff1a9999\n    jmx_port: \nkafka:\n # \u5b89\u88c5\u7c7b\u578b\uff1a\u5355\u673a-standalone\uff0c\u96c6\u7fa4-cluster\uff0c\u96c6\u7fa4\u73af\u5883\u8981\u6c42\u81f3\u5c113\u53f0\u673a\u5668\n install_type: cluster\n install_from:\n  # \u4ece\u672c\u5730\u5b89\u88c5\uff0c\u9700\u8981\u6307\u5b9a\u5177\u4f53\u7684\u5b89\u88c5\u5305\u8def\u5f84\n  local: \/etc\/ansible\/roles\/kafka\/files\/kafka_2.13-3.2.1.tgz\n # kafka\u5b89\u88c5\u76ee\u5f55\n install_dir: \/home\/zhoujibin\/\n # kafka\u89e3\u538b\u540e\u7684\u6587\u4ef6\u5939\u540d\u79f0\uff0c\u4e00\u822c\u548c\u538b\u7f29\u5305\u540d\u79f0\u4e00\u81f4\n uncompress_folder_name: kafka_2.13-3.2.1\n # \u5b58\u50a8\u504f\u79fb\u91cf\u6570\u636e\u6587\u4ef6\uff0c\u9ed8\u8ba4\uff1a\/tmp\/connect.offsets\n offset_storage_file_filename: \/home\/zhoujibin\/kafka_2.13-3.2.1\/connect.offsets\n # \u65e5\u5fd7\u5b58\u50a8\u76ee\u5f55\uff0c\u9ed8\u8ba4\u653e\u5728\u5b89\u88c5\u76ee\u5f55\u4e0b\u7684logs\u76ee\u5f55\n log_dirs: \/home\/zhoujibin\/kafka_2.13-3.2.1\/kafka-logs\n # \u76d1\u542c\u65b9\u5f0f\uff1a\u57df\u540d-domain\uff08\u9ed8\u8ba4\uff09\uff0cip-ip\n listen_type: \nzookeeper:\n # \u914d\u7f6e\u540e\u5c06\u4e0d\u518d\u4f7f\u7528kafka\u5185\u7f6e\u7684zookeeper\n install_from:\n  # \u4ece\u672c\u5730\u5b89\u88c5\uff0c\u9700\u8981\u6307\u5b9a\u5177\u4f53\u7684\u5b89\u88c5\u5305\u8def\u5f84\n  local: \/etc\/ansible\/roles\/kafka\/files\/apache-zookeeper-3.6.3-bin.tar.gz\n # zookeeper\u5b89\u88c5\u76ee\u5f55\n install_dir: \/home\/zhoujibin\/\n # zookeeper \u89e3\u538b\u540e\u7684\u6587\u4ef6\u5939\u540d\u79f0\uff0c\u4e00\u822c\u548c\u538b\u7f29\u5305\u540d\u79f0\u4e00\u81f4\n uncompress_folder_name: apache-zookeeper-3.6.3-bin\n # zookeeper \u65f6\u95f4\u95f4\u9694\u57fa\u672c\u5355\u4f4d\uff0c\u5373\u201c\u6ef4\u7b54\u201d\uff08tick\uff09\u7684\u957f\u5ea6\uff0c\u5355\u4f4d\u662f\u6beb\u79d2\uff0c\u9ed8\u8ba4\uff1a2000\n tick_time:\n # \u521d\u59cb\u5316\u540c\u6b65\u9636\u6bb5\u7684\u9650\u5236\uff0c\u9ed8\u8ba4\uff1a10\n init_limit: \n # \u540c\u6b65\u64cd\u4f5c\u7684\u9650\u5236\uff0c\u540c\u6837\u4ee5\u6ef4\u7b54\u6570\u8ba1\uff0c\u9ed8\u8ba4\uff1a5\n sync_limit: \n # \u6570\u636e\u5b58\u50a8\u76ee\u5f55\uff0c\u9ed8\u8ba4\uff1a\/tmp\/zookeeper\n data_dir: \/home\/zhoujibin\/apache-zookeeper-3.6.3-bin\/data\n# efak\u76f8\u5173\u914d\u7f6e\nefak:\n install_from:\n  # \u4ece\u672c\u5730\u5b89\u88c5\uff0c\u9700\u8981\u6307\u5b9a\u5177\u4f53\u7684\u5b89\u88c5\u5305\u8def\u5f84\n  local: \/etc\/ansible\/roles\/kafka\/files\/efak-web-3.0.1.tar.gz\n # \u5b89\u88c5\u5230\u90a3\u53f0\u673a\u5668\u4e0a\uff0c\u5bf9\u5e94 hostnames \u4e2d\u7684ip\u5c5e\u6027\uff0c\u9ed8\u8ba4\u53d6 hostnames \u6570\u7ec4\u4e2d\u7684\u7b2c\u4e00\u4e2aip\n install_to: \n # efak \u5b89\u88c5\u76ee\u5f55\n install_dir: \/home\/zhoujibin\n # efak \u89e3\u538b\u540e\u7684\u6587\u4ef6\u5939\u540d\u79f0\uff0c\u4e00\u822c\u548c\u538b\u7f29\u5305\u540d\u79f0\u4e00\u81f4\n uncompress_folder_name: efak-web-3.0.1\n # \u6570\u636e\u5b58\u50a8\u76f8\u5173\u914d\u7f6e\uff0c\u76ee\u524d\u5b98\u65b9\u4ec5\u652f\u6301 sqlite \u548c mysql\n driver: org.sqlite.JDBC\n url: jdbc:sqlite:\/home\/zhoujibin\/efak-web-3.0.1\/db\/ke.db\n username: root\n password: roo@123456\n # web ui \u7684\u7aef\u53e3\uff0c\u9ed8\u8ba4\uff1a8048\n webui:\n  port: \n # web ui\u6267\u884c\u64cd\u4f5c\uff08\u5982\uff1a\u5220\u9664totic\uff09\u4f7f\u7528\u7684token\uff0c\u9ed8\u8ba4keadmin\n topic:\n  token:\nEOF<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u6a21\u677f\u6587\u4ef6<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u4f7f\u7528kafka\u5185\u7f6ezookeeper\u65f6\u7684\u914d\u7f6e\u6587\u4ef6<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/roles\/kafka\/templates\/zookeeper-zookeeper.properties &lt;&lt; \\EOF\n# \u8fd9\u4e2a\u53c2\u6570\u6307\u5b9a\u4e86ZooKeeper\u5b58\u50a8\u5feb\u7167\u548c\u4e8b\u52a1\u65e5\u5fd7\u7684\u672c\u5730\u76ee\u5f55\u3002\u5feb\u7167\u662fZooKeeper\u72b6\u6001\u7684\u5b9a\u671f\u5907\u4efd\uff0c\u7528\u4e8e\u5feb\u901f\u6062\u590d\u3002dataDir\u5e94\u5f53\u6307\u5411\u4e00\u4e2a\u5177\u6709\u8db3\u591f\u7a7a\u95f4\u4e14\u6301\u4e45\u5316\u7684\u5b58\u50a8\u4f4d\u7f6e\u3002\u6ce8\u610f\u793a\u4f8b\u4e2d\u7684\/tmp\u4ec5\u7528\u4e8e\u6f14\u793a\uff0c\u5b9e\u9645\u751f\u4ea7\u73af\u5883\u4e2d\u4e0d\u5efa\u8bae\u4f7f\u7528\/tmp\uff0c\u56e0\u4e3a\u5b83\u53ef\u80fd\u968f\u7cfb\u7edf\u91cd\u542f\u800c\u88ab\u6e05\u7a7a\ndataDir={{zookeeper.data_dir}}\n# \u8fd9\u662fZooKeeper\u76d1\u542c\u5ba2\u6237\u7aef\u8fde\u63a5\u7684\u7aef\u53e3\u53f7\u3002\u5ba2\u6237\u7aef\uff0c\u5305\u62ecZooKeeper\u5e94\u7528\u548c\u670d\u52a1\uff0c\u4f1a\u901a\u8fc7\u8fd9\u4e2a\u7aef\u53e3\u4e0eZooKeeper\u96c6\u7fa4\u901a\u4fe1\u3002\u5728\u672c\u4f8b\u4e2d\uff0c\u8fd9\u4e2a\u7aef\u53e3\u662f2181\u3002\u786e\u4fdd\u8fd9\u4e2a\u7aef\u53e3\u5728\u9632\u706b\u5899\u89c4\u5219\u4e2d\u88ab\u6b63\u786e\u5f00\u653e\uff0c\u4e14\u6ca1\u6709\u5176\u4ed6\u670d\u52a1\u5360\u7528\nclientPort={{current_host.zookeeper.client_port}}\n# disable the per-ip limit on the number of connections since this is a non-production config\nmaxClientCnxns=0\n# Disable the adminserver by default to avoid port conflicts.\n# Set the port to something non-conflicting if choosing to enable this\nadmin.enableServer=false\nEOF<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">zookeeper\u96c6\u7fa4\u914d\u7f6e\u6587\u4ef6<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/roles\/kafka\/templates\/zookeeper-zoo.cfg &lt;&lt; \\EOF\n# \u8fd9\u4e2a\u53c2\u6570\u5b9a\u4e49\u4e86zooKeeper\u4e2d\u57fa\u672c\u7684\u65f6\u95f4\u5355\u4f4d\uff0c\u5373\u201c\u6ef4\u7b54\u201d\uff08tick\uff09\u7684\u957f\u5ea6\uff0c\u5355\u4f4d\u662f\u6beb\u79d2\u3002\u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\uff0c\u6bcf\u4e2a\u6ef4\u7b54\u6301\u7eed2000\u6beb\u79d2\u3002ZooKeeper\u4f7f\u7528\u8fd9\u4e2a\u65f6\u95f4\u95f4\u9694\u6765\u8861\u91cf\u4e8b\u4ef6\u548c\u6267\u884c\u5468\u671f\u6027\u64cd\u4f5c\uff0c\u5982\u5fc3\u8df3\u68c0\u6d4b\u3001\u9009\u4e3e\u8d85\u65f6\u8ba1\u7b97\u7b49\ntickTime={{zookeeper.tick_time}}\n# \u521d\u59cb\u5316\u540c\u6b65\u9636\u6bb5\u7684\u9650\u5236\uff0c\u4ee5\u6ef4\u7b54\u6570\u8ba1\u3002\u8fd9\u4e2a\u53c2\u6570\u5b9a\u4e49\u4e86\u5728\u9009\u4e3e\u4e00\u4e2a\u65b0\u7684\u9886\u5bfc\u8005\u671f\u95f4\uff0c\u8ddf\u968f\u8005\u8fde\u63a5\u5230\u9886\u5bfc\u8005\u5e76\u540c\u6b65\u521d\u59cb\u6570\u636e\u96c6\u7684\u6700\u5927\u65f6\u95f4\uff0c\u4ee5\u6ef4\u7b54\u4e3a\u5355\u4f4d\u3002\u5728\u8fd9\u4e2a\u914d\u7f6e\u4e2d\uff0c\u8ddf\u968f\u8005\u670910\u4e2a\u6ef4\u7b54\uff08\u5373tickTime\u4e58\u4ee5initLimit\uff0c\u8fd9\u91cc\u662f20000\u6beb\u79d2\uff09\u7684\u65f6\u95f4\u6765\u5b8c\u6210\u4e0e\u9886\u5bfc\u8005\u540c\u6b65\ninitLimit={{zookeeper.init_limit}}\n# \u540c\u6b65\u64cd\u4f5c\u7684\u9650\u5236\uff0c\u540c\u6837\u4ee5\u6ef4\u7b54\u6570\u8ba1\u3002\u8fd9\u4e2a\u53c2\u6570\u8bbe\u7f6e\u4e86ZooKeeper\u670d\u52a1\u5668\u4e4b\u95f4\u53d1\u9001\u8bf7\u6c42\u548c\u6536\u5230\u54cd\u5e94\uff08\u786e\u8ba4\uff09\u4e4b\u95f4\u80fd\u5bb9\u5fcd\u7684\u6700\u5927\u7b49\u5f85\u6ef4\u7b54\u6570\u3002\u5982\u679c\u8d85\u8fc7\u8fd9\u4e2a\u9650\u5236\u8fd8\u672a\u6536\u5230\u786e\u8ba4\uff0c\u8bf7\u6c42\u5c06\u88ab\u8ba4\u5b9a\u4e3a\u5931\u8d25\u3002\u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\uff0c\u540c\u6b65\u64cd\u4f5c\u6700\u591a\u53ef\u4ee5\u7b49\u5f855\u4e2a\u6ef4\u7b54\uff0810000\u6beb\u79d2\uff09\u6ca1\u6709\u54cd\u5e94\u3002\nsyncLimit={{zookeeper.sync_limit}}\n# \u8fd9\u4e2a\u53c2\u6570\u6307\u5b9a\u4e86zooKeeper\u5b58\u50a8\u5feb\u7167\u548c\u4e8b\u52a1\u65e5\u5fd7\u7684\u672c\u5730\u76ee\u5f55\u3002\u5feb\u7167\u662fZooKeeper\u72b6\u6001\u7684\u5b9a\u671f\u5907\u4efd\uff0c\u7528\u4e8e\u5feb\u901f\u6062\u590d\u3002dataDir\u5e94\u5f53\u6307\u5411\u4e00\u4e2a\u5177\u6709\u8db3\u591f\u7a7a\u95f4\u4e14\u6301\u4e45\u5316\u7684\u5b58\u50a8\u4f4d\u7f6e\u3002\u6ce8\u610f\u793a\u4f8b\u4e2d\u7684\/tmp\u4ec5\u7528\u4e8e\u6f14\u793a\uff0c\u5b9e\u9645\u751f\u4ea7\u73af\u5883\u4e2d\u4e0d\u5efa\u8bae\u4f7f\u7528\/tmp\uff0c\u56e0\u4e3a\u5b83\u53ef\u80fd\u968f\u7cfb\u7edf\u91cd\u542f\u800c\u88ab\u6e05\u7a7a\ndataDir={{zookeeper.data_dir}}\n# \u8fd9\u662fzooKeeper\u76d1\u542c\u5ba2\u6237\u7aef\u8fde\u63a5\u7684\u7aef\u53e3\u53f7\u3002\u5ba2\u6237\u7aef\uff0c\u5305\u62ecZooKeeper\u5e94\u7528\u548c\u670d\u52a1\uff0c\u4f1a\u901a\u8fc7\u8fd9\u4e2a\u7aef\u53e3\u4e0eZooKeeper\u96c6\u7fa4\u901a\u4fe1\u3002\u5728\u672c\u4f8b\u4e2d\uff0c\u8fd9\u4e2a\u7aef\u53e3\u662f2181\u3002\u786e\u4fdd\u8fd9\u4e2a\u7aef\u53e3\u5728\u9632\u706b\u5899\u89c4\u5219\u4e2d\u88ab\u6b63\u786e\u5f00\u653e\uff0c\u4e14\u6ca1\u6709\u5176\u4ed6\u670d\u52a1\u5360\u7528\nclientPort={{current_host.zookeeper.client_port}}\n\n{% if kafka.install_type =='cluster' %}\n# \u6570\u5b571\/2\/3\u9700\u8981\u4e0ezookeeper\u4e2d\u5b9a\u4e49\u7684myid\u6587\u4ef6\u4e00\u81f4\u3002\u53f3\u8fb9\u4e24\u4e2a\u7aef\u53e3\uff0c2888\u8868\u793a\u6570\u636e\u540c\u6b65\u548c\u901a\u4fe1\u7aef\u53e3\uff1b3888\u8868\u793a\u9009\u4e3e\u7aef\u53e3\n{% for host in hostnames -%}\nserver.{{host.zookeeper.myid}}={{host.ip}}:{{host.zookeeper.data_sync_port | string }}:{{host.zookeeper.elect_port | string }}\n{% endfor -%}\n{% endif %}\nEOF<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">zookeeper\u96c6\u7fa4\u6807\u8bc6<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/roles\/kafka\/templates\/zookeeper-myid &lt;&lt; \\EOF\n{{current_host.zookeeper.myid}}\nEOF<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">kafka\u914d\u7f6e\u6587\u4ef6<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/roles\/kafka\/templates\/kafka-server.properties &lt;&lt; \\EOF\nbroker.id={{current_host.kafka.broke_id}}\n\n# kafka\u76d1\u542c\u7684\u5730\u5740\nlisteners=PLAINTEXT:\/\/:{{current_host.kafka.listener_port}}\n{% if kafka.listen_type == 'domain' %}\nadvertised.listeners=PLAINTEXT:\/\/{{current_host.hostname}}:{{current_host.kafka.listener_port}}\n{% endif %}\n{% if kafka.listen_type == 'ip' %}\nadvertised.listeners=PLAINTEXT:\/\/{{current_host.ip}}:{{current_host.kafka.listener_port}}\n{% endif %}\nnum.network.threads=3\nnum.io.threads=8\n\nsocket.send.buffer.bytes=102400\nsocket.receive.buffer.bytes=102400\nsocket.request.max.bytes=104857600\n\n# \u65e5\u5fd7\u5b58\u50a8\u76ee\u5f55\nlog.dirs={{kafka.log_dirs}}\n\nnum.partitions=1\nnum.recovery.threads.per.data.dir=1\n\noffsets.topic.replication.factor=1\ntransaction.state.log.replication.factor=1\ntransaction.state.log.min.isr=1\n\nlog.retention.hours=168\nlog.segment.bytes=1073741824\nlog.retention.check.interval.ms=300000\n\n# \u6b64\u5904\u914d\u7f6e\u6240\u6709\u7684zookeeper\u5730\u5740\uff0c\u683c\u5f0f\uff1aip1:port1,ip2:port2\nzookeeper.connect={{current_host.kafka.zookeeper_list}}\nzookeeper.connection.timeout.ms=18000\n\ngroup.initial.rebalance.delay.ms=0\n\nEOF<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">efak\u914d\u7f6e\u6587\u4ef6<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/roles\/kafka\/templates\/efak-system-config.properties &lt;&lt; \\EOF\n ######################################\n# multi zookeeper &amp; kafka cluster list\n# Settings prefixed with 'kafka.eagle.' will be deprecated, use 'efak.' instead\n######################################\nefak.zk.cluster.alias=cluster1\ncluster1.zk.list={{current_host.kafka.zookeeper_list}}\n\n######################################\n# broker size online list\n######################################\ncluster1.efak.broker.size=20\n\n######################################\n# zk client thread limit\n######################################\nkafka.zk.limit.size=16\n\n######################################\n# EFAK webui port\n######################################\nefak.webui.port={{efak.webui.port}}\n\n######################################\n# kafka offset storage\n######################################\ncluster1.efak.offset.storage=kafka\n\n######################################\n# kafka jmx uri\n######################################\ncluster1.efak.jmx.uri=service:jmx:rmi:\/\/\/jndi\/rmi:\/\/%s\/jmxrmi\n\n######################################\n# kafka sql topic records max\n######################################\nefak.sql.topic.records.max=5000\nefak.sql.topic.preview.records.max=10\n\n######################################\n# delete kafka topic token\n######################################\nefak.topic.token={{efak.topic.token}}\n\n######################################\n# kafka mysql jdbc driver address\n######################################\nefak.driver={{efak.driver}}\nefak.url={{efak.url}}\nefak.username={{efak.username}}\nefak.password={{efak.password}}\nEOF<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u53d8\u91cf\u9ed8\u8ba4\u503c\u521d\u59cb\u5316\u4efb\u52a1<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt;  \/etc\/ansible\/roles\/kafka\/tasks\/default-var-init.yaml &lt;&lt; \\EOF\n - name: \u521d\u59cb\u5316 kafka \u4e2d \u76d1\u542c\u7c7b\u578b\u914d\u7f6e\n   set_fact:\n    kafka: \"{{ kafka | combine({'listen_type': 'domain'}) }}\"\n   when: kafka.listen_type is undefined or kafka.listen_type == None or kafka.listen_type | length == 0\n - name: \u521d\u59cb\u5316 kafka \u4e2d \u65e5\u5fd7\u76ee\u5f55\u914d\u7f6e\n   set_fact:\n    kafka: \"{{ kafka | combine({'log_dirs': '\/tmp\/kafka-logs'}) }}\"\n   when: kafka.log_dirs is undefined or kafka.log_dirs == None or kafka.log_dirs | length == 0\n - name: \u521d\u59cb\u5316 kafka \u4e2d \u5b58\u50a8\u504f\u79fb\u91cf\u6570\u636e\u6587\u4ef6 \u914d\u7f6e\n   set_fact:\n    kafka: \"{{ kafka | combine({'offset_storage_file_filename':'\/tmp\/connect.offsets'}) }}\"\n   when: kafka.offset_storage_file_filename is undefined or kafka.offset_storage_file_filename == None or kafka.offset_storage_file_filename | length == 0\n - name: \u521d\u59cb\u5316 zooKeeper \u4e2d \u57fa\u672c\u7684\u65f6\u95f4\u5355\u4f4d \u914d\u7f6e\n   set_fact:\n    zookeeper: \"{{ zookeeper | combine({'tick_time':'2000'}) }}\"\n   when: zookeeper.tick_time is undefined or zookeeper.tick_time == None or zookeeper.tick_time | length == 0\n - name: \u521d\u59cb\u5316 zooKeeper \u4e2d \u521d\u59cb\u5316\u540c\u6b65\u9636\u6bb5\u7684\u9650\u5236 \u914d\u7f6e\n   set_fact:\n    zookeeper: \"{{ zookeeper | combine({'init_limit':'10'}) }}\"\n   when: zookeeper.init_limit is undefined or zookeeper.init_limit == None or zookeeper.init_limit | length == 0\n - name: \u521d\u59cb\u5316 zooKeeper \u4e2d \u540c\u6b65\u64cd\u4f5c\u7684\u9650\u5236 \u914d\u7f6e\n   set_fact:\n    zookeeper: \"{{ zookeeper | combine({'sync_limit':'5'}) }}\"\n   when: zookeeper.sync_limit is undefined or zookeeper.sync_limit == None or zookeeper.sync_limit | length == 0\n - name: \u521d\u59cb\u5316 zooKeeper \u4e2d \u6570\u636e\u76ee\u5f55 \u914d\u7f6e\n   set_fact:\n    zookeeper: \"{{ zookeeper | combine({'data_dir':'\/tmp\/zookeeper'}) }}\"\n   when: zookeeper.data_dir is undefined or zookeeper.data_dir == None or zookeeper.data_dir | length == 0\n - name: \u8bbe\u7f6e\u9ed8\u8ba4\u7684 zookeeper \u76d1\u542c\u7aef\u53e3\u53d8\u91cf\n   set_fact:\n    default_zookeeper_port: \"2181\"\n - name: \u83b7\u53d6\u5b9a\u4e49\u7684\u6240\u6709zookeeper\u4e3b\u673a\u4fe1\u606f\n   set_fact:\n    temp_zookeeper: \"{{hostnames | json_query('&#91;].{domain:hostname,ip:ip,port:zookeeper.client_port | string}') }}\"\n - name: \u62fc\u63a5 zookeeper \u4e3b\u673a\u4fe1\u606f\uff1aip:port\n   set_fact:\n    temp_zookeeper_list: |-\n       {% for zookeeper in temp_zookeeper -%}\n        {% if zookeeper.port == None or zookeeper.port == '' %}\n          {{ zookeeper.ip }}:{{default_zookeeper_port}}\n        {% else %}\n          {{ zookeeper.ip }}:{{ zookeeper.port }}\n        {% endif %}\n       {% endfor -%}\n   loop: \"{{temp_zookeeper}}\"\n   when: kafka.listen_type == 'ip'\n - name: \u62fc\u63a5 zookeeper \u4e3b\u673a\u4fe1\u606f\uff1a\u57df\u540d:port\n   set_fact:\n    temp_zookeeper_list: |-\n       {% for zookeeper in temp_zookeeper -%}\n        {% if zookeeper.port == None or zookeeper.port == '' %}\n          {{ zookeeper.domain }}:{{default_zookeeper_port}}\n        {% else %}\n          {{ zookeeper.domain }}:{{ zookeeper.port }}\n        {% endif %}\n       {% endfor -%}\n   loop: \"{{temp_zookeeper}}\"\n   when: kafka.listen_type == 'domain'\n - name: \u5b9e\u4f8b\u5316hostnames \u9ed8\u8ba4\u5c5e\u6027\n   set_fact:\n     temp_hostnames: &gt;-\n       {{\n         temp_hostnames | default(&#91;]) +\n         &#91;\n           item | combine(\n             {\n             \"kafka\":{\n              \"listener_port\": \"9092\" if (item.kafka.listener_port is undefined or item.kafka.listener_port == None or not item.kafka.listener_port) else item.kafka.listener_port | string\n               ,\"jmx_port\": \"9999\" if (item.kafka.jmx_port is undefined or item.kafka.jmx_port == None or not item.kafka.jmx_port) else item.kafka.jmx_port | string\n               ,\"zookeeper_list\": \"{{temp_zookeeper_list | trim | regex_replace('\\s+',',') }}\" if (item.kafka.zookeeper_list is undefined or item.kafka.zookeeper_list == None or not   item.kafka.zookeeper_list) else item.kafka.zookeeper_list\n             }\n             ,\"zookeeper\":{\n                \"client_port\": \"{{default_zookeeper_port}}\" if item.zookeeper.client_port is undefined or item.zookeeper.client_port == None or not item.zookeeper.client_port else  item.zookeeper.client_port  | string\n                ,\"data_sync_port\": \"2888\" if item.zookeeper.data_sync_port is undefined or item.zookeeper.data_sync_port == None or not item.zookeeper.data_sync_port else item.zookeeper.data_sync_port | string\n                ,\"elect_port\": \"3888\" if item.zookeeper.elect_port is undefined or item.zookeeper.elect_port == None or not item.zookeeper.elect_port else item.zookeeper.elect_port | string\n             }\n             }\n           ,recursive=True)\n         ]\n       }}\n   loop: \"{{ hostnames }}\"\n   vars:\n     temp_hostnames: &#91;]\n - name: \u91cd\u65b0\u7ed9hostnames\u5c5e\u6027\u8d4b\u503c\n   set_fact:\n    hostnames: \"{{temp_hostnames}}\"\n - name: efak \u5b89\u88c5\u673a\u5668 ip \u6307\u5b9a\uff0c\u9ed8\u8ba4\uff1ahostnames\u6570\u7ec4\u4e2d\u7684\u7b2c\u4e00\u4e2a\u673a\u5668\u7684ip\n   set_fact:\n    efak: \"{{ efak | combine({'install_to':  '{{hostnames&#91;0].ip}}'})}}\"\n   when: efak.install_to is undefined or efak.install_to == None or efak.install_to | length == 0\n - name: efak web ui \u7aef\u53e3\u6307\u5b9a\uff0c\u4e3a\u7a7a\u65f6\u9ed8\u8ba4\uff1a8048\n   set_fact:\n    efak: \"{{ efak | combine({'webui': {'port': '8048'}},recursive=True) }}\"\n   when: efak.webui.port is undefined or efak.webui.port == None or efak.webui.port | length == 0\n - name: \u6267\u884c\u64cd\u4f5c\uff08\u5982\uff1a\u5220\u9664totic\uff09\u4f7f\u7528\u7684token \u6307\u5b9a\uff0c\u4e3a\u7a7a\u65f6\u9ed8\u8ba4\uff1akeadmin\n   set_fact:\n    efak: \"{{ efak | combine({'topic': {'token': 'keadmin'}},recursive=True) }}\"\n   when: efak.topic.token is undefined or efak.topic.token == None or efak.topic.token | length == 0\nEOF<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u5b89\u88c5\u4efb\u52a1<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u4e3b\u673a\u3001\u57df\u540d\u8bbe\u7f6e\u4efb\u52a1<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/roles\/kafka\/tasks\/set-hosts.yaml &lt;&lt; \\EOF\n    - name: \u5224\u65ad\/etc\/hosts\u4e2d\u662f\u5426\u5df2\u7ecf\u5b58\u5728ip\u3001\u57df\u540d\u914d\u7f6e\n      shell: grep -c \"{{item.ip}} {{item.hostname}}\" \/etc\/hosts\n      with_items: \"{{hostnames}}\"\n      register: hosts_exist_flag\n      failed_when: hosts_exist_flag.rc == -1\n    - name: \u5b58\u50a8ip\u3001\u57df\u540d\u914d\u7f6e\u662f\u5426\u5b58\u5728\u5224\u65ad\u7ed3\u679c\n      set_fact:\n       match_count: \"{{hosts_exist_flag.results | json_query(query_hostname_match_condition) | join('') }}\"\n      vars:\n       query_hostname_match_condition: \"&#91;?item.hostname=='{{inventory_hostname}}'].stdout\"\n    - name: \u3010\u5f00\u59cb\u3011\u6dfb\u52a0 kafka ip\u3001\u57df\u540d\u914d\u7f6e\n      shell: echo '# kafka ip\u3001\u57df\u540d\u914d\u7f6e begin' &gt;&gt; \/etc\/hosts\n      when: \n       - match_count == \"0\"\n       - kafka.listen_type == 'domain'\n    - name: \u6b63\u5728\u914d\u7f6e kafka  ip\u3001\u57df\u540d\n      shell: echo '{{item.ip}} {{item.hostname}}' &gt;&gt; \/etc\/hosts\n      when: match_count == \"0\"\n      with_items: \"{{hostnames}}\"\n      when: kafka.listen_type == 'domain'\n    - name: \u3010\u7ed3\u675f\u3011\u6dfb\u52a0 kafka ip\u3001\u57df\u540d\u914d\u7f6e\n      shell: echo '#  kafka ip\u3001\u57df\u540d\u914d\u7f6e end' &gt;&gt; \/etc\/hosts\n      when: \n       - match_count == \"0\"\n       - kafka.listen_type == 'domain'\nEOF<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u521b\u5efazookeeper\u5b89\u88c5\u4efb\u52a1<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt;  \/etc\/ansible\/roles\/kafka\/tasks\/install-zookeeper.yaml &lt;&lt; \\EOF\n   - name: \u5224\u65ad zookeeper \u5b89\u88c5\u5305\u76ee\u5f55\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\u81ea\u52a8\u521b\u5efa\n     file:\n      path: \"{{zookeeper.install_from.local | dirname}}\"\n      state: directory\n     when: not (zookeeper.install_from.local is undefined or zookeeper.install_from.local == None or zookeeper.install_from.local | length == 0)\n   - name: \u590d\u5236 zookeeper \u5b89\u88c5\u5305\u5230\u76ee\u6807\u4e3b\u673a\n     copy: \n      src: \"{{zookeeper.install_from.local}}\"\n      dest: \"{{zookeeper.install_from.local}}\"\n      backup: yes\n     when:  not (zookeeper.install_from.local is undefined or zookeeper.install_from.local == None or zookeeper.install_from.local | length == 0)\n   - name: \u5224\u65ad zookeeper \u5b89\u88c5\u76ee\u5f55\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\u81ea\u52a8\u521b\u5efa\n     file:\n      path: \"{{zookeeper.install_dir}}\"\n      state: directory\n     when: not (zookeeper.install_dir is undefined or zookeeper.install_dir == None or zookeeper.install_dir | length == 0)\n   - name: \u5224\u65ad zookeeper \u6570\u636e\u76ee\u5f55\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\u81ea\u52a8\u521b\u5efa\n     file:\n      path: \"{{zookeeper.data_dir}}\"\n      state: directory\n     when: not (zookeeper.data_dir is undefined or zookeeper.data_dir == None or zookeeper.data_dir | length == 0)\n   - name: \u96c6\u7fa4\u73af\u5883\u4e0b\u5199\u5165\u5185\u5bb9\u81f3 zookeeker \u7684 myid \u6587\u4ef6\n     template: \n      src: \"zookeeper-myid\"\n      dest: \"{{zookeeper.data_dir}}\/myid\"\n      backup: yes\n     when:\n      - kafka.install_type =='cluster' \n      - not (zookeeper.data_dir is undefined or zookeeper.data_dir == None or zookeeper.data_dir | length == 0)\n   - name: \u89e3\u538b\u81ea\u5b9a\u4e49\u7684 zookeeper \u6587\u4ef6\n     shell:\n       cd {{zookeeper.install_from.local | dirname }}\n       &amp;&amp; tar -zxvf {{zookeeper.install_from.local}} -C {{zookeeper.install_dir}}\n     when: not (zookeeper.install_from.local is undefined or zookeeper.install_from.local == None or zookeeper.install_from.local | length == 0)\n   - name: \u4f7f\u7528\u3010\u975e\u5185\u7f6e\u3011\u7684 zookeeper \u914d\u7f6e\u6a21\u677f\u751f\u6210\u9ed8\u8ba4\u914d\u7f6e\u5e76\u5c06\u6587\u4ef6\u5230\u76ee\u6807\u4e3b\u673a\n     template: \n      src: \"zookeeper-zoo.cfg\"\n      dest: \"{{zookeeper.install_dir}}\/{{zookeeper.uncompress_folder_name}}\/conf\/zoo.cfg\"\n      backup: yes\n     when: not (zookeeper.install_from.local is undefined or zookeeper.install_from.local == None or zookeeper.install_from.local | length == 0)\n   - name: \u4f7f\u7528\u3010\u5185\u7f6e\u3011\u7684 zookeeper \u914d\u7f6e\u6a21\u677f\u751f\u6210\u9ed8\u8ba4\u914d\u7f6e\u5e76\u5c06\u6587\u4ef6\u5230\u76ee\u6807\u4e3b\u673a\n     template: \n      src: \"zookeeper-zookeeper.properties\"\n      dest: \"{{kafka.install_dir}}\/{{kafka.uncompress_folder_name}}\/config\/zookeeper.properties\"\n      backup: yes\n     when: not (kafka.install_dir is undefined or kafka.install_dir == None or kafka.install_dir | length == 0)\nEOF<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u521b\u5efa\u7aef\u53e3\u53ca\u542f\u52a8\u811a\u672c\u9ed8\u8ba4\u914d\u7f6e\u4fee\u6539\u4efb\u52a1<\/h4>\n\n\n\n<p>\u6b64\u4efb\u52a1\u4e3b\u8981\u7528\u4e8e\u4fee\u6539\u542f\u52a8\u811a\u672c\u3001kafka\u3001zookeeper\u9ed8\u8ba4\u7aef\u53e3\u914d\u7f6e\u4fe1\u606f\u3002\u5305\u542b\u5982\u4e0b\u4fee\u6539\u70b9\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u6587\u4ef6\u5730\u5740<\/th><th>\u6539\u52a8\u70b9<\/th><th>\u5907\u6ce8<\/th><\/tr><\/thead><tbody><tr><td>kafka\u5b89\u88c5\u76ee\u5f55\/bin\/kafka-run-class.sh<\/td><td>\u5220\u9664-XX:+UseG1GC\u3001\u65b0\u589ejmx\u914d\u7f6e<\/td><td>\u4e0d\u4fee\u6539kafka\u65e0\u6cd5\u542f\u52a8\uff0c\u65e0\u6cd5\u770b\u5230\u76d1\u63a7\u7684jmx\u6570\u636e<\/td><\/tr><tr><td>kafka\u5b89\u88c5\u76ee\u5f55\/bin\/kafka-server-start.sh<\/td><td># 30\u884c\u5de6\u53f3\u6dfb\u52a0JMX\u7684\u7aef\u53e3\u76d1\u542c\u914d\u7f6e<br>JMX_PORT=&#8221;9999&#8243;<\/td><td><\/td><\/tr><tr><td>connect-distributed.properties<\/td><td>bootstrap.servers\u6539\u4e3a\u5f53\u524dkafka\u5bf9\u5e94\u7684ip\u548c\u7aef\u53e3<\/td><td><\/td><\/tr><tr><td>producer.properties<\/td><td>bootstrap.servers\u6539\u4e3a\u5f53\u524dkafka\u5bf9\u5e94\u7684ip\u548c\u7aef\u53e3<\/td><td><\/td><\/tr><tr><td>connect-standalone.properties<\/td><td>bootstrap.servers\u6539\u4e3a\u5f53\u524dkafka\u5bf9\u5e94\u7684ip\u548c\u7aef\u53e3<\/td><td><\/td><\/tr><tr><td>consumer.properties<\/td><td>bootstrap.servers\u6539\u4e3a\u5f53\u524dkafka\u5bf9\u5e94\u7684ip\u548c\u7aef\u53e3<\/td><td><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt;  \/etc\/ansible\/roles\/kafka\/tasks\/update-kafka-port-config.yaml &lt;&lt; \\EOF\n   - name: \u4fee\u6539 kafka-run-class.sh \u542f\u52a8\u811a\u672c\u914d\u7f6e\n     replace:\n      path: \"{{kafka.install_dir}}\/{{kafka.uncompress_folder_name}}\/bin\/kafka-run-class.sh\"\n      regexp: '-XX:\\+UseG1GC'\n      replace: \"\"\n   - name: \u4fee\u6539 kafka-run-class.sh \u542f\u52a8\u811a\u672c\u76d1\u542c\u65b9\u5f0f\uff08ip\uff09\u914d\u7f6e\n     replace:\n      path: \"{{kafka.install_dir}}\/{{kafka.uncompress_folder_name}}\/bin\/kafka-run-class.sh\"\n      regexp: '-Djava\\.awt\\.headless=true'\n      replace: \"{{'-Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Dcom.sun.management.jmxremote.host=0.0.0.0 -Dcom.sun.management.jmxremote.local.only=false -Djava.rmi.server.hostname=' + current_host.ip}}\"\n     when: kafka.listen_type == 'ip'\n   - name: \u4fee\u6539 kafka-run-class.sh \u542f\u52a8\u811a\u672c\u76d1\u542c\u65b9\u5f0f\uff08domain\uff09\u914d\u7f6e\n     replace:\n      path: \"{{kafka.install_dir}}\/{{kafka.uncompress_folder_name}}\/bin\/kafka-run-class.sh\"\n      regexp: '-Djava\\.awt\\.headless=true'\n      replace: \"{{'-Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Dcom.sun.management.jmxremote.host=0.0.0.0 -Dcom.sun.management.jmxremote.local.only=false -Djava.rmi.server.hostname=' + current_host.hostname}}\"\n     when: kafka.listen_type == 'domain'\n   - name: \u5224\u65ad kafka kafka-server-start.sh \u811a\u672c\u4e2d\u662f\u5426\u8bbe\u7f6e\u4e86 JMX_PORT\n     shell: \"grep -c 'export JMX_PORT=\\\"{current_host.kafka.jmx_port}}\\\"' {{kafka.install_dir}}\/{{kafka.uncompress_folder_name}}\/bin\/kafka-server-start.sh\"\n     # \u5c06\u7ed3\u679c\u5b58\u50a8\u5728\u53d8\u91cf\u4e2d\n     register: jxm_port_exist_flag\n     failed_when: jxm_port_exist_flag.rc == -1\n   - name: \u6dfb\u52a0 JMX_PORT \u914d\u7f6e\n     shell: \"sed -i '29 a export JMX_PORT=\\\"{{current_host.kafka.jmx_port}}\\\"' {{kafka.install_dir}}\/{{kafka.uncompress_folder_name}}\/bin\/kafka-server-start.sh\"\n     when: jxm_port_exist_flag.stdout == '0'\n   - name: \u4fee\u6539 connect-distributed.properties \u914d\u7f6e\n     replace:\n      path: \"{{kafka.install_dir}}\/{{kafka.uncompress_folder_name}}\/config\/connect-distributed.properties\"\n      regexp: 'localhost:9092'\n      replace: \"{{current_host.ip+':'+current_host.kafka.listener_port}}\"\n     when: kafka.listen_type == 'ip'\n   - name: \u4fee\u6539 connect-distributed.properties \u914d\u7f6e\n     replace:\n      path: \"{{kafka.install_dir}}\/{{kafka.uncompress_folder_name}}\/config\/connect-distributed.properties\"\n      regexp: 'localhost:9092'\n      replace: \"{{current_host.hostname+':'+current_host.kafka.listener_port}}\"\n     when: kafka.listen_type == 'domain'\n   - name: \u4fee\u6539 producer.properties \u914d\u7f6e\n     replace:\n      path: \"{{kafka.install_dir}}\/{{kafka.uncompress_folder_name}}\/config\/producer.properties\"\n      regexp: 'localhost:9092'\n      replace: \"{{current_host.ip+':'+current_host.kafka.listener_port}}\"\n     when: kafka.listen_type == 'ip'\n   - name: \u4fee\u6539 producer.properties \u914d\u7f6e\n     replace:\n      path: \"{{kafka.install_dir}}\/{{kafka.uncompress_folder_name}}\/config\/producer.properties\"\n      regexp: 'localhost:9092'\n      replace: \"{{current_host.hostname+':'+current_host.kafka.listener_port}}\"\n     when: kafka.listen_type == 'domain'\n   - name: \u4fee\u6539 connect-standalone.properties \u4e2d\u7684\u914d\u7f6e\n     replace:\n      path: \"{{kafka.install_dir}}\/{{kafka.uncompress_folder_name}}\/config\/connect-standalone.properties\"\n      regexp: 'localhost:9092'\n      replace: \"{{current_host.ip+':'+current_host.kafka.listener_port}}\"\n     when: kafka.listen_type == 'ip'\n   - name: \u4fee\u6539 connect-standalone.properties \u4e2d\u7684\u914d\u7f6e\n     replace:\n      path: \"{{kafka.install_dir}}\/{{kafka.uncompress_folder_name}}\/config\/connect-standalone.properties\"\n      regexp: 'localhost:9092'\n      replace: \"{{current_host.hostname+':'+current_host.kafka.listener_port}}\"\n     when: kafka.listen_type == 'domain'\n   - name: \u4fee\u6539 connect-standalone.properties \u914d\u7f6e\n     replace:\n      path: \"{{kafka.install_dir}}\/{{kafka.uncompress_folder_name}}\/config\/connect-standalone.properties\"\n      regexp: '\/tmp\/connect.offsets'\n      replace: \"{{kafka.offset_storage_file_filename}}\"\n   - name: \u4fee\u6539 consumer.properties \u914d\u7f6e\n     replace:\n      path: \"{{kafka.install_dir}}\/{{kafka.uncompress_folder_name}}\/config\/consumer.properties\"\n      regexp: 'localhost:9092'\n      replace: \"{{current_host.ip+':'+current_host.kafka.listener_port}}\"\n     when: kafka.listen_type == 'ip'\n   - name: \u4fee\u6539 consumer.properties \u914d\u7f6e\n     replace:\n      path: \"{{kafka.install_dir}}\/{{kafka.uncompress_folder_name}}\/config\/consumer.properties\"\n      regexp: 'localhost:9092'\n      replace: \"{{current_host.hostname+':'+current_host.kafka.listener_port}}\"\n     when: kafka.listen_type == 'domain'\nEOF<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">efak\u5b89\u88c5\u4efb\u52a1<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt;  \/etc\/ansible\/roles\/kafka\/tasks\/install-efak.yaml &lt;&lt; \\EOF\n   - name: \u5224\u65ad efak \u5b89\u88c5\u5305\u76ee\u5f55\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\u81ea\u52a8\u521b\u5efa\n     file:\n      path: \"{{efak.install_from.local | dirname}}\"\n      state: directory\n     when:\n      - efak.install_to == current_host.ip\n      - not (efak.install_from.local is undefined or efak.install_from.local == None or efak.install_from.local | length == 0)\n   - name: \u5224\u65ad efak \u5b89\u88c5\u76ee\u5f55\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\u81ea\u52a8\u521b\u5efa\n     file:\n      path: \"{{efak.install_dir}}\"\n      state: directory\n     when:\n      - efak.install_to == current_host.ip\n      - not (efak.install_dir is undefined or efak.install_dir == None or efak.install_dir | length == 0)\n   - name: \u590d\u5236 efak \u5b89\u88c5\u5305\u5230\u76ee\u6807\u4e3b\u673a\n     copy: \n      src: \"{{efak.install_from.local}}\"\n      dest: \"{{efak.install_from.local}}\"\n      backup: yes\n     when:\n      - efak.install_to == current_host.ip\n      - not (efak.install_from.local is undefined or efak.install_from.local == None or efak.install_from.local | length == 0)\n   - name: \u89e3\u538b efak \u5b89\u88c5\u5305\n     shell:\n      cd {{efak.install_from.local | dirname }}\n      &amp;&amp; tar -zxvf {{efak.install_from.local}} -C {{efak.install_dir}}\n     when:\n      - efak.install_to == current_host.ip\n      - not (efak.install_from.local is undefined or efak.install_from.local == None or efak.install_from.local | length == 0)\n   - name: \u5224\u65ad efak \u662f\u5426\u9700\u8981\u521b\u5efa sqlite \u6570\u636e\u5e93\u6587\u4ef6\n     file:\n      path: \"{{efak.url | replace('jdbc:sqlite:','') }}\"\n      state: touch\n     when:\n      - efak.install_to == current_host.ip\n      - not (efak.url is undefined or efak.url == None or efak.url | length == 0)\n      - \"{{efak.url.startswith('jdbc:sqlite:')}}\"\n   - name: \u4ece efak \u914d\u7f6e\u6a21\u677f\u751f\u6210\u9ed8\u8ba4\u914d\u7f6e\u5e76\u5c06\u6587\u4ef6\u5230\u76ee\u6807\u4e3b\u673a\n     template: \n      src: \"efak-system-config.properties\"\n      dest: \"{{efak.install_dir}}\/{{efak.uncompress_folder_name}}\/conf\/system-config.properties\"\n      backup: yes\n     when:\n      - efak.install_to == current_host.ip\n      - not (kafka.install_from.local is undefined or kafka.install_from.local == None or kafka.install_from.local | length == 0)\n   - name: \u4fee\u6539 efak \u542f\u52a8\u811a\u672c\u914d\u7f6e\n     replace:\n      path: \"{{efak.install_dir}}\/{{efak.uncompress_folder_name}}\/bin\/ke.sh\"\n      regexp: '-XX:\\+UseG1GC'\n      replace: \"\"\n     when: efak.install_to == current_host.ip\n   - name: \u8bbe\u7f6e efak \u73af\u5883\u53d8\u91cf\n     lineinfile:\n      path: \/etc\/profile\n      line: \"export KE_HOME={{efak.install_dir}}\/{{efak.uncompress_folder_name}}\"\n      state: present\n      insertafter: EOF\n     when: efak.install_to == current_host.ip\n   - name: \u542f\u52a8 efak\uff08\u5ef6\u540e5s\u6267\u884c\uff0c\u7b49\u5f85\u6240\u6709\u7684kafka\u96c6\u7fa4\u542f\u52a8\u5b8c\u6bd5\uff09\n     shell:\n      cmd: |\n       sleep 5s\n       source \/etc\/profile\n       cd {{efak.install_dir}}\/{{efak.uncompress_folder_name}}\/bin &amp;&amp; .\/ke.sh start\n      executable: \/bin\/bash\n     when:\n      - efak.install_to == current_host.ip\n      - not (efak.install_from.local is undefined or efak.install_from.local == None or efak.install_from.local | length == 0)\nEOF<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">kafka\u5b89\u88c5\u4efb\u52a1<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt;  \/etc\/ansible\/roles\/kafka\/tasks\/install-kafka.yaml &lt;&lt; \\EOF\n   - name: \u83b7\u5f97\u5f53\u524d\u4e3b\u673a\u4e0b\u914d\u7f6e\u7684\u6240\u6709\u81ea\u5b9a\u4e49\u53d8\u91cf\n     set_fact:\n      # \u83b7\u53d6\u5f53\u524d\u4e3b\u673a\u81ea\u5b9a\u4e49\u7684\u53d8\u91cf\n      current_host: \"{{hostnames | json_query(query_condition) }}\"\n     vars:\n     # \u67e5\u8be2\u51fa\u7684\u7ed3\u679c\u4e3a\u4e00\u4e2ajson\u6570\u7ec4\uff0c\u53d6\u7b2c\u4e00\u6761\u5373\u53ef\n      query_condition: \"&#91;?hostname=='{{inventory_hostname}}'] | &#91;0]\"\n   # \u5b89\u88c5\u65b9\u5f0f\u6821\u9a8c\n   - fail: \n      msg: \"\u5b89\u88c5kafka\u65f6\u9700\u8981\u6307\u5b9a\u5b89\u88c5\u65b9\u5f0f\uff0c\u3010kafka.install_from.local\u3011\u4e0d\u80fd\u4e3a\u7a7a\"\n     when: \n      - kafka.install_from.local is undefined or kafka.install_from.local == None or kafka.install_from.local | length == 0\n   - name: \u5224\u65ad kafka\u5b89\u88c5\u5305\u76ee\u5f55\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\u81ea\u52a8\u521b\u5efa\n     file:\n      path: \"{{kafka.install_from.local | dirname}}\"\n      state: directory\n     when: not (kafka.install_from.local is undefined or kafka.install_from.local == None or kafka.install_from.local | length == 0)\n   - name: \u5224\u65ad kafka \u5b89\u88c5\u76ee\u5f55\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\u81ea\u52a8\u521b\u5efa\n     file:\n      path: \"{{kafka.install_dir}}\"\n      state: directory\n     when: not (kafka.install_dir is undefined or kafka.install_dir == None or kafka.install_dir | length == 0)\n   - name: \u5224\u65ad kafka \u65e5\u5fd7\u5b58\u50a8\u76ee\u5f55\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\u81ea\u52a8\u521b\u5efa\n     file:\n      path: \"{{kafka.log_dirs}}\"\n      state: directory\n     when: not (kafka.log_dirs is undefined or kafka.log_dirs == None or kafka.log_dirs | length == 0)\n   - name: \u590d\u5236 kafka \u5b89\u88c5\u5305\u5230\u76ee\u6807\u4e3b\u673a\n     copy: \n      src: \"{{kafka.install_from.local}}\"\n      dest: \"{{kafka.install_from.local}}\"\n      backup: yes\n     when:  not (kafka.install_from.local is undefined or kafka.install_from.local == None or kafka.install_from.local | length == 0)\n   - name: \u89e3\u538b kafka \u5b89\u88c5\u5305\n     shell:\n      cd {{kafka.install_from.local | dirname }}\n      &amp;&amp; tar -zxvf {{kafka.install_from.local}} -C {{kafka.install_dir}}\n     when:  not (kafka.install_from.local is undefined or kafka.install_from.local == None or kafka.install_from.local | length == 0)\n   - name: \u4ece kafka \u914d\u7f6e\u6a21\u677f\u751f\u6210\u9ed8\u8ba4\u914d\u7f6e\u5e76\u5c06\u6587\u4ef6\u5230\u76ee\u6807\u4e3b\u673a\n     template: \n      src: \"kafka-server.properties\"\n      dest: \"{{kafka.install_dir}}\/{{kafka.uncompress_folder_name}}\/config\/server.properties\"\n      backup: yes\n     when: not (kafka.install_from.local is undefined or kafka.install_from.local == None or kafka.install_from.local | length == 0)\n   - name: \u5224\u65ad kafka \u65e5\u5fd7\u5b58\u50a8\u76ee\u5f55\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\u81ea\u52a8\u521b\u5efa\n     file:\n      path: \"{{kafka.log_dirs}}\"\n      state: directory\n     when: not (kafka.log_dirs is undefined or kafka.log_dirs == None or kafka.log_dirs | length == 0)\n   - name: \u5224\u65ad kafka \u5b58\u50a8\u504f\u79fb\u91cf\u6570\u636e\u6587\u4ef6\u6587\u4ef6\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\u81ea\u52a8\u521b\u5efa\n     file:\n      path: \"{{kafka.offset_storage_file_filename}}\"\n      state: touch\n     when: kafka.offset_storage_file_filename is undefined or kafka.offset_storage_file_filename == None or kafka.offset_storage_file_filename | length == 0\n     # \u5bfc\u5165 zookeeper \u5b89\u88c5\u4efb\u52a1\n   - import_tasks: install-zookeeper.yaml\n   # \u5bfc\u5165\u914d\u7f6e\u6587\u4ef6\u53ca\u7aef\u53e3\u4fee\u6539\u4efb\u52a1\n   - import_tasks: update-kafka-port-config.yaml\n   - name: \u542f\u52a8\u3010\u975e\u5185\u7f6ezookeeper\u3011\u65f6\u7684zookeeper\u3001kafka\n     shell:\n      cmd: |\n       source \/etc\/profile\n       cd {{zookeeper.install_dir}}\/{{zookeeper.uncompress_folder_name}}\/bin\n       .\/zkServer.sh start ..\/conf\/zoo.cfg\n       cd {{kafka.install_dir}}\/{{kafka.uncompress_folder_name}}\/bin\n       .\/kafka-server-start.sh -daemon ..\/config\/server.properties\n      executable: \/bin\/bash\n     when: \n      - not (zookeeper.install_from.local is undefined or zookeeper.install_from.local == None or zookeeper.install_from.local | length == 0) \n   - name: \u542f\u52a8\u3010\u5185\u7f6ezookeeper\u3011\u65f6\u7684zookeeper\u3001kafka\n     shell:\n      cmd: |\n       source \/etc\/profile\n       cd {{kafka.install_dir}}\/{{kafka.uncompress_folder_name}}\/bin\n       .\/zookeeper-server-start.sh -daemon ..\/config\/zookeeper.properties\n       .\/kafka-server-start.sh -daemon ..\/config\/server.properties\n      executable: \/bin\/bash\n     when: \n      - not (zookeeper.install_from.local is undefined or zookeeper.install_from.local == None or zookeeper.install_from.local | length == 0)\nEOF<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u6c47\u603b\u4efb\u52a1<\/h4>\n\n\n\n<p>\u5c06\u4e0a\u8ff0\u4efb\u52a1\u6dfb\u52a0\u81f3main.yaml\u4e2d<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/roles\/kafka\/tasks\/main.yaml &lt;&lt; \\EOF\n   # \u9ed8\u8ba4\u53d8\u91cf\u5904\u7406\u4efb\u52a1\n   - import_tasks: default-var-init.yaml\n   # \u8bbe\u7f6ehosts\u8bbe\u7f6e\u4efb\u52a1\n   - import_tasks: set-hosts.yaml\n   # \u5b89\u88c5kafka\n   - import_tasks: install-kafka.yaml\n   # \u5b89\u88c5efak\n   - import_tasks: install-efak.yaml\nEOF<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u6267\u884c\u6587\u4ef6<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/install-kafka.yaml &lt;&lt; \\EOF\n---\n- hosts: kafka\n  roles:\n    # kafka\u4f9d\u8d56jdk\uff0c\u9700\u8981\u5148\u5b89\u88c5jdk\n   - role: jdk\n     # \u8bbe\u7f6ejdk\u5b89\u88c5\u51fa\u9519\u65f6\u4e0d\u5f71\u54cd\u540e\u7eed\u6d41\u7a0b\n     ignore_errors: true\n   - kafka\nEOF<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u6267\u884c\u811a\u672c<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>ansible-playbook \/etc\/ansible\/install-kafka.yaml<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">zookeeper\u3001kafka\u76f8\u5173\u542f\u52a8\u811a\u672c<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u5185\u7f6ezookeeper<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>cd \/home\/zhoujibin\/kafka_2.13-3.2.1\/bin\n# \u542f\u52a8zookeeper\n.\/zookeeper-server-start.sh -daemon ..\/config\/zookeeper.properties\n# \u542f\u52a8kafka\n.\/kafka-server-start.sh -daemon ..\/config\/server.properties\n\n# \u67e5\u770b\u542f\u52a8\u65e5\u5fd7\ntail -100f ..\/logs\/server.log\n\n# \u5173\u95edzookeeper\n.\/zookeeper-server-stop.sh\n# \u5173\u95edkafka\n.\/kafka-server-stop.sh<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u975e\u5185\u7f6ezookeeper<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>cd \/home\/zhoujibin\/apache-zookeeper-3.6.3-bin\/bin\n# \u542f\u52a8zookeeper\uff0c\u4e0d\u6307\u5b9a\u914d\u7f6e\u6587\u4ef6\u65f6\u9ed8\u8ba4\u52a0\u8f7dconf\u76ee\u5f55\u4e0b\u7684zoo.cfg\n.\/zkServer.sh start ..\/conf\/zoo.cfg\n# \u542f\u52a8kafka\ncd \/home\/zhoujibin\/kafka_2.13-3.2.1\/\/bin\n.\/kafka-server-start.sh -daemon ..\/config\/server.properties\n\n# \u67e5\u770b\u542f\u52a8\u65e5\u5fd7\ntail -100f ..\/logs\/server.log\n\n# \u5173\u95edzookeeper\ncd \/home\/zhoujibin\/apache-zookeeper-3.6.3-bin\/\/bin\n.\/zkServer.sh stop\n# \u5173\u95edkafka\ncd \/home\/zhoujibin\/kafka_2.13-3.2.1\/\/bin\n.\/kafka-server-stop.sh<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u5220\u9664zookeeper\u3001kafka\uff08\u4e0b\u8ff0\u547d\u4ee4\u4ec5\u5728\u6d4b\u8bd5\u65f6\u4f7f\u7528\uff09<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># \u5378\u8f7d\u5220\u9664zookeeper\u3001kafka\uff08\u4e0b\u8ff0\u547d\u4ee4\u4ec5\u5728\u6d4b\u8bd5\u65f6\u4f7f\u7528\uff09\nrm -rf \/home\/zhoujibin\/apache-zookeeper-3.6.3-bin  \/home\/zhoujibin\/kafka_2.13-3.2.1 \/home\/zhoujibin\/efak-web-3.0.1<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u91cd\u542f\u811a\u672c\u6c47\u603b<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>\/home\/zhoujibin\/apache-zookeeper-3.6.3-bin\/\/bin\/zkServer.sh stop &amp;&amp; \/home\/zhoujibin\/kafka_2.13-3.2.1\/\/bin\/kafka-server-stop.sh &amp;&amp; \/home\/zhoujibin\/efak-web-3.0.1\/bin\/ke.sh stop\n\n\/home\/zhoujibin\/apache-zookeeper-3.6.3-bin\/bin\/zkServer.sh start \/home\/zhoujibin\/apache-zookeeper-3.6.3-bin\/conf\/zoo.cfg &amp;&amp; \/home\/zhoujibin\/kafka_2.13-3.2.1\/bin\/kafka-server-start.sh -daemon \/home\/zhoujibin\/kafka_2.13-3.2.1\/config\/server.properties\n# \u4e0b\u8ff0\u811a\u672c\u5728\u88c5\u6709efak\u7684\u96c6\u7fa4\u4e0a\u6267\u884c\n\/home\/zhoujibin\/efak-web-3.0.1\/bin\/ke.sh start<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u5b89\u88c5mongo<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u8d44\u6e90\u6e05\u5355<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt;&gt; \/etc\/ansible\/hosts &lt;&lt; \\EOF\n# \u6307\u5b9a\u5206\u7ec4\u540d\u79f0\uff0c\u5982\uff1amongo\uff0c\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u8c03\u6574<\/code><\/pre>\n\n\n<p>[mongo]<\/p>\n\n\n\n<p>k8s-master ansible_ssh_host=192.168.13.247 ansible_ssh_port=22 ansible_ssh_user=root k8s-worker-01 ansible_ssh_host=192.168.13.16 ansible_ssh_port=22 ansible_ssh_user=root k8s-worker-02 ansible_ssh_host=192.168.13.51 ansible_ssh_port=22 ansible_ssh_user=root EOF<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u89d2\u8272\u76ee\u5f55<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir -p \/etc\/ansible\/roles\/mongo\ncd \/etc\/ansible\/roles\/mongo\/\nmkdir  tasks vars files files\/x86_64 files\/aarch64 templates<\/code><\/pre>\n\n\n\n<p>\u5b89\u88c5\u5305\u4e0b\u8f7d\u5730\u5740\uff1a<\/p>\n\n\n\n<p>centos:<\/p>\n\n\n\n<p>x86:https:\/\/fastdl.mongodb.org\/linux\/mongodb-linux-x86_64-rhel70-4.4.4.tgz<\/p>\n\n\n\n<p>arm64:https:\/\/fastdl.mongodb.org\/linux\/mongodb-linux-aarch64-rhel82-4.4.4.tgz<\/p>\n\n\n\n<p>ubuntu:<\/p>\n\n\n\n<p>x86:https:\/\/fastdl.mongodb.org\/linux\/mongodb-linux-x86_64-ubuntu2004-4.4.4.tgz<\/p>\n\n\n\n<p>arm64:https:\/\/fastdl.mongodb.org\/linux\/mongodb-linux-aarch64-ubuntu2004-4.4.4.tgz<\/p>\n\n\n\n<p>\u6ce8\u610f\uff1a\u82e5\u4f7f\u7528\u81ea\u5b9a\u4e49\u7684\u5b89\u88c5\u5305\uff0c\u8bf7\u4fdd\u8bc1\u52a0\u538b\u540e\u7684\u6587\u4ef6\u5939\u5728\u4e0d\u540c\u7684\u7cfb\u7edf\u67b6\u6784\u4e0b\u662f\u4e00\u6837\u7684\u540d\u79f0<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u53d8\u91cf<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/roles\/mongo\/vars\/main.yaml &lt;&lt; \\EOF\n # \u96c6\u7fa4\u5b89\u88c5\u65f6\u9700\u8981\u914d\u7f6e\u591a\u53f0\u673a\u5668\nhostnames:\n - ip: 192.168.13.247\n   hostname: k8s-master\n   mongo:\n    # \u8fd0\u884c\u65f6\u7684\u7aef\u53e3\uff0c\u9ed8\u8ba4-7004\n    port:\n    # \u6743\u91cd\uff0c\u6743\u91cd\u6700\u9ad8\u7684\u662f\u4e3b\u8282\u70b9 \uff0c\u6570\u5b57\u8d8a\u5927\uff0c\u6743\u91cd\u8d8a\u9ad8,\u4e0d\u6307\u5b9a\u9ed8\u8ba4\u5728\u524d\u9762\u7684\u5143\u7d20\u6743\u91cd\u5927\n    priority: \n    # \u662f\u5426\u4f5c\u4e3a\u4ef2\u88c1\u8282\u70b9\uff0c\u9ed8\u8ba4-false\uff0c\u82e5\u90fd\u672a\u6307\u5b9a\uff0c\u5219\u9ed8\u8ba4\u6700\u540e\u4e00\u4e2a\u8282\u70b9\u4e3a\u4ef2\u88c1\u8282\u70b9\n    arbiterOnly:\n - ip: 192.168.13.16\n   hostname: k8s-worker-01\n   mongo:\n    # \u8fd0\u884c\u65f6\u7684\u7aef\u53e3\uff0c\u9ed8\u8ba4-7004\n    port:\n    # \u6743\u91cd\uff0c\u6743\u91cd\u6700\u9ad8\u7684\u662f\u4e3b\u8282\u70b9 \uff0c\u6570\u5b57\u8d8a\u5927\uff0c\u6743\u91cd\u8d8a\u9ad8,\u4e0d\u6307\u5b9a\u9ed8\u8ba4\u5728\u524d\u9762\u7684\u5143\u7d20\u6743\u91cd\u5927\n    priority: \n    # \u662f\u5426\u4f5c\u4e3a\u4ef2\u88c1\u8282\u70b9\uff0c\u9ed8\u8ba4-false\uff0c\u82e5\u90fd\u672a\u6307\u5b9a\uff0c\u5219\u9ed8\u8ba4\u6700\u540e\u4e00\u4e2a\u8282\u70b9\u4e3a\u4ef2\u88c1\u8282\u70b9\n    arbiterOnly:\n - ip: 192.168.13.51\n   hostname: k8s-worker-02\n   mongo:\n    # \u8fd0\u884c\u65f6\u7684\u7aef\u53e3\uff0c\u9ed8\u8ba4-7004\n    port:\n    # \u6743\u91cd\uff0c\u6743\u91cd\u6700\u9ad8\u7684\u662f\u4e3b\u8282\u70b9 \uff0c\u6570\u5b57\u8d8a\u5927\uff0c\u6743\u91cd\u8d8a\u9ad8,\u4e0d\u6307\u5b9a\u9ed8\u8ba4\u5728\u524d\u9762\u7684\u5143\u7d20\u6743\u91cd\u5927\n    priority: \n    # \u662f\u5426\u4f5c\u4e3a\u4ef2\u88c1\u8282\u70b9\uff0c\u9ed8\u8ba4-false\uff0c\u82e5\u90fd\u672a\u6307\u5b9a\uff0c\u5219\u9ed8\u8ba4\u6700\u540e\u4e00\u4e2a\u8282\u70b9\u4e3a\u4ef2\u88c1\u8282\u70b9\n    arbiterOnly:\nmongo:\n # \u5b89\u88c5\u7c7b\u578b\uff1a\u5355\u673a-standalone\uff08\u9ed8\u8ba4\uff09\uff0c\u96c6\u7fa4-cluster\n install_type: cluster\n # \u96c6\u7fa4\u7684\u540d\u79f0\uff0c\u9ed8\u8ba4\uff1amongo-cluster\n cluster_name:\n install_from:\n  # \u4ece\u672c\u5730\u5b89\u88c5\uff0cansible_facts.architecture\u53d8\u91cf\u793a\u4f8b\uff1ax86_64\u3001aarch64\n  local: \"\/etc\/ansible\/roles\/mongo\/files\/{{ansible_facts.architecture}}\/mongodb-linux-4.4.4.tar.gz\"\n # mongo \u5b89\u88c5\u76ee\u5f55\n install_dir: \/home\/zhoujibin\n # mongo \u538b\u7f29\u5305\u89e3\u538b\u540e\u7684\u6587\u4ef6\u5939\u540d\u79f0\uff0c\u4e00\u822c\u548c\u538b\u7f29\u5305\u540d\u79f0\u4e00\u81f4\n uncompress_folder_name: mongodb-linux-4.4.4\n # \u662f\u5426\u5f00\u542f\u8ba4\u8bc1\uff0c\u9ed8\u8ba4-false\n auth:\n # \u914d\u7f6e\u6587\u4ef6\u5b58\u50a8\u76ee\u5f55\uff0c\u9ed8\u8ba4\u5728\u5b89\u88c5\u76ee\u5f55\u4e0b\u7684 etc \u76ee\u5f55\u4e2d\n config_dir:\n # \u6570\u636e\u5b58\u50a8\u76ee\u5f55\uff0c\u9ed8\u8ba4\u5728\u5b89\u88c5\u76ee\u5f55\u4e0b\u7684 data \u76ee\u5f55\u4e2d\n db_path:\n # \u65e5\u5fd7\u6587\u4ef6\u8def\u5f84\uff0c\u9ed8\u8ba4\u5728\u5b89\u88c5\u76ee\u5f55\u4e0b\uff0c\u6587\u4ef6\u540d\u4e3a\uff1amongodb.log\n log_path:\n # \u8fdb\u7a0b\u6587\u4ef6\u8def\u5f84\uff0c\u9ed8\u8ba4\u5728\u5b89\u88c5\u76ee\u5f55\u4e0b\uff0c\u6587\u4ef6\u540d\u4e3a mongodb.pid\n pid_file_path:\n# \u7a0b\u5e8f\u5b89\u88c5\u540e\u7684\u76f8\u5173\u53c2\u6570\nconfig:\n # \u5b89\u88c5\u540e\u662f\u5426\u7acb\u5373\u8fd0\u884c\n run_after_install:\n # \u542f\u52a8\u7a0b\u5e8f\u65f6\u4f7f\u7528\u7684\u7528\u6237\u4fe1\u606f\uff0c\u9ed8\u8ba4-root\n run_user:\n  name:\n  group:\n # \u662f\u5426\u5f00\u673a\u81ea\u542f\uff0c\u9ed8\u8ba4-true\n start_follow_server: \n# \u6570\u636e\u521d\u59cb\u5316\u76f8\u5173\u914d\u7f6e\ninit:\n # \u7ba1\u7406\u5458\u8d26\u6237\uff0c\u9ed8\u8ba4\uff1azhoujibin_root\/123456\n admin_user:\n  username:\n  password:\n  # \u5141\u8bb8\u8bbf\u95ee\u7684\u6570\u636e\u5e93\uff0c\u9ed8\u8ba4\uff1aadmin\n  db: \n # \u666e\u901a\u7528\u6237\uff0c\u9ed8\u8ba4-zhoujibin\/123456\n normal_user:\n  username:\n  password:\n  # \u5141\u8bb8\u8bbf\u95ee\u7684\u6570\u636e\u5e93\uff0c\u9ed8\u8ba4\uff1atest\uff0c\u4e00\u822c\u548c\u9879\u76ee\u4fdd\u6301\u4e00\u81f4\n  db:\n  # \u9700\u8981\u521d\u59cb\u5316\u521b\u5efa\u7684\u96c6\u5408\uff0c\u6570\u636e\u7c7b\u578b\u4e3a\u5b57\u7b26\u4e32\u6570\u7ec4\n  collection:\nEOF<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u6a21\u677f\u6587\u4ef6<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u914d\u7f6e\u6587\u4ef6<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/roles\/mongo\/templates\/mongodb.conf &lt;&lt; \\EOF\n # \u662f\u5426\u9700\u8981\u6388\u6743\nauth={{mongo.auth | lower}}\n# \u6570\u636e\u5b58\u50a8\u76ee\u5f55\ndbpath={{mongo.db_path}}\n# \u65e5\u5fd7\u6587\u4ef6\u5730\u5740\nlogpath={{mongo.log_path}}\n# \u8fdb\u7a0b\u6587\u4ef6\u5730\u5740\npidfilepath={{mongo.pid_file_path}}\n# \u4ee5\u8ffd\u52a0\u7684\u65b9\u5f0f\u8bb0\u5f55\u65e5\u5fd7\nlogappend=true\n# \u670d\u52a1\u7ed1\u5b9a\u7684ip\nbind_ip={{current_host.ip}}\n# \u670d\u52a1\u8fd0\u884c\u65f6\u7684\u7aef\u53e3\nport={{current_host.mongo.port}}\n# \u662f\u5426\u540e\u53f0\u8fd0\u884c\nfork=true\n{% if mongo.cluster_name is defined and mongo.install_type == 'cluster' %}\n# \u96c6\u7fa4\u540d\u79f0\nreplSet={{mongo.cluster_name}}\n{% endif %}\nEOF<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u670d\u52a1\u81ea\u542f\u6587\u4ef6<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/roles\/mongo\/templates\/mongo.service &lt;&lt; \\EOF\n&#91;Unit]\nDescription=mongo system config \nAfter=network.target\n\n&#91;Service]\nType=forking\nUser={{config.run_user.name}}\nGroup={{config.run_user.group}}\nExecStart={{mongo.install_dir}}\/{{mongo.uncompress_folder_name}}\/bin\/mongod -f {{mongo.config_dir}}\/mongodb.conf --fork\nExecStop={{mongo.install_dir}}\/{{mongo.uncompress_folder_name}}\/bin\/mongod -f {{mongo.config_dir}}\/mongodb.conf --shutdown\n\n\n# Other directives omitted\n# (file size)\nLimitFSIZE=infinity\n# (cpu time)\nLimitCPU=infinity\n# (virtual memory size)\nLimitAS=infinity\n# (locked-in-memory size)\nLimitMEMLOCK=infinity\n# (open files)\nLimitNOFILE=64000\n# (processes\/threads)\nLimitNPROC=64000\n\n&#91;Install]\nWantedBy=multi-user.target\nEOF<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u6570\u636e\u5e93\u521d\u59cb\u5316\u811a\u672c\u6587\u4ef6<\/h4>\n\n\n\n<h5 class=\"wp-block-heading\">\u7ba1\u7406\u5458\u7528\u6237<\/h5>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/roles\/mongo\/templates\/mongo-init-admin-user.js &lt;&lt; \\EOF\ndb.dropUser('{{init.admin_user.username}}')\ndb.createUser( {user: \"{{init.admin_user.username}}\",pwd: \"{{init.admin_user.password}}\",roles: &#91; { role: \"userAdminAnyDatabase\", db: \"{{init.admin_user.db}}\" } ]})\ndb.auth(\"{{init.admin_user.username}}\",\"{{init.admin_user.password}}\");\nEOF<\/code><\/pre>\n\n\n\n<h5 class=\"wp-block-heading\">\u666e\u901a\u7528\u6237<\/h5>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/roles\/mongo\/templates\/mongo-init-normal-user.js &lt;&lt; \\EOF\n{% if init.normal_user.collection is defined and  (init.normal_user.collection | type_debug == 'list') and (init.normal_user.collection | count &gt; 0) %}\n{% for c in init.normal_user.collection -%}\ndb.createCollection(\"{{c}}\");\n{% endfor -%}\n{% endif %}\n\/\/ \u521b\u5efa\u4e0d\u540cdatabase\u5230\u7528\u6237\uff0c\u7cfb\u7edf\u901a\u8fc7\u521b\u5efa\u7684\u8d26\u53f7\u8bbf\u95ee\ndb.dropUser('{{init.normal_user.username}}')\ndb.createUser( {user: \"{{init.normal_user.username}}\",pwd: \"{{init.normal_user.password}}\",roles: &#91;{ role: \"readWrite\", db: \"{{init.normal_user.db}}\" }]});\nEOF<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u96c6\u7fa4\u53c2\u6570\u521d\u59cb\u5316\u6587\u4ef6<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/roles\/mongo\/templates\/init-mongo-cluster-params.js &lt;&lt; \\EOF\ncfg=\n{% if hostnames is defined and  (hostnames | type_debug == 'list') and (hostnames | count &gt; 0) %}\n{ \n \"_id\": \"{{mongo.cluster_name}}\"\n,\"members\": &#91;\n{% for h in hostnames -%}\n   {\"_id\": {{h.mongo._id}}, \"host\": \"{{h.mongo.host}}\", \"priority\": {{h.mongo.priority}}, \"arbiterOnly\": {{h.mongo.arbiterOnly | lower}} }{% if not loop.last %},\n   {% endif %}\n{% endfor -%}\n]\n};\n{% endif %}\nrs.initiate(cfg);\nEOF<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u5b89\u88c5\u4efb\u52a1<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u521b\u5efa\u53d8\u91cf\u9ed8\u8ba4\u503c\u521d\u59cb\u5316\u4efb\u52a1<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt;  \/etc\/ansible\/roles\/mongo\/tasks\/default-var-init.yaml &lt;&lt; \\EOF\n - name: \u521d\u59cb\u5316 mongo \u4ece\u8282\u70b9\u662f\u5426\u53ef\u8bfb\u53d6\u6570\u636e\n   set_fact:\n    mongo: \"{{ mongo | combine({'secondary_ok': true }) }}\"\n   when: mongo.secondary_ok is undefined or mongo.secondary_ok == None or not mongo.secondary_ok\n - name: \u521d\u59cb\u5316 mongo \u662f\u5426\u9700\u8981\u6388\u6743 \u914d\u7f6e\uff0c\u9ed8\u8ba4-false\n   set_fact:\n    mongo: \"{{ mongo | combine({'auth': false }) }}\"\n   when: mongo.auth is undefined or mongo.auth == None or not mongo.auth\n - name: \u521d\u59cb\u5316 mongo \u96c6\u7fa4\u540d\u79f0\n   set_fact:\n    mongo: \"{{ mongo | combine({'cluster_name': 'mongo_cluster'}) }}\"\n   when: mongo.cluster_name is undefined or mongo.cluster_name == None or not mongo.cluster_name\n - name: \u521d\u59cb\u5316 mongo \u914d\u7f6e\u6587\u4ef6\u76ee\u5f55\uff0c\u9ed8\u8ba4\u5728\u5b89\u88c5\u76ee\u5f55\u4e0b\u7684 etc \u76ee\u5f55\u4e2d\n   set_fact:\n    mongo: \"{{ mongo | combine({'config_dir': mongo.install_dir + '\/' + mongo.uncompress_folder_name + '\/etc'}) }}\"\n   when: mongo.config_path is undefined or mongo.config_path == None or mongo.config_path | length == 0\n - name: \u521d\u59cb\u5316 mongo \u6570\u636e\u5b58\u50a8\u76ee\u5f55\uff0c\u9ed8\u8ba4\u5728\u5b89\u88c5\u76ee\u5f55\u4e0b\u7684 data \u76ee\u5f55\u4e2d\n   set_fact:\n    mongo: \"{{ mongo | combine({'db_path': mongo.install_dir + '\/' + mongo.uncompress_folder_name + '\/data'}) }}\"\n   when: mongo.db_path is undefined or mongo.db_path == None or mongo.db_path | length == 0\n - name: \u521d\u59cb\u5316 mongo \u65e5\u5fd7\u5b58\u50a8\u6587\u4ef6\u8def\u5f84\uff0c\u9ed8\u8ba4\u5728\u5b89\u88c5\u76ee\u5f55\u4e0b\u7684 mongodb.log\u6587\u4ef6\n   set_fact:\n    mongo: \"{{ mongo | combine({'log_path': mongo.install_dir + '\/' + mongo.uncompress_folder_name + '\/mongodb.log'}) }}\"\n   when: mongo.log_path is undefined or mongo.log_path == None or mongo.log_path | length == 0\n - name: \u521d\u59cb\u5316 mongo \u8fdb\u7a0b\u6587\u4ef6\u8def\u5f84\uff0c\u9ed8\u8ba4\u5728\u5b89\u88c5\u76ee\u5f55\u4e0b\uff0c\u6587\u4ef6\u540d\u4e3a mongodb.pid\n   set_fact:\n    mongo: \"{{ mongo | combine({'pid_file_path': mongo.install_dir + '\/' + mongo.uncompress_folder_name + '\/mongodb.pid'}) }}\"\n   when: mongo.pid_file_path is undefined or mongo.pid_file_path == None or mongo.pid_file_path | length == 0\n - name: \u5b9e\u4f8b\u5316 hostnames \u9ed8\u8ba4\u5c5e\u6027\n   set_fact:\n     temp_hostnames: &gt;-\n       {{\n         temp_hostnames | default(&#91;]) +\n         &#91;\n           item | combine(\n             {\n             \"mongo\":{\n              \"port\": \"7004\" if (item.mongo.port is undefined or item.mongo.port == None or not item.mongo.port) else item.mongo.port | string\n              ,\"priority\": ansible_loop.revindex if (item.mongo.priority is undefined or item.mongo.priority == None or not item.mongo.priority) else item.mongo.priority\n              ,\"_id\": ansible_loop.index0\n              ,\"host\": item.ip + ':' + (\"7004\" if (item.mongo.port is undefined or item.mongo.port == None or not item.mongo.port) else item.mongo.port | string)\n              ,\"arbiterOnly\": false  | lower | bool if (item.mongo.arbiterOnly is undefined or item.mongo.arbiterOnly == None) else item.mongo.arbiterOnly \n              ,\"arbiterOnly\": true if ((item.mongo.arbiterOnly is undefined or item.mongo.arbiterOnly == None) and ansible_loop.last) else false | lower | bool if (item.mongo.arbiterOnly is undefined or item.mongo.arbiterOnly == None) else item.mongo.arbiterOnly \n              ,\"is_init_cluster_host\": ansible_loop.first \n              }\n             }\n           ,recursive=True)\n         ]\n       }}\n   loop: \"{{ hostnames }}\"\n   loop_control:\n    extended: true\n   vars:\n     temp_hostnames: &#91;]\n - name: \u91cd\u65b0\u7ed9hostnames\u5c5e\u6027\u8d4b\u503c\n   set_fact:\n    hostnames: \"{{temp_hostnames}}\"\n - name: mongo \u5b89\u88c5\u540e\u662f\u5426\u7acb\u8fd0\u884c\u914d\u7f6e\n   set_fact:\n    config: \"{{ config | combine({'run_after_install': true },recursive=True) }}\"\n   when: config.run_after_install is undefined or config.run_after_install == None or not config.run_after_install\n - name: mongo \u662f\u5426\u5f00\u673a\u81ea\u542f\n   set_fact:\n    config: \"{{ config | combine({'start_follow_server': true },recursive=True) }}\"\n   when: config.start_follow_server is undefined or config.start_follow_server == None or not config.start_follow_server\n - name: mongo \u5b89\u88c5\u540e\u8fd0\u884c\u65f6\u4f7f\u7528\u7684\u7528\u6237\u914d\u7f6e\n   set_fact:\n    config: \"{{ config | combine({'run_user': {'name': 'root'}},recursive=True) }}\"\n   when: config.run_user.name is undefined or config.run_user.name == None or mongo.install_from.local | length == 0\n - name: mongo \u5b89\u88c5\u540e\u8fd0\u884c\u65f6\u4f7f\u7528\u7684\u7528\u6237\u7ec4\u914d\u7f6e\n   set_fact:\n    config: \"{{ config | combine({'run_user': {'group': 'root'}},recursive=True) }}\"\n   when: config.run_user.group is undefined or config.run_user.group == None or mongo.install_from.local | length == 0\nEOF<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u521b\u5efa\u5b89\u88c5\u4efb\u52a1<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt;  \/etc\/ansible\/roles\/mongo\/tasks\/install-mongo.yaml &lt;&lt; \\EOF\n   - name: \u83b7\u5f97\u5f53\u524d\u4e3b\u673a\u4e0b\u914d\u7f6e\u7684\u6240\u6709\u81ea\u5b9a\u4e49\u53d8\u91cf\n     set_fact:\n      # \u83b7\u53d6\u5f53\u524d\u4e3b\u673a\u81ea\u5b9a\u4e49\u7684\u53d8\u91cf\n      current_host: \"{{hostnames | json_query(query_condition) }}\"\n     vars:\n     # \u67e5\u8be2\u51fa\u7684\u7ed3\u679c\u4e3a\u4e00\u4e2ajson\u6570\u7ec4\uff0c\u53d6\u7b2c\u4e00\u6761\u5373\u53ef\n      query_condition: \"&#91;?hostname=='{{inventory_hostname}}'] | &#91;0]\"\n   # \u5b89\u88c5\u65b9\u5f0f\u6821\u9a8c\n   - fail: \n      msg: \"\u5b89\u88c5 mongo \u65f6\u9700\u8981\u6307\u5b9a\u5b89\u88c5\u65b9\u5f0f\uff0c\u3010mongo.install_from.local\u3011\u4e0d\u80fd\u4e3a\u7a7a\"\n     when: \n      - mongo.install_from.local is undefined or mongo.install_from.local == None or mongo.install_from.local | length == 0\n   - name: \u5224\u65ad mongo \u5b89\u88c5\u5305\u76ee\u5f55\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\u81ea\u52a8\u521b\u5efa\n     file:\n      path: \"{{mongo.install_from.local | dirname}}\"\n      state: directory\n     when: not (mongo.install_from.local is undefined or mongo.install_from.local == None or mongo.install_from.local | length == 0)\n   - name: \u5224\u65ad mongo \u5b89\u88c5\u76ee\u5f55\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\u81ea\u52a8\u521b\u5efa\n     file:\n      path: \"{{mongo.install_dir}}\"\n      state: directory\n     when: not (mongo.install_dir is undefined or mongo.install_dir == None or mongo.install_dir | length == 0)\n   - name: \u590d\u5236 mongo \u5b89\u88c5\u5305\u5230\u76ee\u6807\u4e3b\u673a\n     copy: \n      src: \"{{mongo.install_from.local}}\"\n      dest: \"{{mongo.install_from.local}}\"\n      backup: yes\n     when: not (mongo.install_from.local is undefined or mongo.install_from.local == None or mongo.install_from.local | length == 0)\n   - name: \u89e3\u538b mongo \u5b89\u88c5\u5305\n     shell:\n      cd {{mongo.install_from.local | dirname }}\n      &amp;&amp; tar -zxvf {{mongo.install_from.local}} -C {{mongo.install_dir}}\n     when: not (mongo.install_from.local is undefined or mongo.install_from.local == None or mongo.install_from.local | length == 0)\n   - name: \u5224\u65ad mongo \u914d\u7f6e\u76ee\u5f55\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\u81ea\u52a8\u521b\u5efa\n     file:\n      path: \"{{mongo.config_dir}}\"\n      state: directory\n     when: not (mongo.config_dir is undefined or mongo.config_dir == None or mongo.config_dir | length == 0)\n   - name: \u5224\u65ad mongo \u6570\u636e\u76ee\u5f55\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\u81ea\u52a8\u521b\u5efa\n     file:\n      path: \"{{mongo.db_path}}\"\n      state: directory\n     when: not (mongo.db_path is undefined or mongo.db_path == None or mongo.db_path | length == 0)\n   - name: \u5224\u65ad mongo \u65e5\u5fd7\u6587\u4ef6\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\u81ea\u52a8\u521b\u5efa\n     file:\n      path: \"{{mongo.log_path}}\"\n      state: touch\n     when: not (mongo.log_path is undefined or mongo.log_path == None or mongo.log_path | length == 0)\n   - name: \u5224\u65ad mongo \u8fdb\u7a0b\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\u81ea\u52a8\u521b\u5efa\n     file:\n      path: \"{{mongo.pid_file_path}}\"\n      state: touch\n     when: not (mongo.pid_file_path is undefined or mongo.pid_file_path == None or mongo.pid_file_path | length == 0)\n   - name: \u4ece mongo \u914d\u7f6e\u6a21\u677f\u751f\u6210\u9ed8\u8ba4\u914d\u7f6e\u5e76\u5c06\u6587\u4ef6\u5230\u76ee\u6807\u4e3b\u673a\n     template: \n      src: \"mongodb.conf\"\n      dest: \"{{mongo.config_dir}}\/mongodb.conf\"\n      backup: yes\n   - name: \u8bbe\u7f6e mongo \u521d\u59cb\u5316\u65f6\u9ed8\u8ba4\u4e0d\u9700\u8981\u6388\u6743\n     replace:\n      path: \"{{mongo.config_dir}}\/mongodb.conf\"\n      regexp: 'auth=false|auth=False'\n      replace: \"auth=false\"\n   - name: \u4ece mongo \u670d\u52a1\u81ea\u542f\u6a21\u677f\u751f\u6210\u9ed8\u8ba4\u914d\u7f6e\u5e76\u5c06\u6587\u4ef6\u5230\u76ee\u6807\u4e3b\u673a\n     template: \n      src: \"mongo.service\"\n      dest: \"\/etc\/systemd\/system\/mongo.service\"\n      backup: yes\n   - name: \u914d\u7f6e\u662f\u5426\u5f00\u673a\u81ea\u542f\n     shell: systemctl enable mongo.service\n     when: config.start_follow_server\n   - name: \u91cd\u8f7d\u73af\u5883\u53d8\u91cf\n     shell: systemctl daemon-reload\n   - name: \u542f\u52a8 mongo\n     service: \n      name: mongo\n      state: started\n     when: config.run_after_install\n   - name: \u4ece mongo \u6570\u636e\u5e93\u5b9e\u4f8b\u5316\u3010\u96c6\u7fa4\u521d\u59cb\u5316\u53c2\u6570\u3011\u6a21\u677f\u751f\u6210\u9ed8\u8ba4\u914d\u7f6e\u5e76\u5c06\u6587\u4ef6\u5230\u76ee\u6807\u4e3b\u673a\n     template:\n      src: \"init-mongo-cluster-params.js\"\n      dest: \"{{mongo.install_dir}}\/{{mongo.uncompress_folder_name}}\/init-mongo-cluster-params.js\"\n     when:\n      - current_host.mongo.is_init_cluster_host\n      - mongo.install_type == 'cluster'\n   - name: \u521d\u59cb\u5316\u96c6\u7fa4\n     shell: |\n       {{mongo.install_dir}}\/{{mongo.uncompress_folder_name}}\/bin\/mongo {{current_host.ip}}:{{current_host.mongo.port}} {{mongo.install_dir}}\/{{mongo.uncompress_folder_name}}\/init-mongo-cluster-params.js\n     when:\n      - current_host.mongo.is_init_cluster_host\n      - mongo.install_type == 'cluster'\n    # \u5bfc\u5165\u6570\u636e\u5e93\u521d\u59cb\u5316\u4efb\u52a1\n   - import_tasks: mongo-init.yaml\n   - name: \u96c6\u7fa4\u73af\u5883\u4e0b \u751f\u6210 keyfile\n     shell: |\n       openssl rand -base64 756 &gt; {{mongo.install_dir}}\/{{mongo.uncompress_folder_name}}\/keyfile\n       chmod 600 {{mongo.install_dir}}\/{{mongo.uncompress_folder_name}}\/keyfile\n     when:\n      - current_host.mongo.is_init_cluster_host\n      - mongo.install_type == 'cluster'\n   - name: \u590d\u5236 keyfile \u5230 \u76ee\u6807\u4e3b\u673a \n     copy: \n      src: \"{{mongo.install_dir}}\/{{mongo.uncompress_folder_name}}\/keyfile\"\n      dest: \"{{mongo.install_dir}}\/{{mongo.uncompress_folder_name}}\/keyfile\"\n      mode: '600'\n      backup: yes\n     when: mongo.install_type == 'cluster'\n   - name: mongo \u914d\u7f6e\u6587\u4ef6\u65b0\u589e  \u96c6\u7fa4\u540d\u79f0 \u8bf4\u660e\n     lineinfile:\n      path: \"{{mongo.config_dir}}\/mongodb.conf\"\n      line: \"# \u96c6\u7fa4\u540d\u79f0\"\n      state: present\n      insertafter: EOF\n     when: mongo.install_type == 'cluster'\n   - name: mongo \u914d\u7f6e\u6587\u4ef6\u65b0\u589e  \u96c6\u7fa4\u540d\u79f0\n     lineinfile:\n      path: \"{{mongo.config_dir}}\/mongodb.conf\"\n      line: \"replSet={{mongo.cluster_name}}\"\n      state: present\n      insertafter: EOF\n     when:\n      - mongo.install_type == 'cluster'\n   - name: mongo \u914d\u7f6e\u6587\u4ef6\u65b0\u589e  \u914d\u7f6e\u8bf4\u660e\n     lineinfile:\n      path: \"{{mongo.config_dir}}\/mongodb.conf\"\n      line: \"# \u96c6\u7fa4\u65e5\u5fd7\u53cakeyfile\u914d\u7f6e\"\n      state: present\n      insertafter: EOF\n     when: mongo.install_type == 'cluster'\n   - name: mongo \u914d\u7f6e\u6587\u4ef6\u65b0\u589e \u96c6\u7fa4\u65e5\u5fd7\u5927\u5c0f \u914d\u7f6e\n     lineinfile:\n      path: \"{{mongo.config_dir}}\/mongodb.conf\"\n      line: \"oplogSize=100\"\n      state: present\n      insertafter: EOF\n     when: mongo.install_type == 'cluster'\n   - name: mongo \u914d\u7f6e\u6587\u4ef6\u65b0\u589e keyfile \u914d\u7f6e\n     lineinfile:\n      path: \"{{mongo.config_dir}}\/mongodb.conf\"\n      line: \"keyFile={{mongo.install_dir}}\/{{mongo.uncompress_folder_name}}\/keyfile\"\n      state: present\n      insertafter: EOF\n     when: mongo.install_type == 'cluster'\n   - name: \u4fee\u6539 mongo \u914d\u7f6e\uff0c\u9700\u8981\u6388\u6743\u624d\u80fd\u64cd\u4f5c\n     replace:\n      path: \"{{mongo.config_dir}}\/mongodb.conf\"\n      regexp: 'auth=false'\n      replace: \"auth=true\"\n   - name: \u91cd\u542f mongo\n     service: \n      name: mongo\n      state: restarted\n     when: mongo.install_type == 'cluster'\nEOF<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u521b\u5efa\u6570\u636e\u5e93\u5b9e\u4f8b\u5316\u4efb\u52a1<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt;  \/etc\/ansible\/roles\/mongo\/tasks\/mongo-init.yaml &lt;&lt; \\EOF\n - name: mongo \u6570\u636e\u5e93\u5b9e\u4f8b\u5316\u7ba1\u7406\u5458\u8d26\u6237\uff0c\u9ed8\u8ba4-zhoujibin_root\n   set_fact:\n    init: \"{{ init | combine({'admin_user': {'username': 'zhoujibin_root'}},recursive=True) }}\"\n   when:\n    - current_host.mongo.is_init_cluster_host\n    - init.admin_user.username is undefined or init.admin_user.username == None or init.admin_user.username | length == 0\n - name: mongo \u6570\u636e\u5e93\u5b9e\u4f8b\u5316\u7ba1\u7406\u5458\u8d26\u6237\u5bc6\u7801\uff0c123456\n   set_fact:\n    init: \"{{ init | combine({'admin_user': {'password': '123456'}},recursive=True) }}\"\n   when:\n    - current_host.mongo.is_init_cluster_host\n    - init.admin_user.password is undefined or init.admin_user.password == None or init.admin_user.password | length == 0\n - name: mongo \u6570\u636e\u5e93\u5b9e\u4f8b\u5316\u7ba1\u7406\u5458\u53ef\u8bbf\u95ee\u7684\u6570\u636e\u5e93\uff0c\u9ed8\u8ba4-admin\n   set_fact:\n    init: \"{{ init | combine({'admin_user': {'db': 'admin'}},recursive=True) }}\"\n   when:\n    - current_host.mongo.is_init_cluster_host\n    - init.admin_user.db is undefined or init.admin_user.db == None or init.admin_user.db | length == 0\n - name: mongo \u6570\u636e\u5e93\u5b9e\u4f8b\u5316\u666e\u901a\u7528\u6237\uff0c\u8d26\u6237-zhoujibin\n   set_fact:\n    init: \"{{ init | combine({'normal_user': {'username': 'zhoujibin'}},recursive=True) }}\"\n   when:\n    - current_host.mongo.is_init_cluster_host\n    - init.normal_user.username is undefined or init.normal_user.username == None or init.normal_user.username | length == 0\n - name: mongo \u6570\u636e\u5e93\u5b9e\u4f8b\u5316\u666e\u901a\u7528\u6237\u5bc6\u7801\uff0c\u9ed8\u8ba4-123456\n   set_fact:\n    init: \"{{ init | combine({'normal_user': {'password': '123456'}},recursive=True) }}\"\n   when:\n    - current_host.mongo.is_init_cluster_host\n    - init.normal_user.password is undefined or init.normal_user.password == None or init.normal_user.password | length == 0\n - name: \u6b63\u5728\u5e94\u7528\u96c6\u7fa4\u914d\u7f6e\uff0c\u9884\u8ba1\u9700\u898110s\uff0c\u8bf7\u7a0d\u540e\u3002\u3002\u3002\n   pause:\n    seconds: 10\n - name: mongo \u6570\u636e\u5e93\u5b9e\u4f8b\u5316\u666e\u901a\u7528\u6237\u53ef\u8bbf\u95ee\u7684\u6570\u636e\u5e93\uff0c\u9ed8\u8ba4-test\n   set_fact:\n    init: \"{{ init | combine({'normal_user': {'db': 'test'}},recursive=True) }}\"\n   when:\n    - current_host.mongo.is_init_cluster_host\n    - init.normal_user.db is undefined or init.normal_user.db == None or init.normal_user.db | length == 0\n - name: \u4ece mongo \u6570\u636e\u5e93\u5b9e\u4f8b\u5316\u7ba1\u7406\u5458\u7528\u6237\u6570\u636e\u6a21\u677f\u751f\u6210\u9ed8\u8ba4\u914d\u7f6e\u5e76\u5c06\u6587\u4ef6\u5230\u76ee\u6807\u4e3b\u673a\n   template:\n    src: \"mongo-init-admin-user.js\"\n    dest: \"{{mongo.install_dir}}\/{{mongo.uncompress_folder_name}}\/mongo-init-admin-user.js\"\n   when: \n    - current_host.mongo.is_init_cluster_host\n - name: \u6267\u884c mongo \u6570\u636e\u5e93 \u521d\u59cb\u5316\u811a\u672c\n   shell: \"{{mongo.install_dir}}\/{{mongo.uncompress_folder_name}}\/bin\/mongo {{current_host.ip}}:{{current_host.mongo.port}}\/{{init.admin_user.db}} {{mongo.install_dir}}\/{{mongo.uncompress_folder_name}}\/mongo-init-admin-user.js\"\n   when: \n    - current_host.mongo.is_init_cluster_host\n - name: \u4ece mongo \u6570\u636e\u5e93\u5b9e\u4f8b\u5316\u3010\u7ba1\u7406\u5458\u7528\u6237\u6570\u636e\u3011\u6a21\u677f\u751f\u6210\u9ed8\u8ba4\u914d\u7f6e\u5e76\u5c06\u6587\u4ef6\u5230\u76ee\u6807\u4e3b\u673a\n   template:\n    src: \"mongo-init-normal-user.js\"\n    dest: \"{{mongo.install_dir}}\/{{mongo.uncompress_folder_name}}\/mongo-init-normal-user.js\"\n   when: \n    - current_host.mongo.is_init_cluster_host\n - name: \u4ece mongo \u6570\u636e\u5e93\u5b9e\u4f8b\u5316\u3010\u666e\u901a\u7528\u6237\u6570\u636e\u3011\u6a21\u677f\u751f\u6210\u9ed8\u8ba4\u914d\u7f6e\u5e76\u5c06\u6587\u4ef6\u5230\u76ee\u6807\u4e3b\u673a\n   shell: \"{{mongo.install_dir}}\/{{mongo.uncompress_folder_name}}\/bin\/mongo {{current_host.ip}}:{{current_host.mongo.port}}\/{{init.normal_user.db}} {{mongo.install_dir}}\/{{mongo.uncompress_folder_name}}\/mongo-init-normal-user.js\"\n   when:\n    - current_host.mongo.is_init_cluster_host\nEOF<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u6c47\u603b\u5b89\u88c5\u4efb\u52a1<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/roles\/mongo\/tasks\/main.yaml &lt;&lt; \\EOF\n   # \u9ed8\u8ba4\u53d8\u91cf\u5904\u7406\u4efb\u52a1\n   - import_tasks: default-var-init.yaml\n   # mongo\u5b89\u88c5\u4efb\u52a1\n   - import_tasks: install-mongo.yaml\nEOF<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u6267\u884c\u6587\u4ef6<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/install-mongo.yaml &lt;&lt; \\EOF\n---\n- hosts: mongo\n  roles:\n   - mongo\nEOF<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u6267\u884c\u811a\u672c<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>ansible-playbook \/etc\/ansible\/install-mongo.yaml<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u6d4b\u8bd5\u811a\u672c<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\uff01\uff01\uff01\u5220\u9664mongo\uff08\u4ec5\u5728\u6d4b\u8bd5\u65f6\u4f7f\u7528\uff09<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>service mongo stop &amp;&amp; rm -rf \/home\/zhoujibin\/mongodb-linux-4.4.4<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">mongo\u96c6\u7fa4\u6d4b\u8bd5<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># \u4e3b\u8282\u70b9\u4e0a\u6d4b\u8bd5\u5199\n\/home\/zhoujibin\/mongodb-linux-4.4.4\/bin\/mongo 192.168.13.247:7004\ndb.auth('zhoujibin','123456');\nuse test;\ndb.createCollection(\"col1\");\nshow collections\ndb.col1.insertOne({\n\"id\":1,\n\"name\":\"test\"\n})\n# \u4ece\u8282\u70b9\u4e0a\u6d4b\u8bd5\u6570\u636e\u8bfb\u53d6\n\/home\/zhoujibin\/mongodb-linux-4.4.4\/bin\/mongo 192.168.13.16:7004\ndb.auth('zhoujibin','123456');\nuse test;\n# \u6267\u884c\u6b64\u547d\u4ee4\u5141\u8bb8\u4ece\u8282\u70b9\u8bfb\u53d6\u6570\u636e\nrs.secondaryOk()\ndb.col1.find()<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u53d6\u6d88\u5f00\u673a\u81ea\u542f<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>systemctl disable mongo<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u53c2\u8003\u94fe\u63a5<\/h3>\n\n\n\n<p><a href=\"https:\/\/blog.csdn.net\/qq_38403590\/article\/details\/116449980\">mongo\u96c6\u7fa4\u642d\u5efa<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u5b89\u88c5redis<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u8d44\u6e90\u6e05\u5355<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt;&gt; \/etc\/ansible\/hosts &lt;&lt; \\EOF\n# \u6307\u5b9a\u5206\u7ec4\u540d\u79f0\uff0c\u5982\uff1aredis\uff0c\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u8c03\u6574<\/code><\/pre>\n\n\n<p>[redis]<\/p>\n\n\n\n<p>k8s-master ansible_ssh_host=192.168.13.247 ansible_ssh_port=22 ansible_ssh_user=root k8s-worker-01 ansible_ssh_host=192.168.13.16 ansible_ssh_port=22 ansible_ssh_user=root k8s-worker-02 ansible_ssh_host=192.168.13.51 ansible_ssh_port=22 ansible_ssh_user=root EOF<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u89d2\u8272\u76ee\u5f55<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir -p \/etc\/ansible\/roles\/redis\ncd \/etc\/ansible\/roles\/redis\/\nmkdir  tasks vars files files\/x86_64 files\/aarch64 templates<\/code><\/pre>\n\n\n\n<p>\u6e90\u7801\u4e0b\u8f7d\u5730\u5740\uff1a http:\/\/download.redis.io\/releases\/redis-5.0.7.tar.gz<\/p>\n\n\n\n<p>\u6ce8\u610f\uff1a\u82e5\u4f7f\u7528\u81ea\u5b9a\u4e49\u7684\u5b89\u88c5\u5305\uff0c\u8bf7\u4fdd\u8bc1\u52a0\u538b\u540e\u7684\u6587\u4ef6\u5939\u5728\u4e0d\u540c\u7684\u7cfb\u7edf\u67b6\u6784\u4e0b\u662f\u4e00\u6837\u7684\u540d\u79f0<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u53d8\u91cf<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/roles\/redis\/vars\/main.yaml &lt;&lt; \\EOF\n # \u96c6\u7fa4\u5b89\u88c5\u65f6\u9700\u8981\u914d\u7f6e\u591a\u53f0\u673a\u5668\nhostnames:\n - ip: 192.168.13.247\n   hostname: k8s-master\n   redis:\n    # \u7aef\u53e3\uff0c\u9ed8\u8ba47011\n    port:\n    # \u5bc6\u7801\uff0c\u9ed8\u8ba4Redis@123456\n    password:\n    # \u662f\u5426\u662f\u4e3b\u8282\u70b9\uff0c\u672a\u6307\u5b9a\u65f6\u9ed8\u8ba4\u53d6hostnames\u4e2d\u7b2c\u4e00\u53f0\u673a\u5668\u4f5c\u4e3a\u4e3b\u8282\u70b9\uff0c\u6709\u591a\u4e2a\u662f\u53d6\u6ee1\u8db3\u6761\u4ef6\u7684\u7b2c\u4e00\u4e2a\u4e3b\u673a\n    is_master: \n   sentinel:\n    # \u7aef\u53e3\uff0c\u9ed8\u8ba4-27011\n    port:\n - ip: 192.168.13.16\n   hostname: k8s-worker-01\n   redis:\n    # \u7aef\u53e3\uff0c\u9ed8\u8ba47011\n    port:\n    # \u5bc6\u7801\uff0c\u9ed8\u8ba4Redis@123456\n    password:\n   sentinel:\n    # \u7aef\u53e3\uff0c\u9ed8\u8ba4-27011\n    port:\n - ip: 192.168.13.51\n   hostname: k8s-worker-02\n   redis:\n    # \u7aef\u53e3\uff0c\u9ed8\u8ba47011\n    port:\n    # \u5bc6\u7801\uff0c\u9ed8\u8ba4Redis@123456\n    password:\n   sentinel:\n    # \u7aef\u53e3\uff0c\u9ed8\u8ba4-27011\n    port:\nredis:\n # \u5b89\u88c5\u7c7b\u578b\uff1a\u5355\u673a-standalone\uff08\u9ed8\u8ba4\uff09\uff0c\u96c6\u7fa4-cluster\n install_type: cluster\n install_from:\n  # \u4ece\u672c\u5730\u5b89\u88c5\uff0cansible_facts.architecture\u53d8\u91cf\u793a\u4f8b\uff1ax86_64\u3001aarch64\n  local: \"\/etc\/ansible\/roles\/redis\/files\/{{ansible_facts.architecture}}\/redis-5.0.7.tar.gz\"\n # redis \u5b89\u88c5\u76ee\u5f55\n install_dir: \/home\/zhoujibin\n # redis \u538b\u7f29\u5305\u89e3\u538b\u540e\u7684\u6587\u4ef6\u5939\u540d\u79f0\uff0c\u4e00\u822c\u548c\u538b\u7f29\u5305\u540d\u79f0\u4e00\u81f4\n uncompress_folder_name: redis-5.0.7\n # \u6570\u636e\u76ee\u5f55\uff0c\u9ed8\u8ba4\u4e3a\u5b89\u88c5\u76ee\u5f55\u4e0b\u7684 data \u76ee\u5f55\n data_dir:\n # \u8fdb\u7a0b\u6587\u4ef6\u8def\u5f84\uff0c\u9ed8\u8ba4\u653e\u5728\u5b89\u88c5\u76ee\u5f55\u4e0b\u7684 pid \u76ee\u5f55\u4e0b\uff0c\u6587\u4ef6\u540d\u683c\u5f0f\uff1aredis-{{port}}.pid\n pid_file:\n # \u65e5\u5fd7\u6587\u4ef6\uff0c\u9ed8\u8ba4\u653e\u5728\u5b89\u88c5\u76ee\u5f55\u4e0b\u7684 logs \u76ee\u5f55\u4e0b\uff0c\u6587\u4ef6\u540d\u683c\u5f0f\uff1aredis-{{port}}.log\n log_file:\n # \u914d\u7f6e\u6587\u4ef6\u76ee\u5f55\u8def\u5f84\uff0c\u9ed8\u8ba4\u653e\u5728\u5b89\u88c5\u76ee\u5f55\u4e0b\u7684 conf \u76ee\u5f55\u4e0b\uff0c\u6587\u4ef6\u540d\u683c\u5f0f\uff1aredis-{{port}}.conf\n config_dir:\n # \u8bbe\u7f6e\u540c\u4e00\u65f6\u95f4\u6700\u5927\u5ba2\u6237\u8fde\u63a5\u6570\uff0c\u9ed8\u8ba4\u65e0\u9650\u5236\u3002redis\u53ef\u4ee5\u540c\u65f6\u8fde\u63a5\u7684\u5ba2\u6237\u7aef\u6570\u4e3aredis\u7a0b\u5e8f\u53ef\u4ee5\u6253\u5f00\u7684\u6700\u5927\u6587\u4ef6\u63cf\u8ff0\u7b26,\u5f53\u5ba2\u6237\u7aef\u8fde\u63a5\u6570\u5230\u8fbe\u9650\u5236\u65f6\uff0cRedis\u4f1a\u5173\u95ed\u65b0\u7684\u8fde\u63a5\u5e76\u5411\u5ba2\u6237\u7aef\u8fd4\u56de max number of clients reached \u9519\u8bef\u4fe1\u606f,\u9ed8\u8ba4-10000 \n max_clients:\n # \u6700\u5927\u5185\u5b58\uff0c\u9ed8\u8ba4\u4e3a0\uff0c\u8868\u793a\u4e0d\u505a\u9650\u5236\uff0c\u5408\u6cd5\u7684\u683c\u5f0f\uff1a1048576\uff08\u4e0d\u5199\u5355\u4f4d\u6807\u8bc6\u5b57\u8282\uff09\u30011048576B\u30011000KB\u3001100MB\u30011GB\u30011000K\u3001100M\u30011G\uff0864\u4f4d\u7cfb\u7edf\u4e0d\u9650\u5236\u5185\u5b58\uff0c32\u4f4d\u7cfb\u7edf\u6700\u591a\u4f7f\u75283GB\u5185\u5b58\uff09\n max_memory: \n # \u6307\u5b9a\u66f4\u65b0\u65e5\u5fd7\u7684\u6761\u4ef6\uff0c\u6709\u4e09\u4e2a\u53ef\u9009\u53c2\u6570 - no\uff1a\u8868\u793a\u7b49\u64cd\u4f5c\u7cfb\u7edf\u8fdb\u884c\u6570\u636e\u7f13\u5b58\u540c\u6b65\u5230\u78c1\u76d8(\u5feb)\uff0calways\uff1a\u8868\u793a\u6bcf\u6b21\u66f4\u65b0\u64cd\u4f5c\u540e\u624b\u52a8\u8c03\u7528fsync()\u5c06\u6570\u636e\u5199\u5230\u78c1\u76d8(\u6162\uff0c\u5b89\u5168)\uff0c everysec\uff1a\u8868\u793a\u6bcf\u79d2\u540c\u6b65\u4e00\u6b21(\u6298\u8877\uff0c\u9ed8\u8ba4\u503c)\uff1b\n appendfsync:\n # \u6dd8\u6c70\u7b56\u7565\uff1a\n # noeviction(\u9ed8\u8ba4\u7b56\u7565)\uff1a\u5bf9\u4e8e\u5199\u8bf7\u6c42\u4e0d\u518d\u63d0\u4f9b\u670d\u52a1\uff0c\u76f4\u63a5\u8fd4\u56de\u9519\u8bef\uff08DEL\u8bf7\u6c42\u548c\u90e8\u5206\u7279\u6b8a\u8bf7\u6c42\u9664\u5916\uff09\n # allkeys-lru\uff1a\u4ece\u6240\u6709key\u4e2d\u4f7f\u7528LRU\u7b97\u6cd5\u8fdb\u884c\u6dd8\u6c70\uff08LRU\u7b97\u6cd5\uff1a\u5373\u6700\u8fd1\u6700\u5c11\u4f7f\u7528\u7b97\u6cd5\uff09\n # volatile-lru\uff1a\u4ece\u8bbe\u7f6e\u4e86\u8fc7\u671f\u65f6\u95f4\u7684key\u4e2d\u4f7f\u7528LRU\u7b97\u6cd5\u8fdb\u884c\u6dd8\u6c70\n # allkeys-random\uff1a\u4ece\u6240\u6709key\u4e2d\u968f\u673a\u6dd8\u6c70\u6570\u636e\n # volatile-random\uff1a\u4ece\u8bbe\u7f6e\u4e86\u8fc7\u671f\u65f6\u95f4\u7684key\u4e2d\u968f\u673a\u6dd8\u6c70\n # volatile-ttl\uff1a\u5728\u8bbe\u7f6e\u4e86\u8fc7\u671f\u65f6\u95f4\u7684key\u4e2d\uff0c\u6dd8\u6c70\u8fc7\u671f\u65f6\u95f4\u5269\u4f59\u6700\u77ed\u7684\n # \u5f53\u4f7f\u7528volatile-lru\u3001volatile-random\u3001volatile-ttl\u8fd9\u4e09\u79cd\u7b56\u7565\u65f6\uff0c\u5982\u679c\u6ca1\u6709key\u53ef\u4ee5\u88ab\u6dd8\u6c70\uff0c\u5219\u548cnoeviction\u4e00\u6837\u8fd4\u56de\u9519\u8bef\n max_memory_policy:\n # \u662f\u5426\u5f00\u542f\u4fdd\u62a4\u6a21\u5f0f\uff0c\u5f00\u542f\u540e\u5916\u90e8\u53ef\u4ee5\u8bbf\u95ee\uff0c\u9ed8\u8ba4-no\uff0c\u5173\u95ed\n protected_mode:\n # \u96c6\u7fa4\u4e2d\u4e3b\u8282\u70b9\u540d\u79f0\uff0c\u9ed8\u8ba4\uff1aredis_master\n master_name:\n# \u54e8\u5175\u6a21\u5f0f\u76f8\u5173\u914d\u7f6e\nsentinel:\n # \u5de5\u4f5c\u76ee\u5f55\uff0c\u9ed8\u8ba4\u653e\u5728\u5b89\u88c5\u76ee\u5f55\u4e0b\u7684 sentinel \u76ee\u5f55\u4e0b\n dir:\n # \u65e5\u5fd7\u6587\u4ef6\uff0c\u9ed8\u8ba4\u653e\u5728\u5b89\u88c5\u76ee\u5f55\u4e0b\u7684 sentinel \u76ee\u5f55\u4e0b\uff0c\u6587\u4ef6\u540d\u79f0\uff1asentinel.log\n log_file:\n # \u6307\u5b9a\u4e3b\u8282\u70b9\u5e94\u7b54\u54e8\u5175sentinel\u7684\u6700\u5927\u65f6\u95f4\u95f4\u9694\uff0c\u8d85\u8fc7\u8fd9\u4e2a\u65f6\u95f4\uff0c\u54e8\u5175\u4e3b\u89c2\u4e0a\u8ba4\u4e3a\u4e3b\u8282\u70b9\u4e0b\u7ebf\uff0c\u9ed8\u8ba430\u79d2 \uff0c\u5355\u4f4d\uff1a\u6beb\u79d2\n down_after_milliseconds:\n # \u6307\u5b9a\u4e86\u5728\u53d1\u751ffailover\u4e3b\u5907\u5207\u6362\u65f6\uff0c\u6700\u591a\u53ef\u4ee5\u6709\u591a\u5c11\u4e2aslave\u540c\u65f6\u5bf9\u65b0\u7684master\u8fdb\u884c\u540c\u6b65\u3002\u8fd9\u4e2a\u6570\u5b57\u8d8a\u5c0f\uff0c\u5b8c\u6210failover\u6240\u9700\u7684\u65f6\u95f4\u5c31\u8d8a\u957f\uff1b\u53cd\u4e4b\uff0c\u4f46\u662f\u5982\u679c\u8fd9\u4e2a\u6570\u5b57\u8d8a\u5927\uff0c\u5c31\u610f\u5473\u7740\u8d8a\u591a\u7684slave\u56e0\u4e3areplication\u800c\u4e0d\u53ef\u7528\u3002\u53ef\u4ee5\u901a\u8fc7\u5c06\u8fd9\u4e2a\u503c\u8bbe\u4e3a1\uff0c\u6765\u4fdd\u8bc1\u6bcf\u6b21\u53ea\u6709\u4e00\u4e2aslave\uff0c\u5904\u4e8e\u4e0d\u80fd\u5904\u7406\u547d\u4ee4\u8bf7\u6c42\u7684\u72b6\u6001\uff0c\u9ed8\u8ba4\u503c-1\n parallel_syncs:\n # \u6545\u969c\u8f6c\u79fb\u7684\u8d85\u65f6\u65f6\u95f4failover-timeout\uff0c\u9ed8\u8ba4\u4e09\u5206\u949f\uff0c\u53ef\u4ee5\u7528\u5728\u4ee5\u4e0b\u8fd9\u4e9b\u65b9\u9762\uff1a\n # 1. \u540c\u4e00\u4e2asentinel\u5bf9\u540c\u4e00\u4e2amaster\u4e24\u6b21failover\u4e4b\u95f4\u7684\u95f4\u9694\u65f6\u95f4\u3002  \n # 2. \u5f53\u4e00\u4e2aslave\u4ece\u4e00\u4e2a\u9519\u8bef\u7684master\u90a3\u91cc\u540c\u6b65\u6570\u636e\u65f6\u5f00\u59cb\uff0c\u76f4\u5230slave\u88ab\u7ea0\u6b63\u4e3a\u4ece\u6b63\u786e\u7684master\u90a3\u91cc\u540c\u6b65\u6570\u636e\u65f6\u7ed3\u675f\u3002  \n # 3. \u5f53\u60f3\u8981\u53d6\u6d88\u4e00\u4e2a\u6b63\u5728\u8fdb\u884c\u7684failover\u65f6\u6240\u9700\u8981\u7684\u65f6\u95f4\u3002\n # 4.\u5f53\u8fdb\u884cfailover\u65f6\uff0c\u914d\u7f6e\u6240\u6709slaves\u6307\u5411\u65b0\u7684master\u6240\u9700\u7684\u6700\u5927\u65f6\u95f4\u3002\u4e0d\u8fc7\uff0c\n # \u5373\u4f7f\u8fc7\u4e86\u8fd9\u4e2a\u8d85\u65f6\uff0cslaves\u4f9d\u7136\u4f1a\u88ab\u6b63\u786e\u914d\u7f6e\u4e3a\u6307\u5411master\uff0c\u4f46\u662f\u5c31\u4e0d\u6309parallel-syncs\u6240\u914d\u7f6e\u7684\u89c4\u5219\u6765\u540c\u6b65\u6570\u636e\u4e86\n failover_timeout:\n # \u5f53sentinel\u6709\u4efb\u4f55\u8b66\u544a\u7ea7\u522b\u7684\u4e8b\u4ef6\u53d1\u751f\u65f6\uff08\u6bd4\u5982\u8bf4redis\u5b9e\u4f8b\u7684\u4e3b\u89c2\u5931\u6548\u548c\u5ba2\u89c2\u5931\u6548\u7b49\u7b49\uff09\uff0c\u5c06\u4f1a\u53bb\u8c03\u7528\u8fd9\u4e2a\u811a\u672c\u3002\u4e00\u4e2a\u811a\u672c\u7684\u6700\u5927\u6267\u884c\u65f6\u95f4\u4e3a60s\uff0c\u5982\u679c\u8d85\u8fc7\u8fd9\u4e2a\u65f6\u95f4\uff0c\u811a\u672c\u5c06\u4f1a\u88ab\u4e00\u4e2aSIGKILL\u4fe1\u53f7\u7ec8\u6b62\uff0c\u4e4b\u540e\u91cd\u65b0\u6267\u884c\u3002\n notification_script:\n # \u901a\u7528\u811a\u672c\uff0c\u53ef\u591a\u6b21\u88ab\u8c03\u7528\n client_reconfig_script:\n# \u7a0b\u5e8f\u5b89\u88c5\u540e\u7684\u76f8\u5173\u53c2\u6570\nconfig:\n # \u5b89\u88c5\u540e\u662f\u5426\u7acb\u5373\u8fd0\u884c\uff0c\u9ed8\u8ba4-true\n run_after_install:\n # \u542f\u52a8\u7a0b\u5e8f\u65f6\u4f7f\u7528\u7684\u7528\u6237\u4fe1\u606f\uff0c\u9ed8\u8ba4-root\n run_user:\n  name:\n  group:\n # \u662f\u5426\u5f00\u673a\u81ea\u542f\uff0c\u9ed8\u8ba4-true\n start_follow_server: \nEOF<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u6a21\u677f\u6587\u4ef6<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">redis\u914d\u7f6e\u6587\u4ef6<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/roles\/redis\/templates\/redis.conf &lt;&lt; \\EOF\n# Redis \u9ed8\u8ba4\u53ea\u5141\u8bb8\u672c\u673a\u8bbf\u95ee\uff0c\u628a bind \u4fee\u6539\u4e3a 0.0.0.0 \u8868\u793a\u5141\u8bb8\u6240\u6709\u8fdc\u7a0b\u8bbf\u95ee\u3002\u5982\u679c\u60f3\u6307\u5b9a\u9650\u5236\u8bbf\u95ee\uff0c\u53ef\u8bbe\u7f6e\u5bf9\u5e94\u7684 ip\u3002\nbind 0.0.0.0\n# \u542f\u52a8AOF\uff08Append Only File\uff09\u6301\u4e45\u5316\u7b56\u7565\nappendonly yes\n{% if not (current_host.redis.password is undefined or current_host.redis.password == None or current_host.redis.password | length == 0) %}\n# \u5bc6\u7801\nrequirepass {{current_host.redis.password}}\n{% endif %}\n# \u8fd0\u884c\u65f6\u7684\u7aef\u53e3\nport {{current_host.redis.port}}\n# \u662f\u5426\u540e\u53f0\u8fd0\u884c\ndaemonize yes\n# \u6570\u636e\u76ee\u5f55\ndir {{redis.data_dir}}\n# \u65e5\u5fd7\u6587\u4ef6\uff0c\u9700\u8981\u786e\u4fdd\u6587\u4ef6\u5b58\u5728\nlogfile {{redis.log_file}}\n# \u8fdb\u7a0b\u6587\u4ef6\npidfile {{redis.pid_file}}\n # \u8bbe\u7f6e\u540c\u4e00\u65f6\u95f4\u6700\u5927\u5ba2\u6237\u8fde\u63a5\u6570\uff0c\u9ed8\u8ba4\u65e0\u9650\u5236\u3002redis\u53ef\u4ee5\u540c\u65f6\u8fde\u63a5\u7684\u5ba2\u6237\u7aef\u6570\u4e3aredis\u7a0b\u5e8f\u53ef\u4ee5\u6253\u5f00\u7684\u6700\u5927\u6587\u4ef6\u63cf\u8ff0\u7b26,\u5f53\u5ba2\u6237\u7aef\u8fde\u63a5\u6570\u5230\u8fbe\u9650\u5236\u65f6\uff0cRedis\u4f1a\u5173\u95ed\u65b0\u7684\u8fde\u63a5\u5e76\u5411\u5ba2\u6237\u7aef\u8fd4\u56de max number of clients reached \u9519\u8bef\u4fe1\u606f,\u9ed8\u8ba4-10000  \nmaxclients {{redis.max_clients}}\n# \u6700\u5927\u5185\u5b58\uff0c\u9ed8\u8ba4\u4e3a0\uff0c\u8868\u793a\u4e0d\u505a\u9650\u5236\uff0c\u5408\u6cd5\u7684\u683c\u5f0f\uff1a1048576\uff08\u4e0d\u5199\u5355\u4f4d\u6807\u8bc6\u5b57\u8282\uff09\u30011048576B\u30011000KB\u3001100MB\u30011GB\u30011000K\u3001100M\u30011G\uff0864\u4f4d\u7cfb\u7edf\u4e0d\u9650\u5236\u5185\u5b58\uff0c32\u4f4d\u7cfb\u7edf\u6700\u591a\u4f7f\u75283GB\u5185\u5b58\uff09\nmaxmemory {{redis.max_memory}}\n# \u6307\u5b9a\u66f4\u65b0\u65e5\u5fd7\u7684\u6761\u4ef6\uff0c\u6709\u4e09\u4e2a\u53ef\u9009\u53c2\u6570 - no\uff1a\u8868\u793a\u7b49\u64cd\u4f5c\u7cfb\u7edf\u8fdb\u884c\u6570\u636e\u7f13\u5b58\u540c\u6b65\u5230\u78c1\u76d8(\u5feb)\uff0calways\uff1a\u8868\u793a\u6bcf\u6b21\u66f4\u65b0\u64cd\u4f5c\u540e\u624b\u52a8\u8c03\u7528fsync()\u5c06\u6570\u636e\u5199\u5230\u78c1\u76d8(\u6162\uff0c\u5b89\u5168)\uff0c everysec\uff1a\u8868\u793a\u6bcf\u79d2\u540c\u6b65\u4e00\u6b21(\u6298\u8877\uff0c\u9ed8\u8ba4\u503c)\uff1b\nappendfsync {{redis.appendfsync}}\n# \u6dd8\u6c70\u7b56\u7565\uff1a\n# noeviction(\u9ed8\u8ba4\u7b56\u7565)\uff1a\u5bf9\u4e8e\u5199\u8bf7\u6c42\u4e0d\u518d\u63d0\u4f9b\u670d\u52a1\uff0c\u76f4\u63a5\u8fd4\u56de\u9519\u8bef\uff08DEL\u8bf7\u6c42\u548c\u90e8\u5206\u7279\u6b8a\u8bf7\u6c42\u9664\u5916\uff09\n# allkeys-lru\uff1a\u4ece\u6240\u6709key\u4e2d\u4f7f\u7528LRU\u7b97\u6cd5\u8fdb\u884c\u6dd8\u6c70\uff08LRU\u7b97\u6cd5\uff1a\u5373\u6700\u8fd1\u6700\u5c11\u4f7f\u7528\u7b97\u6cd5\uff09\n# volatile-lru\uff1a\u4ece\u8bbe\u7f6e\u4e86\u8fc7\u671f\u65f6\u95f4\u7684key\u4e2d\u4f7f\u7528LRU\u7b97\u6cd5\u8fdb\u884c\u6dd8\u6c70\n# allkeys-random\uff1a\u4ece\u6240\u6709key\u4e2d\u968f\u673a\u6dd8\u6c70\u6570\u636e\n# volatile-random\uff1a\u4ece\u8bbe\u7f6e\u4e86\u8fc7\u671f\u65f6\u95f4\u7684key\u4e2d\u968f\u673a\u6dd8\u6c70\n# volatile-ttl\uff1a\u5728\u8bbe\u7f6e\u4e86\u8fc7\u671f\u65f6\u95f4\u7684key\u4e2d\uff0c\u6dd8\u6c70\u8fc7\u671f\u65f6\u95f4\u5269\u4f59\u6700\u77ed\u7684\n# \u5f53\u4f7f\u7528volatile-lru\u3001volatile-random\u3001volatile-ttl\u8fd9\u4e09\u79cd\u7b56\u7565\u65f6\uff0c\u5982\u679c\u6ca1\u6709key\u53ef\u4ee5\u88ab\u6dd8\u6c70\uff0c\u5219\u548cnoeviction\u4e00\u6837\u8fd4\u56de\u9519\u8bef\nmaxmemory-policy {{redis.max_memory_policy}}\nEOF<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">redis\u670d\u52a1\u81ea\u542f\u6587\u4ef6<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/roles\/redis\/templates\/redis.service &lt;&lt; \\EOF\n&#91;Unit]\nDescription=redis system config \nAfter=network.target\n\n&#91;Service]\nType=forking\nUser={{config.run_user.name}}\nGroup={{config.run_user.group}}\nExecStart={{redis.install_dir}}\/{{redis.uncompress_folder_name}}\/src\/redis-server {{redis.config_dir}}\/redis-{{current_host.redis.port}}.conf\n{% if current_host.redis.password is undefined or current_host.redis.password == None or current_host.redis.password | length == 0 %}\nExecStop={{redis.install_dir}}\/{{redis.uncompress_folder_name}}\/src\/redis-cli -h {{current_host.ip}} -p {{current_host.redis.port}} shutdown\n{% else %}\n# \u6709\u5bc6\u7801\u65f6\u9700\u8981\u6dfb\u52a0-a\u53c2\u6570\uff0c\u6dfb\u52a0--no-auth-warning\u53d6\u6d88\u8b66\u544a\nExecStop={{redis.install_dir}}\/{{redis.uncompress_folder_name}}\/src\/redis-cli -h {{current_host.ip}} -p {{current_host.redis.port}} -a {{current_host.redis.password}} --no-auth-warning shutdown\n{% endif %}\n\n# Other directives omitted\n# (file size)\nLimitFSIZE=infinity\n# (cpu time)\nLimitCPU=infinity\n# (virtual memory size)\nLimitAS=infinity\n# (locked-in-memory size)\nLimitMEMLOCK=infinity\n# (open files)\nLimitNOFILE=64000\n# (processes\/threads)\nLimitNPROC=64000\n\n&#91;Install]\nWantedBy=multi-user.target\nEOF<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">sentinel\u914d\u7f6e\u6587\u4ef6<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/roles\/redis\/templates\/sentinel.conf &lt;&lt; \\EOF\n# \u54e8\u5175sentinel\u5b9e\u4f8b\u8fd0\u884c\u7684\u7aef\u53e3\uff0c\u9ed8\u8ba427011\nport {{current_host.sentinel.port}}\n# \u54e8\u5175sentinel\u7684\u5de5\u4f5c\u76ee\u5f55\ndir {{sentinel.dir}}\n# \u662f\u5426\u5f00\u542f\u4fdd\u62a4\u6a21\u5f0f\uff0c\u9ed8\u8ba4\u5f00\u542f\u3002\nprotected-mode no\n# \u662f\u5426\u8bbe\u7f6e\u4e3a\u540e\u53f0\u542f\u52a8\u3002\ndaemonize yes\n\n# \u54e8\u5175sentinel\u7684\u65e5\u5fd7\u6587\u4ef6\nlogfile {{sentinel.log_file}}\n\n# \u54e8\u5175sentinel\u76d1\u63a7\u7684redis\u4e3b\u8282\u70b9\u7684 \n## ip\uff1amaster\u8282\u70b9\u4e3b\u673aip\u5730\u5740\n## port\uff1amaster\u8282\u70b9redis\u7aef\u53e3\u53f7\n## master-name\uff1a\u53ef\u4ee5\u81ea\u5df1\u547d\u540d\u7684\u4e3b\u8282\u70b9\u540d\u5b57\n## quorum:\u5f53\u8fd9\u4e9bquorum\u4e2a\u6570sentinel\u54e8\u5175\u8ba4\u4e3amaster\u4e3b\u8282\u70b9\u5931\u8054 \u90a3\u4e48\u8fd9\u65f6 \n# \u5ba2\u89c2\u4e0a\u8ba4\u4e3a\u4e3b\u8282\u70b9\u5931\u8054\u4e86  \n# sentinel monitor &lt;master-name&gt; &lt;ip&gt; &lt;redis-port&gt; &lt;quorum&gt;  \nsentinel monitor {{redis.master_name}} {{master_host.ip}} {{master_host.redis.port}} {{sentinel_monitor_quorum}}\n\n# \u5f53\u5728Redis\u5b9e\u4f8b\u4e2d\u5f00\u542f\u4e86requirepass\uff0c\u6240\u6709\u8fde\u63a5Redis\u5b9e\u4f8b\u7684\u5ba2\u6237\u7aef\u90fd\u8981\u63d0\u4f9b\u5bc6\u7801\u3002\n# sentinel auth-pass &lt;master-name&gt; &lt;password&gt;  \nsentinel auth-pass {{redis.master_name}} {{master_host.redis.password}}  \n\n# \u6307\u5b9a\u4e3b\u8282\u70b9\u5e94\u7b54\u54e8\u5175sentinel\u7684\u6700\u5927\u65f6\u95f4\u95f4\u9694\uff0c\u8d85\u8fc7\u8fd9\u4e2a\u65f6\u95f4\uff0c\u54e8\u5175\u4e3b\u89c2\u4e0a\u8ba4\u4e3a\u4e3b\u8282\u70b9\u4e0b\u7ebf\uff0c\n#\u9ed8\u8ba430\u79d2  \n# sentinel down-after-milliseconds &lt;master-name&gt; &lt;milliseconds&gt;\nsentinel down-after-milliseconds {{redis.master_name}} {{sentinel.down_after_milliseconds}}  \n\n# \u6307\u5b9a\u4e86\u5728\u53d1\u751ffailover\u4e3b\u5907\u5207\u6362\u65f6\uff0c\u6700\u591a\u53ef\u4ee5\u6709\u591a\u5c11\u4e2aslave\u540c\u65f6\u5bf9\u65b0\u7684master\u8fdb\u884c\u540c\u6b65\u3002\n#\u8fd9\u4e2a\u6570\u5b57\u8d8a\u5c0f\uff0c\u5b8c\u6210failover\u6240\u9700\u7684\u65f6\u95f4\u5c31\u8d8a\u957f\uff1b\u53cd\u4e4b\uff0c\u4f46\u662f\u5982\u679c\u8fd9\u4e2a\u6570\u5b57\u8d8a\u5927\uff0c\u5c31\u610f\u5473\u7740\n#\u8d8a\u591a\u7684slave\u56e0\u4e3areplication\u800c\u4e0d\u53ef\u7528\u3002\u53ef\u4ee5\u901a\u8fc7\u5c06\u8fd9\u4e2a\u503c\u8bbe\u4e3a1\uff0c\u6765\u4fdd\u8bc1\u6bcf\u6b21\u53ea\u6709\u4e00\u4e2aslave\uff0c\n#\u5904\u4e8e\u4e0d\u80fd\u5904\u7406\u547d\u4ee4\u8bf7\u6c42\u7684\u72b6\u6001\u3002\n# sentinel parallel-syncs &lt;master-name&gt; &lt;numslaves&gt;\nsentinel parallel-syncs {{redis.master_name}} {{sentinel.parallel_syncs}}  \n\n# \u6545\u969c\u8f6c\u79fb\u7684\u8d85\u65f6\u65f6\u95f4failover-timeout\uff0c\u9ed8\u8ba4\u4e09\u5206\u949f\uff0c\u53ef\u4ee5\u7528\u5728\u4ee5\u4e0b\u8fd9\u4e9b\u65b9\u9762\uff1a\n## 1. \u540c\u4e00\u4e2asentinel\u5bf9\u540c\u4e00\u4e2amaster\u4e24\u6b21failover\u4e4b\u95f4\u7684\u95f4\u9694\u65f6\u95f4\u3002  \n## 2. \u5f53\u4e00\u4e2aslave\u4ece\u4e00\u4e2a\u9519\u8bef\u7684master\u90a3\u91cc\u540c\u6b65\u6570\u636e\u65f6\u5f00\u59cb\uff0c\u76f4\u5230slave\u88ab\u7ea0\u6b63\u4e3a\u4ece\u6b63\u786e\n#\u7684master\u90a3\u91cc\u540c\u6b65\u6570\u636e\u65f6\u7ed3\u675f\u3002  \n## 3. \u5f53\u60f3\u8981\u53d6\u6d88\u4e00\u4e2a\u6b63\u5728\u8fdb\u884c\u7684failover\u65f6\u6240\u9700\u8981\u7684\u65f6\u95f4\u3002\n## 4.\u5f53\u8fdb\u884cfailover\u65f6\uff0c\u914d\u7f6e\u6240\u6709slaves\u6307\u5411\u65b0\u7684master\u6240\u9700\u7684\u6700\u5927\u65f6\u95f4\u3002\u4e0d\u8fc7\uff0c\n#\u5373\u4f7f\u8fc7\u4e86\u8fd9\u4e2a\u8d85\u65f6\uff0cslaves\u4f9d\u7136\u4f1a\u88ab\u6b63\u786e\u914d\u7f6e\u4e3a\u6307\u5411master\uff0c\u4f46\u662f\u5c31\u4e0d\u6309parallel-syncs\u6240\u914d\u7f6e\u7684\u89c4\u5219\u6765\u540c\u6b65\u6570\u636e\u4e86\n# sentinel failover-timeout &lt;master-name&gt; &lt;milliseconds&gt;  \nsentinel failover-timeout {{redis.master_name}} {{sentinel.failover_timeout}}\n{% if not (sentinel.notification_script is undefined or sentinel.notification_script == None or sentinel.notification_script | length == 0) %}\n# \u5f53sentinel\u6709\u4efb\u4f55\u8b66\u544a\u7ea7\u522b\u7684\u4e8b\u4ef6\u53d1\u751f\u65f6\uff08\u6bd4\u5982\u8bf4redis\u5b9e\u4f8b\u7684\u4e3b\u89c2\u5931\u6548\u548c\u5ba2\u89c2\u5931\u6548\u7b49\u7b49\uff09\uff0c\n#\u5c06\u4f1a\u53bb\u8c03\u7528\u8fd9\u4e2a\u811a\u672c\u3002\u4e00\u4e2a\u811a\u672c\u7684\u6700\u5927\u6267\u884c\u65f6\u95f4\u4e3a60s\uff0c\u5982\u679c\u8d85\u8fc7\u8fd9\u4e2a\u65f6\u95f4\uff0c\n#\u811a\u672c\u5c06\u4f1a\u88ab\u4e00\u4e2aSIGKILL\u4fe1\u53f7\u7ec8\u6b62\uff0c\u4e4b\u540e\u91cd\u65b0\u6267\u884c\u3002\n# \u5bf9\u4e8e\u811a\u672c\u7684\u8fd0\u884c\u7ed3\u679c\u6709\u4ee5\u4e0b\u89c4\u5219\uff1a  \n## 1. \u82e5\u811a\u672c\u6267\u884c\u540e\u8fd4\u56de1\uff0c\u90a3\u4e48\u8be5\u811a\u672c\u7a0d\u540e\u5c06\u4f1a\u88ab\u518d\u6b21\u6267\u884c\uff0c\u91cd\u590d\u6b21\u6570\u76ee\u524d\u9ed8\u8ba4\u4e3a10\u3002\n## 2. \u82e5\u811a\u672c\u6267\u884c\u540e\u8fd4\u56de2\uff0c\u6216\u8005\u6bd42\u66f4\u9ad8\u7684\u4e00\u4e2a\u8fd4\u56de\u503c\uff0c\u811a\u672c\u5c06\u4e0d\u4f1a\u91cd\u590d\u6267\u884c\u3002  \n## 3. \u5982\u679c\u811a\u672c\u5728\u6267\u884c\u8fc7\u7a0b\u4e2d\u7531\u4e8e\u6536\u5230\u7cfb\u7edf\u4e2d\u65ad\u4fe1\u53f7\u88ab\u7ec8\u6b62\u4e86\uff0c\u5219\u540c\u8fd4\u56de\u503c\u4e3a1\u65f6\u7684\u884c\u4e3a\u76f8\u540c\u3002\n# sentinel notification-script &lt;master-name&gt; &lt;script-path&gt;  \nsentinel notification-script {{redis.master_name}} {{sentinel.notification_script}}\n{% endif %}\n\n{% if not (sentinel.client_reconfig_script is undefined or sentinel.client_reconfig_script == None or sentinel.client_reconfig_script | length == 0) %}\n# \u8fd9\u4e2a\u811a\u672c\u5e94\u8be5\u662f\u901a\u7528\u7684\uff0c\u80fd\u88ab\u591a\u6b21\u8c03\u7528\uff0c\u4e0d\u662f\u9488\u5bf9\u6027\u7684\u3002\n# sentinel client-reconfig-script &lt;master-name&gt; &lt;script-path&gt;\nsentinel client-reconfig-script {{redis.master_name}} {{sentinel.client_reconfig_script}}\n{% endif %}\nEOF<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u5b89\u88c5\u4efb\u52a1<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u5fc5\u586b\u53c2\u6570\u6821\u9a8c\u4efb\u52a1<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt;  \/etc\/ansible\/roles\/redis\/tasks\/valid-required-params.yaml &lt;&lt; \\EOF\n   - fail: \n      msg: \"\u5b89\u88c5\u3010redis\u3011\u65f6\u3010\u5b89\u88c5\u65b9\u5f0f-install_from.local\u3011\u4e0d\u80fd\u4e3a\u7a7a\"\n     when: \n      - redis.install_from.local is undefined or redis.install_from.local == None or redis.install_from.local | length == 0\n   - fail: \n      msg: \"\u5b89\u88c5\u3010redis\u3011\u65f6\u3010\u5b89\u88c5\u76ee\u5f55-install_dir\u3011\u4e0d\u80fd\u4e3a\u7a7a\"\n     when: \n      - redis.install_dir is undefined or redis.install_dir == None or redis.install_dir | length == 0\n   - fail: \n      msg: \"\u5b89\u88c5\u3010redis\u3011\u65f6\u3010\u538b\u7f29\u5305\u89e3\u538b\u540e\u7684\u6587\u4ef6\u5939\u540d\u79f0-uncompress_folder_name\u3011\u4e0d\u80fd\u4e3a\u7a7a\"\n     when: \n      - redis.uncompress_folder_name is undefined or redis.uncompress_folder_name == None or redis.uncompress_folder_name | length == 0\n   - fail: \n      msg: \"\u5b89\u88c5\u3010redis\u3011\u65f6\u3010\u670d\u52a1\u5668\u5217\u8868-hostnames\u3011\u4e0d\u80fd\u4e3a\u7a7a\"\n     when: not (hostnames is defined and  (hostnames | type_debug == 'list') and (hostnames | count &gt; 0))\nEOF<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u521b\u5efa\u53d8\u91cf\u9ed8\u8ba4\u503c\u521d\u59cb\u5316\u4efb\u52a1<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt;  \/etc\/ansible\/roles\/redis\/tasks\/default-var-init.yaml &lt;&lt; \\EOF\n - name: \u521d\u59cb\u5316 redis \u5b89\u88c5\u65b9\u5f0f\n   set_fact:\n    redis: \"{{ redis | combine({'install_type': 'standalone'}) }}\"\n   when: redis.install_type is undefined or redis.install_type == None or redis.install_type | length == 0\n - name: \u521d\u59cb\u5316 redis \u96c6\u7fa4\u540d\u79f0\n   set_fact:\n    redis: \"{{ redis | combine({'master_name': 'redis_master'}) }}\"\n   when: redis.redis_cluster is undefined or redis.redis_cluster == None or redis.redis_cluster | length == 0\n - name: \u521d\u59cb\u5316 redis \u6570\u636e\u76ee\u5f55\n   set_fact:\n    redis: \"{{ redis | combine({'data_dir': redis.install_dir + '\/' + redis.uncompress_folder_name + '\/data'}) }}\"\n   when: redis.data_dir is undefined or redis.data_dir == None or redis.data_dir | length == 0\n - name: \u521d\u59cb\u5316 redis \u914d\u7f6e\u76ee\u5f55\n   set_fact:\n    redis: \"{{ redis | combine({'config_dir': redis.install_dir + '\/' + redis.uncompress_folder_name + '\/conf'}) }}\"\n   when: redis.config_dir is undefined or redis.config_dir == None or redis.config_dir | length == 0\n - name: \u5b9e\u4f8b\u5316 hostnames \u9ed8\u8ba4\u5c5e\u6027\n   set_fact:\n     temp_hostnames: &gt;-\n       {{\n         temp_hostnames | default(&#91;]) +\n         &#91;\n           item | combine(\n             {\n             \"redis\":{\n              \"port\": \"7011\" if (item.redis.port is undefined or item.redis.port == None or not item.redis.port) else item.redis.port | string\n              ,\"password\": 'Redis@123456' if (item.redis.password is undefined or item.redis.password == None or item.redis.password | length == 0) else item.redis.password\n              ,\"is_master\": false  | lower | bool if (item.redis.is_master is undefined or item.redis.is_master == None) else item.redis.is_master\n              ,\"is_master\": true if ((item.redis.is_master is undefined or item.redis.is_master == None) and ansible_loop.first) else false | lower | bool if (item.redis.is_master is undefined or item.redis.is_master == None) else item.redis.is_master\n              ,\"master_auth\": 'master_auth' if (item.redis.master_auth is undefined or item.redis.master_auth == None or item.redis.master_auth | length == 0) else item.redis.master_auth\n              }\n              ,\"sentinel\": {\n              \"port\": \"27011\" if (item.sentinel.port is undefined or item.sentinel.port == None or not item.sentinel.port) else item.sentinel.port | string\n              }\n             }\n           ,recursive=True)\n         ]\n       }}\n   loop: \"{{ hostnames }}\"\n   loop_control:\n    extended: true\n   vars:\n     temp_hostnames: &#91;]\n - name: \u91cd\u65b0\u7ed9 hostnames \u5c5e\u6027\u8d4b\u503c\n   set_fact:\n    hostnames: \"{{temp_hostnames}}\"\n - name: \u83b7\u53d6\u5b9a\u4e49\u7684\u6240\u6709redis\u4e3b\u673a\u4fe1\u606f\n   set_fact:\n    temp_redis: \"{{hostnames | json_query('&#91;].{domain:hostname,ip:ip,port:redis.port | string}') }}\"    \n - name: redis \u5b89\u88c5\u540e\u662f\u5426\u7acb\u8fd0\u884c\u914d\u7f6e\n   set_fact:\n    config: \"{{ config | combine({'run_after_install': true },recursive=True) }}\"\n   when: config.run_after_install is undefined or config.run_after_install == None or not config.run_after_install\n - name: redis \u662f\u5426\u5f00\u673a\u81ea\u542f\n   set_fact:\n    config: \"{{ config | combine({'start_follow_server': true },recursive=True) }}\"\n   when: config.start_follow_server is undefined or config.start_follow_server == None or not config.start_follow_server\n - name: redis \u5b89\u88c5\u540e\u8fd0\u884c\u65f6\u4f7f\u7528\u7684\u7528\u6237\u914d\u7f6e\n   set_fact:\n    config: \"{{ config | combine({'run_user': {'name': 'root'}},recursive=True) }}\"\n   when: config.run_user.name is undefined or config.run_user.name == None or mongo.install_from.local | length == 0\n - name: mongo \u5b89\u88c5\u540e\u8fd0\u884c\u65f6\u4f7f\u7528\u7684\u7528\u6237\u7ec4\u914d\u7f6e\n   set_fact:\n    config: \"{{ config | combine({'run_user': {'group': 'root'}},recursive=True) }}\"\n   when: config.run_user.group is undefined or config.run_user.group == None or mongo.install_from.local | length == 0\n - name: \u83b7\u5f97\u5f53\u524d\u4e3b\u673a\u4e0b\u914d\u7f6e\u7684\u6240\u6709\u81ea\u5b9a\u4e49\u53d8\u91cf\n   set_fact:\n    # \u83b7\u53d6\u5f53\u524d\u4e3b\u673a\u81ea\u5b9a\u4e49\u7684\u53d8\u91cf\n    current_host: \"{{hostnames | json_query(query_condition) }}\"\n   vars:\n   # \u67e5\u8be2\u51fa\u7684\u7ed3\u679c\u4e3a\u4e00\u4e2ajson\u6570\u7ec4\uff0c\u53d6\u7b2c\u4e00\u6761\u5373\u53ef\n    query_condition: \"&#91;?hostname=='{{inventory_hostname}}'] | &#91;0]\"\n - name: \u521d\u59cb\u5316 redis \u8fdb\u7a0b\u6587\u4ef6 \n   set_fact:\n    redis: \"{{ redis | combine({'pid_file': redis.install_dir + '\/' + redis.uncompress_folder_name + '\/pid\/redis-'+ current_host.redis.port+'.pid'}) }}\"\n   when: redis.pid_file is undefined or redis.pid_file == None or redis.pid_file  | length == 0\n - name: \u521d\u59cb\u5316 redis \u65e5\u5fd7\u6587\u4ef6 \n   set_fact:\n    redis: \"{{ redis | combine({'log_file': redis.install_dir + '\/' + redis.uncompress_folder_name + '\/logs\/redis-'+current_host.redis.port+'.log'}) }}\"\n   when: redis.log_file is undefined or redis.log_file == None or redis.log_file | length == 0\n - name: \u521d\u59cb\u5316 redis \u8bbe\u7f6e\u540c\u4e00\u65f6\u95f4\u6700\u5927\u5ba2\u6237\u8fde\u63a5\u6570\n   set_fact:\n    redis: \"{{ redis | combine({'max_clients': 10000}) }}\"\n   when: redis.max_clients is undefined or redis.max_clients == None or not redis.max_clients\n - name: \u521d\u59cb\u5316 redis \u6700\u5927\u5185\u5b58\n   set_fact:\n    redis: \"{{ redis | combine({'max_memory': 0}) }}\"\n   when: redis.max_memory is undefined or redis.max_memory == None or not redis.max_memory\n - name: \u521d\u59cb\u5316 redis \u6dd8\u6c70\u7b56\u7565 \n   set_fact:\n    redis: \"{{ redis | combine({'max_memory_policy': 'noeviction'}) }}\"\n   when: redis.max_memory_policy is undefined or redis.max_memory_policy == None or redis.max_memory_policy | length == 0\n - name: \u521d\u59cb\u5316 redis \u662f\u5426\u5f00\u542f\u4fdd\u62a4\u6a21\u5f0f \n   set_fact:\n    redis: \"{{ redis | combine({'protected_mode': 'no'}) }}\"\n   when: redis.protected_mode is undefined or redis.protected_mode == None or redis.protected_mode | length == 0\n - name: \u521d\u59cb\u5316 redis \u662f\u5426\u5f00\u542f\u4fdd\u62a4\u6a21\u5f0f \n   set_fact:\n    redis: \"{{ redis | combine({'appendfsync': 'everysec'}) }}\"\n   when: redis.appendfsync is undefined or redis.appendfsync == None or redis.appendfsync | length == 0\n - name:  \u521d\u59cb\u5316 redis sentinel \u5de5\u4f5c\u76ee\u5f55\n   set_fact:\n    sentinel: \"{{ sentinel | combine({'dir': redis.install_dir + '\/' + redis.uncompress_folder_name + '\/sentinel'}) }}\"\n   when: sentinel.dir is undefined or sentinel.dir == None or sentinel.dir | length == 0\n - name: \u521d\u59cb\u5316 redis sentinel \u65e5\u5fd7\u6587\u4ef6\n   set_fact:\n    sentinel: \"{{ sentinel | combine({'log_file': redis.install_dir + '\/' + redis.uncompress_folder_name + '\/sentinel\/sentinel.log'}) }}\"\n   when: sentinel.log_file is undefined or sentinel.log_file == None or sentinel.log_file | length == 0\n - name: \u521d\u59cb\u5316 redis sentinel \u6307\u5b9a\u4e3b\u8282\u70b9\u5e94\u7b54\u54e8\u5175sentinel\u7684\u6700\u5927\u65f6\u95f4\u95f4\u9694\n   set_fact:\n    sentinel: \"{{ sentinel | combine({'down_after_milliseconds': 30000}) }}\"\n   when: sentinel.down_after_milliseconds is undefined or sentinel.down_after_milliseconds == None or sentinel.down_after_milliseconds | length == 0\n - name: \u521d\u59cb\u5316 redis sentinel \u6307\u5b9a\u5728\u53d1\u751ffailover\u4e3b\u5907\u5207\u6362\u65f6\uff0c\u6700\u591a\u53ef\u4ee5\u6709\u591a\u5c11\u4e2aslave\u540c\u65f6\u5bf9\u65b0\u7684master\u8fdb\u884c\u540c\u6b65\n   set_fact:\n    sentinel: \"{{ sentinel | combine({'parallel_syncs': 1}) }}\"\n   when: sentinel.parallel_syncs is undefined or sentinel.parallel_syncs == None or sentinel.parallel_syncs | length == 0\n - name: \u521d\u59cb\u5316 redis sentinel \u6307\u5b9a\u6545\u969c\u8f6c\u79fb\u7684\u8d85\u65f6\u65f6\u95f4\n   set_fact:\n    sentinel: \"{{ sentinel | combine({'failover_timeout': 18000}) }}\"\n   when: sentinel.failover_timeout is undefined or sentinel.failover_timeout == None or sentinel.failover_timeout | length == 0\nEOF<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">redis\u5b89\u88c5\u4efb\u52a1<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt;  \/etc\/ansible\/roles\/redis\/tasks\/install-standalone-redis.yaml &lt;&lt; \\EOF\n   - name: \u5224\u65ad\u3010redis\u3011\u3010\u5b89\u88c5\u5305\u76ee\u5f55\u3011\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\u81ea\u52a8\u521b\u5efa\n     file:\n      path: \"{{redis.install_from.local | dirname}}\"\n      state: directory\n     when: not (redis.install_from.local is undefined or redis.install_from.local == None or redis.install_from.local | length == 0)\n   - name: \u5224\u65ad\u3010redis\u3011\u3010\u5b89\u88c5\u76ee\u5f55\u3011\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\u81ea\u52a8\u521b\u5efa\n     file:\n      path: \"{{redis.install_dir}}\"\n      state: directory\n     when: not (redis.install_dir is undefined or redis.install_dir == None or redis.install_dir | length == 0)\n   - name: \u590d\u5236\u3010redis\u3011\u3010\u5b89\u88c5\u5305\u5230\u76ee\u6807\u4e3b\u673a\u3011\n     copy: \n      src: \"{{redis.install_from.local}}\"\n      dest: \"{{redis.install_from.local}}\"\n      backup: yes\n     when: not (redis.install_from.local is undefined or redis.install_from.local == None or redis.install_from.local | length == 0)\n   - name: \u89e3\u538b\u3010redis\u88c5\u5305\u3011\n     shell:\n      cd {{redis.install_from.local | dirname }}\n      &amp;&amp; tar -zxvf {{redis.install_from.local}} -C {{redis.install_dir}}\n     when: not (redis.install_from.local is undefined or redis.install_from.local == None or redis.install_from.local | length == 0)\n   - name: \u5224\u65ad\u3010redis\u3011\u3010\u914d\u7f6e\u76ee\u5f55\u3011\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\u81ea\u52a8\u521b\u5efa\n     file:\n      path: \"{{redis.config_dir}}\"\n      state: directory\n     when: not (redis.config_dir is undefined or redis.config_dir == None or redis.config_dir | length == 0)\n   - name: \u5224\u65ad\u3010redis\u3011\u3010\u6570\u636e\u76ee\u5f55\u3011\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\u81ea\u52a8\u521b\u5efa\n     file:\n      path: \"{{redis.data_dir}}\"\n      state: directory\n     when: not (redis.data_dir is undefined or redis.data_dir == None or redis.data_dir | length == 0)\n   - name: \u5224\u65ad\u3010redis\u3011\u3010\u8fdb\u7a0b\u76ee\u5f55\u3011\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\u81ea\u52a8\u521b\u5efa\n     file:\n      path: \"{{redis.pid_file | dirname}}\"\n      state: directory\n     when: not (redis.pid_file is undefined or redis.pid_file == None or redis.pid_file | length == 0)\n   - name: \u5224\u65ad\u3010redis\u3011\u3010\u8fdb\u7a0b\u6587\u4ef6\u3011\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\u81ea\u52a8\u521b\u5efa\n     file:\n      path: \"{{redis.pid_file}}\"\n      state: touch\n      mode: '600'\n     when: not (redis.pid_file is undefined or redis.pid_file == None or redis.pid_file | length == 0)\n   - name: \u5224\u65ad\u3010redis\u3011\u3010\u65e5\u5fd7\u76ee\u5f55\u3011\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\u81ea\u52a8\u521b\u5efa\n     file:\n      path: \"{{redis.log_file | dirname}}\"\n      state: directory\n     when: not (redis.log_file is undefined or redis.log_file == None or redis.log_file | length == 0)\n   - name: \u5224\u65ad\u3010redis\u3011\u3010\u65e5\u5fd7\u6587\u4ef6\u3011\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\u81ea\u52a8\u521b\u5efa\n     file:\n      path: \"{{redis.log_file}}\"\n      state: touch\n      mode: '600'\n     when: not (redis.log_file is undefined or redis.log_file == None or redis.log_file | length == 0)\n   - name: \u4ece\u3010redis\u3011\u3010\u5355\u673a\u7248\u914d\u7f6e\u6a21\u677f\u3011\u751f\u6210\u9ed8\u8ba4\u914d\u7f6e\u5e76\u5c06\u6587\u4ef6\u5230\u76ee\u6807\u4e3b\u673a\n     template: \n      src: \"redis.conf\"\n      dest: \"{{redis.config_dir}}\/redis-{{current_host.redis.port}}.conf\"\n      backup: yes\n   - name: \u4ece\u3010redis\u3011\u3010\u670d\u52a1\u81ea\u542f\u6a21\u677f\u3011\u751f\u6210\u9ed8\u8ba4\u914d\u7f6e\u5e76\u5c06\u6587\u4ef6\u5230\u76ee\u6807\u4e3b\u673a\n     template: \n      src: \"redis.service\"\n      dest: \"\/etc\/systemd\/system\/redis-{{current_host.redis.port}}.service\"\n      backup: yes\n   - name: \u914d\u7f6e\u3010redis\u3011\u3010\u662f\u5426\u5f00\u673a\u81ea\u542f\u3011\n     shell: \"systemctl enable redis-{{current_host.redis.port}}.service\"\n     when: config.start_follow_server\n   - name: \u91cd\u8f7d\u3010redis\u3011\u3010\u73af\u5883\u53d8\u91cf\u3011\n     shell: systemctl daemon-reload\n   - name: \u91cd\u542f\u3010redis\u3011\n     service: \n      name: \"redis-{{current_host.redis.port}}\"\n      state: started\n     when: config.run_after_install\nEOF<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">redis\u96c6\u7fa4\u7248\u5b89\u88c5\u4efb\u52a1<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt;  \/etc\/ansible\/roles\/redis\/tasks\/install-cluster-redis.yaml &lt;&lt; \\EOF\n   - name: \u5224\u65ad\u3010redis\u3011\u3010\u96c6\u7fa4\u914d\u7f6e\u6587\u4ef6\u3011\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\u81ea\u52a8\u521b\u5efa\n     file:\n      path: \"{{redis.config_dir}}\/cluster-{{current_host.redis.port}}.conf\"\n      state: touch\n     when: redis.install_type == 'cluster'\n   - name: \u83b7\u53d6 redis master \u8282\u70b9\u4e3b\u673a\n     set_fact:\n      # \u83b7\u53d6 master \u8282\u70b9\u4e3b\u673a\u4fe1\u606f\n      master_host: \"{{hostnames | json_query(query_condition) }}\"\n     vars:\n     # \u67e5\u8be2\u51fa\u7684\u7ed3\u679c\u4e3a\u4e00\u4e2a json \u6570\u7ec4\uff0c\u53d6\u7b2c\u4e00\u6761\u5373\u53ef\n      query_condition: \"&#91;?redis.is_master==`true`] | &#91;0]\"\n     when: redis.install_type == 'cluster'\n   - name: \u8bbe\u7f6e redis \u4e3b\u8282\u70b9 \u5bc6\u7801\u8bf4\u660e\n     lineinfile:\n      path:  \"{{redis.config_dir}}\/redis-{{current_host.redis.port}}.conf\"\n      line: \"# master\u4e3b\u8282\u70b9\u5bc6\u7801\"\n      state: present\n      insertafter: EOF\n     when: redis.install_type == 'cluster'\n   - name: \u8bbe\u7f6e redis \u4e3b\u8282\u70b9 \u5bc6\u7801\n     lineinfile:\n      path:  \"{{redis.config_dir}}\/redis-{{current_host.redis.port}}.conf\"\n      line: \"masterauth {{master_host.redis.password}}\"\n      state: present\n      insertafter: EOF\n     when: redis.install_type == 'cluster'\n   - name: \u4ece\u8282\u70b9 \u8bbe\u7f6e redis \u4e3b\u8282\u70b9 ip\u3001\u7aef\u53e3\u8bf4\u660e\n     lineinfile:\n      path:  \"{{redis.config_dir}}\/redis-{{current_host.redis.port}}.conf\"\n      line: \"# master \u4e3b\u8282\u70b9ip\u3001\u7aef\u53e3\"\n      state: present\n      insertafter: EOF\n     when: \n       - redis.install_type == 'cluster'\n       - not current_host.redis.is_master\n   - name: \u4ece\u8282\u70b9 \u8bbe\u7f6e redis \u4e3b\u8282\u70b9 \u4e3b\u8282\u70b9 ip\u3001\u7aef\u53e3\n     lineinfile:\n      path:  \"{{redis.config_dir}}\/redis-{{current_host.redis.port}}.conf\"\n      line: \"replicaof {{master_host.ip}} {{master_host.redis.port}}\"\n      state: present\n      insertafter: EOF\n     when:\n       - redis.install_type == 'cluster'\n       - not current_host.redis.is_master\n   - name: \u5220\u9664\u3010redis\u3011\u4ece\u8282\u70b9\u7684 aof \u6587\u4ef6\n     shell: rm -rf {{redis.install_dir}}\/{{redis.uncompress_folder_name}}\/appendonly.aof\n     when:\n       - redis.install_type == 'cluster'\n       - not current_host.redis.is_master\n   - name: \u91cd\u542f\u3010redis\u3011\u8282\u70b9\n     service: \n      name: \"redis-{{current_host.redis.port}}\"\n      state: restarted\n     when:\n       - redis.install_type == 'cluster'\nEOF<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">sentinel\u5b89\u88c5\u4efb\u52a1<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt;  \/etc\/ansible\/roles\/redis\/tasks\/install-sentinel.yaml &lt;&lt; \\EOF\n   - name: \u5224\u65ad\u3010sentinel\u3011\u3010\u914d\u7f6e\u76ee\u5f55\u3011\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\u81ea\u52a8\u521b\u5efa\n     file:\n      path: \"{{sentinel.dir}}\"\n      state: directory\n     when: \n      - not (sentinel.dir is undefined or sentinel.dir == None or sentinel.dir | length == 0)\n      - redis.install_type == 'cluster'\n   - name: \u5224\u65ad\u3010sentinel\u3011\u3010\u65e5\u5fd7\u6587\u4ef6\u3011\u662f\u5426\u5b58\u5728\uff0c\u4e0d\u5b58\u5728\u81ea\u52a8\u521b\u5efa\n     file:\n      path: \"{{sentinel.log_file}}\"\n      state: touch\n     when: \n      - not (sentinel.log_file is undefined or sentinel.log_file == None or sentinel.log_file | length == 0)\n      - redis.install_type == 'cluster'\n   - name: \u5224\u65ad\u3010sentinel\u3011\u3010\u4e2d\u975e\u4e3b\u8282\u70b9\u7684\u6570\u91cf\u3011\n     set_fact:\n      # \u83b7\u53d6 \u975e master \u8282\u70b9\u4e3b\u673a\u6570\u91cf\u5e76-1\u4fe1\u606f\n      sentinel_monitor_quorum: \"{{hostnames | json_query(query_condition) | length - 1 }}\"\n     vars:\n      query_condition: \"&#91;?redis.is_master==`false`]\"\n     when: redis.install_type == 'cluster'\n   - name: print val\n     debug:\n      msg: \"{{sentinel_monitor_quorum}}\"\n     when: redis.install_type == 'cluster'\n   - name: \u4ece\u3010sentinel\u3011\u3010\u914d\u7f6e\u6587\u4ef6\u3011\u751f\u6210\u9ed8\u8ba4\u914d\u7f6e\u5e76\u5c06\u6587\u4ef6\u5230\u76ee\u6807\u4e3b\u673a\n     template: \n      src: \"sentinel.conf\"\n      dest: \"{{sentinel.dir}}\/sentinel.conf\"\n      backup: yes\n     when: redis.install_type == 'cluster'\n   - name: \u542f\u52a8\u3010sentinel\u3011\n     shell: |\n      {{redis.install_dir}}\/{{redis.uncompress_folder_name}}\/src\/redis-sentinel {{sentinel.dir}}\/sentinel.conf\n     when: redis.install_type == 'cluster'\nEOF<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u6c47\u603b\u5b89\u88c5\u4efb\u52a1<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/roles\/redis\/tasks\/main.yaml &lt;&lt; \\EOF\n   # \u5fc5\u586b\u53c2\u6570\u6821\u9a8c\n   - import_tasks: valid-required-params.yaml\n   # \u9ed8\u8ba4\u53d8\u91cf\u5904\u7406\u4efb\u52a1\n   - import_tasks: default-var-init.yaml\n   # redis \u5355\u673a\u7248\u5b89\u88c5\u4efb\u52a1\n   - import_tasks: install-standalone-redis.yaml\n   # redis \u96c6\u7fa4\u7248\u5b89\u88c5\u4efb\u52a1\n   - import_tasks: install-cluster-redis.yaml\n   # sentinel \u5b89\u88c5\u4efb\u52a1\n   - import_tasks: install-sentinel.yaml\nEOF<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u6267\u884c\u6587\u4ef6<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; \/etc\/ansible\/install-redis.yaml &lt;&lt; \\EOF\n---\n- hosts: redis\n  roles:\n   - redis\nEOF<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u6267\u884c\u4efb\u52a1\u811a\u672c<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>ansible-playbook \/etc\/ansible\/install-redis.yaml<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u6d4b\u8bd5\u811a\u672c<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u96c6\u7fa4\u4fe1\u606f\u67e5\u770b<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># redis\u96c6\u7fa4\u4fe1\u606f\u67e5\u770b\n\/home\/zhoujibin\/redis-5.0.7\/src\/redis-cli -p 7011 -a Redis@123456 info replication\n# sentinel\u4fe1\u606f\u67e5\u770b\n\/home\/zhoujibin\/redis-5.0.7\/src\/redis-cli -p 27011 -a Redis@123456 info sentinel<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u6570\u636e\u540c\u6b65\u9a8c\u8bc1<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># \u4e3b\u8282\u70b9\n\/home\/zhoujibin\/redis-5.0.7\/src\/redis-cli -p 7011 -a Redis@123456 set name test\n\n# \u4ece\u8282\u70b9\u67e5\u770b\u6570\u636e\n\/home\/zhoujibin\/redis-5.0.7\/src\/redis-cli -p 7011 -a Redis@123456 get name<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\uff01\uff01\uff01\u5220\u9664 redis\uff08\u4ec5\u5728\u6d4b\u8bd5\u65f6\u4f7f\u7528\uff09<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>service redis-7011 stop &amp;&amp; rm -rf \/home\/zhoujibin\/redis-5.0.7<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u53d6\u6d88\u5f00\u673a\u81ea\u542f<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>systemctl disable redis-7011<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u53c2\u8003\u8fde\u63a5<\/h3>\n\n\n\n<p><a href=\"https:\/\/cloud.tencent.com\/developer\/article\/2124382\">redis\u96c6\u7fa4\u642d\u5efa<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/www.cnblogs.com\/cangcat\/p\/15651812.html\">redis\u53ca\u5176Sentinel\u914d\u7f6e\u9879\u8be6\u7ec6\u8bf4\u660e<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>[TOC] \u8f6f\u4ef6\u5b89\u88c5 \u6267\u884c\u5b89\u88c5\u547d\u4ee4 \u76ee\u5f55\u8bf4\u660e \u76ee\u5f55 \u5907\u6ce8 \/etc\/ansible\/ \u4e3b\u76ee\u5f55 \/etc\/ans [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[38,39,30],"class_list":["post-144","post","type-post","status-publish","format-standard","hentry","category-linux","tag-ansible","tag-devops","tag-linux"],"_links":{"self":[{"href":"https:\/\/zhoujibin.com\/index.php?rest_route=\/wp\/v2\/posts\/144"}],"collection":[{"href":"https:\/\/zhoujibin.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/zhoujibin.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/zhoujibin.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/zhoujibin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=144"}],"version-history":[{"count":1,"href":"https:\/\/zhoujibin.com\/index.php?rest_route=\/wp\/v2\/posts\/144\/revisions"}],"predecessor-version":[{"id":145,"href":"https:\/\/zhoujibin.com\/index.php?rest_route=\/wp\/v2\/posts\/144\/revisions\/145"}],"wp:attachment":[{"href":"https:\/\/zhoujibin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=144"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zhoujibin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=144"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zhoujibin.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=144"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}