{"id":33805,"date":"2023-10-07T21:05:33","date_gmt":"2023-01-24T02:09:12","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8molecule%e8%bf%9b%e8%a1%8c%e6%b5%8b%e8%af%95redis%e9%9b%86%e7%be%a4%e6%9e%84%e5%bb%ba%e7%9a%84playbook%e3%80%82\/"},"modified":"2024-05-04T03:16:36","modified_gmt":"2024-05-03T19:16:36","slug":"%e4%bd%bf%e7%94%a8molecule%e8%bf%9b%e8%a1%8c%e6%b5%8b%e8%af%95redis%e9%9b%86%e7%be%a4%e6%9e%84%e5%bb%ba%e7%9a%84playbook%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8molecule%e8%bf%9b%e8%a1%8c%e6%b5%8b%e8%af%95redis%e9%9b%86%e7%be%a4%e6%9e%84%e5%bb%ba%e7%9a%84playbook%e3%80%82\/","title":{"rendered":"\u4f7f\u7528Molecule\u8fdb\u884c\u6d4b\u8bd5Redis\u96c6\u7fa4\u6784\u5efa\u7684playbook"},"content":{"rendered":"<h1>Molecule\u3092\u4f7f\u7528\u3057\u3066\u3001Redis-Cluster\u3092\u69cb\u7bc9\u3059\u308bplaybook\u306e\u30c6\u30b9\u30c8\u3092\u884c\u3046<\/h1>\n<p>Molecule \u306fAnsible \u306e\u30ed\u30fc\u30eb\u306e\u958b\u767a\u3068\u30c6\u30b9\u30c8\u3092\u652f\u63f4\u3059\u308b\u3088\u3046\u306b\u8a2d\u8a08\u3055\u308c\u3066\u3044\u308bAnsible \u306e\u30c6\u30b9\u30c8\u30c4\u30fc\u30eb\u3067\u3059\u3002<\/p>\n<p>\u901a\u8fc7\u4f7f\u7528Molecule\uff0c\u5728Docker\u5bb9\u5668\u4e2d\u6267\u884cAnsible\u89d2\u8272\u5e76\u8fdb\u884cplaybook\u9a8c\u8bc1\u6210\u4e3a\u53ef\u80fd\u3002<\/p>\n<p>\u300c\u306a\u308b\u307b\u3069\u3001\u5206\u304b\u3089\u3093\u300d\u3068\u3044\u3046\u65b9\u306f\u3001\u4e0b\u8a18\u3092\u3054\u4e00\u8aad\u3044\u305f\u3060\u3051\u308c\u3070\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n<ul class=\"post-ul\">SlideShare: Molecule\u5165\u9580<\/ul>\n<p>\u4eca\u56de\u306f\u4ee5\u524d\u306b\u4f5c\u6210\u3057\u305fplaybook \u3092\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3057\u3066\u3001Molecule \u3092\u4f7f\u3044\u65b9\u3092\u5916\u90e8\u8a18\u61b6\u3068\u3057\u3066\u6b8b\u305d\u3046\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n<h2>\u524d\u63d0\u6761\u4ef6 (Qian ti tiao jian)<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Ansible \u306f\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u6e08\u307f\u3067\u3042\u308b\u3068\u3059\u308b<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">config\u3001inventory \u306e\u8a2d\u5b9a\u306f\u5b8c\u4e86\u6e08\u307f\u3067\u3042\u308b\u3068\u3059\u308b<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u9375\u751f\u6210\u3001\u9375\u4ea4\u63db\u3001\u758e\u901a\u78ba\u8a8d\u306f\u5b8c\u4e86\u6e08\u307f\u3067\u3042\u308b\u3068\u3059\u308b<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">proxy \u74b0\u5883\u4e0b\u3067\u306f\u306a\u3044\u3082\u306e\u3068\u3059\u308b<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u4e00\u3064\u306e\u30b5\u30fc\u30d0\u30fc\u306bRedis \u306eMaster \u3068Slave \u3092\u914d\u7f6e\u3059\u308b<\/ul>\n<h2>\u6267\u884c\u73af\u5883<\/h2>\n<pre class=\"post-pre\"><code># cat \/etc\/redhat-release \r\nCentOS Linux release 7.7.1908 (Core)\r\n\r\n# ansible --version\r\nansible 2.9.1\r\n  config file = \/etc\/ansible\/ansible.cfg\r\n  configured module search path = [u'\/root\/.ansible\/plugins\/modules', u'\/usr\/share\/ansible\/plugins\/modules']\r\n  ansible python module location = \/usr\/lib\/python2.7\/site-packages\/ansible\r\n  executable location = \/bin\/ansible\r\n  python version = 2.7.5 (default, Aug  7 2019, 00:51:29) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]\r\n<\/code><\/pre>\n<h2>\u69cb\u6210\u56f3\u306e\u30a4\u30e1\u30fc\u30b8<\/h2>\n<p>\u6784\u56fe\u5982\u4e0b\u6240\u793a\u3002\u4f7f\u7528molecule\u547d\u4ee4\u751f\u6210docker\u5bb9\u5668\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d198b37434c4406c09835\/12-0.png\" alt=\"molecule.png\" \/><\/div>\n<h2>\u5206\u5b50\u7684\u5b89\u88c5<\/h2>\n<p>\u8bf7\u6309\u7167\u4ee5\u4e0b\u6b65\u9aa4\u5b89\u88c5Molecule\u3002<\/p>\n<pre class=\"post-pre\"><code># yum install -y epel-release\r\n# yum install -y gcc python-pip python-devel openssl-devel libselinux-python\r\n# yum install -y docker        \u203b \u65e2\u306bdokcer \u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u6e08\u307f\u3067\u3042\u308b\u5834\u5408\u3001\u672c\u624b\u9806\u306f\u98db\u3070\u3057\u3066\u304f\u3060\u3055\u3044\r\n# pip install -U pip\r\n# pip install -U setuptools\r\n# pip install molecule docker-py pyparsing PyYAML\r\n<\/code><\/pre>\n<p>\u65e2\u7136Molecule\u5df2\u7ecf\u5b89\u88c5\u5b8c\u6210\u4e86\uff0c\u90a3\u4e48\u6211\u4eec\u6765\u786e\u8ba4\u4e00\u4e0bMolecule\u7684\u7248\u672c\u5427\u3002<\/p>\n<pre class=\"post-pre\"><code># molecule --version\r\nmolecule, version 2.22\r\n<\/code><\/pre>\n<h3>\u6211\u4e2a\u4eba\u8ff7\u4e0a\u7684\u70b9<\/h3>\n<p>\u5728\u4f7f\u7528 Molecule \u65f6\uff0c\u63a8\u8350\u4f7f\u7528 docker \u6216 docker-py \u5176\u4e2d\u4e4b\u4e00\u3002\u5982\u679c\u4e24\u8005\u90fd\u5df2\u5b89\u88c5\uff0c\u5e94\u5148\u5378\u8f7d\uff0c\u518d\u91cd\u65b0\u5b89\u88c5\u5176\u4e2d\u4e4b\u4e00\u3002\u672c\u6b21\u4f7f\u7528 docker-py\u3002<\/p>\n<pre class=\"post-pre\"><code># pip uninstall docker\r\n# pip uninstall docker-py\r\n# pip install docker-py\r\n<\/code><\/pre>\n<h2>\u5173\u4e8e\u672c\u6b21\u6d4b\u8bd5\u7684\u76ee\u6807 playbook\u3002<\/h2>\n<p>\u8fd9\u6b21\u6d4b\u8bd5\u7684\u76ee\u6807Playbook\u662f\u4e4b\u524d\u521b\u5efa\u7684\u7528\u4e8e\u6784\u5efaRedis\u96c6\u7fa4\u7684Playbook\u3002<\/p>\n<ul class=\"post-ul\">Ansible\u3092\u4f7f\u7528\u3057\u3066\u3001CentOS 7\u306bRedis-Cluster\u3092\u69cb\u7bc9\u3059\u308b<\/ul>\n<p>\u521b\u5efa\u4ee5\u4e0b\u7c7b\u4f3c\u7684\u76ee\u5f55\u7ed3\u6784\uff0c\u5e76\u5c06\u4e0a\u8ff0\u94fe\u63a5\u4e2d\u7684playbook\u5185\u5bb9\u63d0\u53d6\u4e3a\u89d2\u8272\u3002<\/p>\n<pre class=\"post-pre\"><code># tree -r \/etc\/ansible\/roles\/\r\n\/etc\/ansible\/roles\/\r\n\u251c\u2500\u2500 redis-cluster\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 start_redis_server\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 tasks\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u2514\u2500\u2500 main.yml\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 setup_redis_conf\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 tasks\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u2514\u2500\u2500 main.yml\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 install_redis\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 tasks\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u2514\u2500\u2500 main.yml\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 create_redis_user\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 tasks\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u2514\u2500\u2500 main.yml\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 create_redis_group\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 tasks\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u2514\u2500\u2500 main.yml\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 create_redis_config_directories\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 tasks\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u2514\u2500\u2500 main.yml\r\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 copy_redis_conf\r\n\u2502\u00a0\u00a0     \u2514\u2500\u2500 tasks\r\n\u2502\u00a0\u00a0         \u2514\u2500\u2500 main.yml\r\n\u2514\u2500\u2500 common\r\n    \u2514\u2500\u2500 install_list_of_packages\r\n        \u2514\u2500\u2500 tasks\r\n            \u2514\u2500\u2500 main.yml\r\n<\/code><\/pre>\n<p>\u6839\u636e\u6b64\uff0c\u6211\u4eec\u5c06\u521b\u5efa\u4f7f\u7528\u4ee5\u4e0b\u7c7b\u578b\u89d2\u8272\u7684playbook\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">deploy Redis-Cluster<\/span>\r\n  <span class=\"na\">hosts<\/span><span class=\"pi\">:<\/span> <span class=\"s\">localhost<\/span>\r\n  <span class=\"na\">vars<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">ansible_become<\/span><span class=\"pi\">:<\/span> <span class=\"s\">yes<\/span>\r\n    <span class=\"na\">install_list_of_packages<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">epel-release<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">http:\/\/rpms.famillecollet.com\/enterprise\/remi-release-7.rpm<\/span>\r\n    <span class=\"na\">redis_port_number<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"m\">7000<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"m\">7001<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"m\">7002<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"m\">7003<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"m\">7004<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"m\">7005<\/span>\r\n  <span class=\"na\">roles<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"pi\">-<\/span> <span class=\"s\">install_list_of_packages<\/span>\r\n    <span class=\"pi\">-<\/span> <span class=\"s\">install_redis<\/span>\r\n    <span class=\"pi\">-<\/span> <span class=\"s\">create_redis_group<\/span>\r\n    <span class=\"pi\">-<\/span> <span class=\"s\">create_redis_user<\/span>\r\n    <span class=\"pi\">-<\/span> <span class=\"s\">create_redis_config_directories<\/span>\r\n    <span class=\"pi\">-<\/span> <span class=\"s\">copy_redis_conf<\/span>\r\n    <span class=\"pi\">-<\/span> <span class=\"s\">setup_redis_conf<\/span>\r\n    <span class=\"pi\">-<\/span> <span class=\"s\">start_redis_server<\/span>\r\n<\/code><\/pre>\n<p>\u5728\u67e5\u770b\u88ab\u79f0\u4e3a playbook \u7684\u89d2\u8272\u65f6\uff0c\u987a\u4fbf\u4f7f\u7528 ansible-lint \u8fdb\u884c\u9759\u6001\u5206\u6790\u3002<\/p>\n<pre class=\"post-pre\"><code># cd \/etc\/ansible\/playbook\r\n# ansible-lint deploy_redis_cluster.yml -v\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code>Examining deploy_redis_cluster.yml of type playbook\r\nExamining ..\/roles\/common\/install_list_of_packages\/tasks\/main.yml of type tasks\r\nExamining ..\/roles\/redis-cluster\/install_redis\/tasks\/main.yml of type tasks\r\nExamining ..\/roles\/redis-cluster\/create_redis_group\/tasks\/main.yml of type tasks\r\nExamining ..\/roles\/redis-cluster\/create_redis_user\/tasks\/main.yml of type tasks\r\nExamining ..\/roles\/redis-cluster\/create_redis_config_directories\/tasks\/main.yml of type tasks\r\nExamining ..\/roles\/redis-cluster\/copy_redis_conf\/tasks\/main.yml of type tasks\r\nExamining ..\/roles\/redis-cluster\/setup_redis_conf\/tasks\/main.yml of type tasks\r\nExamining ..\/roles\/redis-cluster\/start_redis_server\/tasks\/main.yml of type tasks\r\n[301] Commands should not change things if nothing needs doing\r\n..\/roles\/redis-cluster\/start_redis_server\/tasks\/main.yml:2\r\nTask\/Handler: Start Redis-Server\r\n\r\n<\/code><\/pre>\n<h2>\u5206\u5b50\u7684\u6d4b\u8bd5\u51c6\u5907<\/h2>\n<h3>\u6267\u884c\u5206\u5b50 init<\/h3>\n<p>\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff0c\u521b\u5efamolecule\u76ee\u5f55\u3002<\/p>\n<pre class=\"post-pre\"><code># cd \/etc\/ansible\/roles\/redis-cluster\r\n# molecule init scenario -r redis-cluster\r\n--&gt; Initializing new scenario default...\r\nInitialized scenario in \/etc\/ansible\/roles\/redis-cluster\/molecule\/default successfully.\r\n\r\n# ll | grep molecule\r\ndrwxr-xr-x 3 root root 21  2\u6708 12 22:43 molecule\r\n<\/code><\/pre>\n<h3>\u786e\u8ba4Molecule\u7684\u76ee\u5f55\u7ed3\u6784<\/h3>\n<p>\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff0c\u786e\u8ba4 molecule \u76ee\u5f55\u7684\u7ed3\u6784\u3002<\/p>\n<pre class=\"post-pre\"><code># tree -r molecule\/\r\nmolecule\/\r\n\u2514\u2500\u2500 default\r\n    \u251c\u2500\u2500 tests\r\n    \u2502\u00a0\u00a0 \u251c\u2500\u2500 test_default.py\r\n    \u2502\u00a0\u00a0 \u2514\u2500\u2500 __pycache__\r\n    \u2502\u00a0\u00a0     \u2514\u2500\u2500 test_default.cpython-36.pyc\r\n    \u251c\u2500\u2500 playbook.yml\r\n    \u251c\u2500\u2500 molecule.yml\r\n    \u251c\u2500\u2500 INSTALL.rst\r\n    \u2514\u2500\u2500 Dockerfile.j2\r\n<\/code><\/pre>\n<h3>\u5404\u4e2a\u6587\u4ef6\u7684\u8bbe\u7f6e<\/h3>\n<p>\u4e3a\u4e86\u8fd0\u884c Molecule\uff0c\u9700\u8981\u914d\u7f6e\u4ee5\u4e0b\u4e09\u4e2a\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code>molecule\/\r\n\u2514\u2500\u2500 default\r\n    \u251c\u2500\u2500 playbook.yml         # \u691c\u8a3c\u3059\u308bplaybook \u306e\u5185\u5bb9\r\n    \u251c\u2500\u2500 molecule.yml         # molecule \u3092\u5b9f\u884c\u3059\u308b\u969b\u306e\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\r\n    \u2514\u2500\u2500 Dockerfile.j2        # playbook \u306e\u691c\u8a3c\u5bfe\u8c61\u3068\u306a\u308b\u30b3\u30f3\u30c6\u30ca\u8d77\u52d5\u306b\u4f7f\u7528\u3059\u308bdocker \u30a4\u30e1\u30fc\u30b8\u306e\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\r\n<\/code><\/pre>\n<ul class=\"post-ul\">molecule\/default\/Dockerfile.j2<\/ul>\n<pre class=\"post-pre\"><code><span class=\"c\"># Molecule managed<\/span>\r\n\r\n{% if item.registry is defined %}\r\n<span class=\"k\">FROM<\/span><span class=\"s\"> {{ item.registry.url }}\/{{ item.image }}<\/span>\r\n{% else %}\r\n<span class=\"k\">FROM<\/span><span class=\"s\"> {{ item.image }}<\/span>\r\n{% endif %}\r\n\r\n{% if item.env is defined %}\r\n{% for var, value in item.env.items() %}\r\n{% if value %}\r\n<span class=\"k\">ENV<\/span><span class=\"s\"> {{ var }} {{ value }}<\/span>\r\n{% endif %}\r\n{% endfor %}\r\n{% endif %}\r\n\r\n<span class=\"k\">RUN if<\/span> <span class=\"o\">[<\/span> <span class=\"si\">$(<\/span><span class=\"nb\">command<\/span> <span class=\"nt\">-v<\/span> apt-get<span class=\"si\">)<\/span> <span class=\"o\">]<\/span><span class=\"p\">;<\/span> <span class=\"k\">then <\/span>apt-get update <span class=\"o\">&amp;&amp;<\/span> apt-get <span class=\"nb\">install<\/span> <span class=\"nt\">-y<\/span> python <span class=\"nb\">sudo <\/span>bash ca-certificates iproute2 <span class=\"o\">&amp;&amp;<\/span> apt-get clean<span class=\"p\">;<\/span> <span class=\"se\">\\\r\n<\/span>    <span class=\"k\">elif<\/span> <span class=\"o\">[<\/span> <span class=\"si\">$(<\/span><span class=\"nb\">command<\/span> <span class=\"nt\">-v<\/span> dnf<span class=\"si\">)<\/span> <span class=\"o\">]<\/span><span class=\"p\">;<\/span> <span class=\"k\">then <\/span>dnf makecache <span class=\"o\">&amp;&amp;<\/span> dnf <span class=\"nt\">--assumeyes<\/span> <span class=\"nb\">install <\/span>python <span class=\"nb\">sudo <\/span>python-devel python<span class=\"k\">*<\/span><span class=\"nt\">-dnf<\/span> bash iproute <span class=\"o\">&amp;&amp;<\/span> dnf clean all<span class=\"p\">;<\/span> <span class=\"se\">\\\r\n<\/span>    <span class=\"k\">elif<\/span> <span class=\"o\">[<\/span> <span class=\"si\">$(<\/span><span class=\"nb\">command<\/span> <span class=\"nt\">-v<\/span> yum<span class=\"si\">)<\/span> <span class=\"o\">]<\/span><span class=\"p\">;<\/span> <span class=\"k\">then <\/span>yum makecache fast <span class=\"o\">&amp;&amp;<\/span> yum <span class=\"nb\">install<\/span> <span class=\"nt\">-y<\/span> python <span class=\"nb\">sudo <\/span>yum-plugin-ovl bash iproute <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">sed<\/span> <span class=\"nt\">-i<\/span> <span class=\"s1\">'s\/plugins=0\/plugins=1\/g'<\/span> \/etc\/yum.conf <span class=\"o\">&amp;&amp;<\/span> yum clean all<span class=\"p\">;<\/span> <span class=\"se\">\\\r\n<\/span>    <span class=\"k\">elif<\/span> <span class=\"o\">[<\/span> <span class=\"si\">$(<\/span><span class=\"nb\">command<\/span> <span class=\"nt\">-v<\/span> zypper<span class=\"si\">)<\/span> <span class=\"o\">]<\/span><span class=\"p\">;<\/span> <span class=\"k\">then <\/span>zypper refresh <span class=\"o\">&amp;&amp;<\/span> zypper <span class=\"nb\">install<\/span> <span class=\"nt\">-y<\/span> python <span class=\"nb\">sudo <\/span>bash python-xml iproute2 <span class=\"o\">&amp;&amp;<\/span> zypper clean <span class=\"nt\">-a<\/span><span class=\"p\">;<\/span> <span class=\"se\">\\\r\n<\/span>    <span class=\"k\">elif<\/span> <span class=\"o\">[<\/span> <span class=\"si\">$(<\/span><span class=\"nb\">command<\/span> <span class=\"nt\">-v<\/span> apk<span class=\"si\">)<\/span> <span class=\"o\">]<\/span><span class=\"p\">;<\/span> <span class=\"k\">then <\/span>apk update <span class=\"o\">&amp;&amp;<\/span> apk add <span class=\"nt\">--no-cache<\/span> python <span class=\"nb\">sudo <\/span>bash ca-certificates<span class=\"p\">;<\/span> <span class=\"se\">\\\r\n<\/span>    <span class=\"k\">elif<\/span> <span class=\"o\">[<\/span> <span class=\"si\">$(<\/span><span class=\"nb\">command<\/span> <span class=\"nt\">-v<\/span> xbps-install<span class=\"si\">)<\/span> <span class=\"o\">]<\/span><span class=\"p\">;<\/span> <span class=\"k\">then <\/span>xbps-install <span class=\"nt\">-Syu<\/span> <span class=\"o\">&amp;&amp;<\/span> xbps-install <span class=\"nt\">-y<\/span> python <span class=\"nb\">sudo <\/span>bash ca-certificates iproute2 <span class=\"o\">&amp;&amp;<\/span> xbps-remove <span class=\"nt\">-O<\/span><span class=\"p\">;<\/span> <span class=\"k\">fi<\/span>\r\n\r\n<span class=\"k\">CMD<\/span><span class=\"s\"> [\"\/sbin\/init\"]<\/span>\r\n<\/code><\/pre>\n<ul class=\"post-ul\">molecule\/default\/molecule.yml<\/ul>\n<pre class=\"post-pre\"><code><span class=\"nn\">---<\/span>\r\n<span class=\"na\">dependency<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">galaxy<\/span>\r\n<span class=\"na\">driver<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">docker<\/span>\r\n<span class=\"na\">lint<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">yamllint<\/span>\r\n<span class=\"na\">platforms<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">redis-cluster-instance<\/span>            <span class=\"c1\"># \u30b3\u30f3\u30c6\u30ca\u306e\u540d\u524d<\/span>\r\n    <span class=\"na\">image<\/span><span class=\"pi\">:<\/span> <span class=\"s\">centos:7<\/span>                         <span class=\"c1\"># \u4f7f\u7528\u3059\u308b\u30a4\u30e1\u30fc\u30b8<\/span>\r\n    <span class=\"na\">pull<\/span><span class=\"pi\">:<\/span> <span class=\"s\">False<\/span>\r\n    <span class=\"na\">command<\/span><span class=\"pi\">:<\/span> <span class=\"s\">\/sbin\/init<\/span>                     <span class=\"c1\"># systemd \u3092\u5fc5\u8981\u3068\u3059\u308b\u5834\u5408\u306b\u5fc5\u8981\u306a\u30aa\u30d7\u30b7\u30e7\u30f3<\/span>\r\n    <span class=\"na\">tmps<\/span><span class=\"pi\">:<\/span>                                   <span class=\"c1\"># systemd \u3092\u5fc5\u8981\u3068\u3059\u308b\u5834\u5408\u306b\u5fc5\u8981\u306a\u30aa\u30d7\u30b7\u30e7\u30f3<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">\/run<\/span>                                <span class=\"c1\"># systemd \u3092\u5fc5\u8981\u3068\u3059\u308b\u5834\u5408\u306b\u5fc5\u8981\u306a\u30aa\u30d7\u30b7\u30e7\u30f3<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">\/tmp<\/span>                                <span class=\"c1\"># systemd \u3092\u5fc5\u8981\u3068\u3059\u308b\u5834\u5408\u306b\u5fc5\u8981\u306a\u30aa\u30d7\u30b7\u30e7\u30f3<\/span>\r\n    <span class=\"na\">volumes<\/span><span class=\"pi\">:<\/span>                                <span class=\"c1\"># systemd \u3092\u5fc5\u8981\u3068\u3059\u308b\u5834\u5408\u306b\u5fc5\u8981\u306a\u30aa\u30d7\u30b7\u30e7\u30f3<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">\/sys\/fs\/cgroup:\/sys\/fs\/cgroup:ro<\/span>    <span class=\"c1\"># systemd \u3092\u5fc5\u8981\u3068\u3059\u308b\u5834\u5408\u306b\u5fc5\u8981\u306a\u30aa\u30d7\u30b7\u30e7\u30f3<\/span>\r\n<span class=\"na\">provisioner<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">ansible<\/span>\r\n  <span class=\"na\">log<\/span><span class=\"pi\">:<\/span> <span class=\"no\">true<\/span>\r\n  <span class=\"na\">config_options<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">defaults<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"na\">stdout_callback<\/span><span class=\"pi\">:<\/span> <span class=\"s\">yaml<\/span>\r\n      <span class=\"na\">bin_ansible_callbacks<\/span><span class=\"pi\">:<\/span> <span class=\"no\">true<\/span>\r\n  <span class=\"na\">lint<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">ansible-lint<\/span>\r\n<span class=\"na\">verifier<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">testinfra<\/span>\r\n  <span class=\"na\">lint<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">flake8<\/span>\r\n<\/code><\/pre>\n<ul class=\"post-ul\">molecule\/default\/playbook.yml<\/ul>\n<pre class=\"post-pre\"><code><span class=\"nn\">---<\/span>\r\n<span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Converge<\/span>\r\n  <span class=\"na\">hosts<\/span><span class=\"pi\">:<\/span> <span class=\"s\">all<\/span>\r\n  <span class=\"na\">vars<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">ansible_become<\/span><span class=\"pi\">:<\/span> <span class=\"s\">yes<\/span>\r\n    <span class=\"na\">install_list_of_packages<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">epel-release<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">http:\/\/rpms.famillecollet.com\/enterprise\/remi-release-7.rpm<\/span>\r\n    <span class=\"na\">redis_port_number<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"m\">7000<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"m\">7001<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"m\">7002<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"m\">7003<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"m\">7004<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"m\">7005<\/span>\r\n  <span class=\"na\">roles<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"pi\">-<\/span> <span class=\"s\">..\/roles\/common\/install_list_of_packages<\/span>\r\n    <span class=\"pi\">-<\/span> <span class=\"s\">..\/roles\/redis-cluster\/install_redis<\/span>\r\n    <span class=\"pi\">-<\/span> <span class=\"s\">..\/roles\/redis-cluster\/create_redis_group<\/span>\r\n    <span class=\"pi\">-<\/span> <span class=\"s\">..\/roles\/redis-cluster\/create_redis_user<\/span>\r\n    <span class=\"pi\">-<\/span> <span class=\"s\">..\/roles\/redis-cluster\/create_redis_config_directories<\/span>\r\n    <span class=\"pi\">-<\/span> <span class=\"s\">..\/roles\/redis-cluster\/copy_redis_conf<\/span>\r\n    <span class=\"pi\">-<\/span> <span class=\"s\">..\/roles\/redis-cluster\/setup_redis_conf<\/span>\r\n    <span class=\"pi\">-<\/span> <span class=\"s\">..\/roles\/redis-cluster\/start_redis_server<\/span>\r\n<\/code><\/pre>\n<h3>\u521b\u5efa\u4e00\u4e2a\u7528\u4e8e\u5206\u5b50\u6d4b\u8bd5\u7684\u73af\u5883\u3002<\/h3>\n<p>\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff0c\u521b\u5efa\u7528\u4e8eMolecule\u6d4b\u8bd5\u7684Docker\u5bb9\u5668\u3002<\/p>\n<pre class=\"post-pre\"><code># molecule create\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code>--&gt; Validating schema \/etc\/ansible\/roles\/redis-cluster\/molecule\/default\/molecule.yml.\r\nValidation completed successfully.\r\n--&gt; Test matrix\r\n\r\n\u2514\u2500\u2500 default\r\n    \u251c\u2500\u2500 dependency\r\n    \u251c\u2500\u2500 create\r\n    \u2514\u2500\u2500 prepare\r\n\r\n--&gt; Scenario: 'default'\r\n--&gt; Action: 'dependency'\r\nSkipping, missing the requirements file.\r\n--&gt; Scenario: 'default'\r\n--&gt; Action: 'create'\r\n--&gt; Sanity checks: 'docker'\r\n\r\n    PLAY [Create] ******************************************************************\r\n\r\n    TASK [Log into a Docker registry] **********************************************\r\n    skipping: [localhost] =&gt; (item={'pull': False, 'command': u'\/sbin\/init', 'name': u'redis-cluster-instance', 'volumes': [u'\/sys\/fs\/cgroup:\/sys\/fs\/cgroup:ro'], 'image': u'centos:7', 'tmps': [u'\/run', u'\/tmp']}) \r\n\r\n    TASK [Create Dockerfiles from image names] *************************************\r\n    changed: [localhost] =&gt; (item={'pull': False, 'command': u'\/sbin\/init', 'name': u'redis-cluster-instance', 'volumes': [u'\/sys\/fs\/cgroup:\/sys\/fs\/cgroup:ro'], 'image': u'centos:7', 'tmps': [u'\/run', u'\/tmp']})\r\n\r\n    TASK [Determine which docker image info module to use] *************************\r\n    ok: [localhost]\r\n\r\n    TASK [Discover local Docker images] ********************************************\r\n    ok: [localhost] =&gt; (item={u'changed': True, u'uid': 0, u'dest': u'\/root\/.cache\/molecule\/redis-cluster\/default\/Dockerfile_centos_7', u'owner': u'root', 'diff': [], u'size': 914, u'src': u'\/root\/.ansible\/tmp\/ansible-tmp-1581521805.53-277333827862458\/source', 'ansible_loop_var': u'item', u'group': u'root', 'item': {'pull': False, 'command': u'\/sbin\/init', 'name': u'redis-cluster-instance', 'volumes': [u'\/sys\/fs\/cgroup:\/sys\/fs\/cgroup:ro'], 'image': u'centos:7', 'tmps': [u'\/run', u'\/tmp']}, u'checksum': u'af0854dd479325baac9797c25a580b67bf4faa0e', u'md5sum': u'89ab4f11c078a9f793fa4f94a495193d', 'failed': False, u'state': u'file', u'gid': 0, u'mode': u'0644', u'invocation': {u'module_args': {u'directory_mode': None, u'force': True, u'remote_src': None, u'dest': u'\/root\/.cache\/molecule\/redis-cluster\/default\/Dockerfile_centos_7', u'selevel': None, u'_original_basename': u'Dockerfile.j2', u'delimiter': None, u'regexp': None, u'owner': None, u'follow': False, u'validate': None, u'local_follow': None, u'src': u'\/root\/.ansible\/tmp\/ansible-tmp-1581521805.53-277333827862458\/source', u'group': None, u'unsafe_writes': None, u'checksum': u'af0854dd479325baac9797c25a580b67bf4faa0e', u'seuser': None, u'serole': None, u'content': None, u'setype': None, u'mode': None, u'attributes': None, u'backup': False}}})\r\n\r\n    TASK [Build an Ansible compatible image (new)] *********************************\r\n    ok: [localhost] =&gt; (item=molecule_local\/centos:7)\r\n\r\n    TASK [Build an Ansible compatible image (old)] *********************************\r\n    skipping: [localhost] =&gt; (item=molecule_local\/centos:7) \r\n\r\n    TASK [Create docker network(s)] ************************************************\r\n\r\n    TASK [Determine the CMD directives] ********************************************\r\n    ok: [localhost] =&gt; (item={'pull': False, 'command': u'\/sbin\/init', 'name': u'redis-cluster-instance', 'volumes': [u'\/sys\/fs\/cgroup:\/sys\/fs\/cgroup:ro'], 'image': u'centos:7', 'tmps': [u'\/run', u'\/tmp']})\r\n\r\n    TASK [Create molecule instance(s)] *********************************************\r\n    changed: [localhost] =&gt; (item=redis-cluster-instance)\r\n\r\n    TASK [Wait for instance(s) creation to complete] *******************************\r\n    FAILED - RETRYING: Wait for instance(s) creation to complete (300 retries left).\r\n    changed: [localhost] =&gt; (item={'ansible_loop_var': u'item', u'ansible_job_id': u'429823489509.31439', 'item': {'pull': False, 'command': u'\/sbin\/init', 'name': u'redis-cluster-instance', 'volumes': [u'\/sys\/fs\/cgroup:\/sys\/fs\/cgroup:ro'], 'image': u'centos:7', 'tmps': [u'\/run', u'\/tmp']}, u'started': 1, 'changed': True, 'failed': False, u'finished': 0, u'results_file': u'\/root\/.ansible_async\/429823489509.31439'})\r\n\r\n    PLAY RECAP *********************************************************************\r\n    localhost                  : ok=7    changed=3    unreachable=0    failed=0    skipped=3    rescued=0    ignored=0\r\n\r\n--&gt; Scenario: 'default'\r\n--&gt; Action: 'prepare'\r\nSkipping, prepare playbook not configured.\r\n<\/code><\/pre>\n<p>\u68c0\u67e5\u662f\u5426\u751f\u6210\u4e86Docker\u5bb9\u5668\u3002<\/p>\n<pre class=\"post-pre\"><code># docker ps -a | grep molecule\r\nCONTAINER ID        IMAGE                     COMMAND       CREATED             STATUS                   PORTS        NAMES\r\n76b96d17d540        molecule_local\/centos:7   \"\/sbin\/init\"  About a minute ago  Up About a minute                     moleredis-cluster-instance\r\n<\/code><\/pre>\n<h3>\u5206\u5b50\u9759\u6001\u5206\u6790<\/h3>\n<p>\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff0c\u4f7f\u7528Molecule\u8fdb\u884c\u89d2\u8272\u7684\u9759\u6001\u5206\u6790\u3002<\/p>\n<pre class=\"post-pre\"><code># molecule lint\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code>--&gt; Validating schema \/etc\/ansible\/roles\/redis-cluster\/molecule\/default\/molecule.yml.\r\nValidation completed successfully.\r\n--&gt; Test matrix\r\n\r\n\u2514\u2500\u2500 default\r\n    \u2514\u2500\u2500 lint\r\n\r\n--&gt; Scenario: 'default'\r\n--&gt; Action: 'lint'\r\n--&gt; Executing Yamllint on files found in \/etc\/ansible\/roles\/redis-cluster\/...\r\nLint completed successfully.\r\n--&gt; Executing Flake8 on files found in \/etc\/ansible\/roles\/redis-cluster\/molecule\/default\/tests\/...\r\nLint completed successfully.\r\n--&gt; Executing Ansible Lint on \/etc\/ansible\/roles\/redis-cluster\/molecule\/default\/playbook.yml...\r\n    [301] Commands should not change things if nothing needs doing\r\n    start_redis_server\/tasks\/main.yml:2\r\n    Task\/Handler: Start Redis-Server\r\n\r\n<\/code><\/pre>\n<h2>\u901a\u8fc7\u5206\u5b50\u8fdb\u884c\u6d4b\u8bd5\u7684\u6267\u884c<\/h2>\n<p>\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff0c\u5bf9docker\u5bb9\u5668\u8fdb\u884cplaybook\u9a8c\u8bc1\u3002<\/p>\n<pre class=\"post-pre\"><code># molecule converge\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code>--&gt; Validating schema \/etc\/ansible\/roles\/redis-cluster\/molecule\/default\/molecule.yml.\r\nValidation completed successfully.\r\n--&gt; Test matrix\r\n\r\n\u2514\u2500\u2500 default\r\n    \u251c\u2500\u2500 dependency\r\n    \u251c\u2500\u2500 create\r\n    \u251c\u2500\u2500 prepare\r\n    \u2514\u2500\u2500 converge\r\n\r\n--&gt; Scenario: 'default'\r\n--&gt; Action: 'dependency'\r\nSkipping, missing the requirements file.\r\n--&gt; Scenario: 'default'\r\n--&gt; Action: 'create'\r\nSkipping, instances already created.\r\n--&gt; Scenario: 'default'\r\n--&gt; Action: 'prepare'\r\nSkipping, prepare playbook not configured.\r\n--&gt; Scenario: 'default'\r\n--&gt; Action: 'converge'\r\n\r\n    PLAY [Converge] ****************************************************************\r\n\r\n    TASK [Gathering Facts] *********************************************************\r\n    ok: [redis-cluster-instance]\r\n\r\n    TASK [..\/roles\/common\/install_list_of_packages : Install a list of packages] ***\r\n    changed: [redis-cluster-instance]\r\n\r\n    TASK [..\/roles\/redis-cluster\/install_redis : Install redis] ********************\r\n    changed: [redis-cluster-instance]\r\n\r\n    TASK [..\/roles\/redis-cluster\/create_redis_group : Ensure group \"redis\" exists] ***\r\n    ok: [redis-cluster-instance]\r\n\r\n    TASK [..\/roles\/redis-cluster\/create_redis_user : Create redis user] ************\r\n    changed: [redis-cluster-instance]\r\n\r\n    TASK [..\/roles\/redis-cluster\/create_redis_config_directories : mkdir redis config directory] ***\r\n    changed: [redis-cluster-instance] =&gt; (item=7000)\r\n    changed: [redis-cluster-instance] =&gt; (item=7001)\r\n    changed: [redis-cluster-instance] =&gt; (item=7002)\r\n    changed: [redis-cluster-instance] =&gt; (item=7003)\r\n    changed: [redis-cluster-instance] =&gt; (item=7004)\r\n    changed: [redis-cluster-instance] =&gt; (item=7005)\r\n\r\n    TASK [..\/roles\/redis-cluster\/copy_redis_conf : Copy redis.conf] ****************\r\n    changed: [redis-cluster-instance] =&gt; (item=7000)\r\n    changed: [redis-cluster-instance] =&gt; (item=7001)\r\n    changed: [redis-cluster-instance] =&gt; (item=7002)\r\n    changed: [redis-cluster-instance] =&gt; (item=7003)\r\n    changed: [redis-cluster-instance] =&gt; (item=7004)\r\n    changed: [redis-cluster-instance] =&gt; (item=7005)\r\n\r\n    TASK [..\/roles\/redis-cluster\/setup_redis_conf : Setting bind IPv4Address] ******\r\n    changed: [redis-cluster-instance] =&gt; (item=7000)\r\n    changed: [redis-cluster-instance] =&gt; (item=7001)\r\n    changed: [redis-cluster-instance] =&gt; (item=7002)\r\n    changed: [redis-cluster-instance] =&gt; (item=7003)\r\n    changed: [redis-cluster-instance] =&gt; (item=7004)\r\n    changed: [redis-cluster-instance] =&gt; (item=7005)\r\n\r\n    TASK [..\/roles\/redis-cluster\/setup_redis_conf : Setting port number] ***********\r\n    changed: [redis-cluster-instance] =&gt; (item=7000)\r\n    changed: [redis-cluster-instance] =&gt; (item=7001)\r\n    changed: [redis-cluster-instance] =&gt; (item=7002)\r\n    changed: [redis-cluster-instance] =&gt; (item=7003)\r\n    changed: [redis-cluster-instance] =&gt; (item=7004)\r\n    changed: [redis-cluster-instance] =&gt; (item=7005)\r\n\r\n    TASK [..\/roles\/redis-cluster\/setup_redis_conf : Setting cluster-enabled] *******\r\n    changed: [redis-cluster-instance] =&gt; (item=7000)\r\n    changed: [redis-cluster-instance] =&gt; (item=7001)\r\n    changed: [redis-cluster-instance] =&gt; (item=7002)\r\n    changed: [redis-cluster-instance] =&gt; (item=7003)\r\n    changed: [redis-cluster-instance] =&gt; (item=7004)\r\n    changed: [redis-cluster-instance] =&gt; (item=7005)\r\n\r\n    TASK [..\/roles\/redis-cluster\/setup_redis_conf : Setting cluster-config-file] ***\r\n    changed: [redis-cluster-instance] =&gt; (item=7000)\r\n    changed: [redis-cluster-instance] =&gt; (item=7001)\r\n    changed: [redis-cluster-instance] =&gt; (item=7002)\r\n    changed: [redis-cluster-instance] =&gt; (item=7003)\r\n    changed: [redis-cluster-instance] =&gt; (item=7004)\r\n    changed: [redis-cluster-instance] =&gt; (item=7005)\r\n\r\n    TASK [..\/roles\/redis-cluster\/setup_redis_conf : Setting cluster-node-timeout] ***\r\n    changed: [redis-cluster-instance] =&gt; (item=7000)\r\n    changed: [redis-cluster-instance] =&gt; (item=7001)\r\n    changed: [redis-cluster-instance] =&gt; (item=7002)\r\n    changed: [redis-cluster-instance] =&gt; (item=7003)\r\n    changed: [redis-cluster-instance] =&gt; (item=7004)\r\n    changed: [redis-cluster-instance] =&gt; (item=7005)\r\n\r\n    TASK [..\/roles\/redis-cluster\/setup_redis_conf : Setting appendonly] ************\r\n    changed: [redis-cluster-instance] =&gt; (item=7000)\r\n    changed: [redis-cluster-instance] =&gt; (item=7001)\r\n    changed: [redis-cluster-instance] =&gt; (item=7002)\r\n    changed: [redis-cluster-instance] =&gt; (item=7003)\r\n    changed: [redis-cluster-instance] =&gt; (item=7004)\r\n    changed: [redis-cluster-instance] =&gt; (item=7005)\r\n\r\n    TASK [..\/roles\/redis-cluster\/setup_redis_conf : Setting logfile] ***************\r\n    changed: [redis-cluster-instance] =&gt; (item=7000)\r\n    changed: [redis-cluster-instance] =&gt; (item=7001)\r\n    changed: [redis-cluster-instance] =&gt; (item=7002)\r\n    changed: [redis-cluster-instance] =&gt; (item=7003)\r\n    changed: [redis-cluster-instance] =&gt; (item=7004)\r\n    changed: [redis-cluster-instance] =&gt; (item=7005)\r\n\r\n    TASK [..\/roles\/redis-cluster\/start_redis_server : Start Redis-Server] **********\r\n    changed: [redis-cluster-instance] =&gt; (item=7000)\r\n    changed: [redis-cluster-instance] =&gt; (item=7001)\r\n    changed: [redis-cluster-instance] =&gt; (item=7002)\r\n    changed: [redis-cluster-instance] =&gt; (item=7003)\r\n    changed: [redis-cluster-instance] =&gt; (item=7004)\r\n    changed: [redis-cluster-instance] =&gt; (item=7005)\r\n\r\n    PLAY RECAP *********************************************************************\r\n    redis-cluster-instance     : ok=15   changed=13   unreachable=0    failed=0    skipped=0    rescued=0    ignored=0\r\n<\/code><\/pre>\n<p>\u4e00\u5207\u90fd\u6ca1\u95ee\u9898\uff0cplaybook\u5df2\u7ecf\u5b8c\u6210\u3002\u8bf7\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\u767b\u5f55\u5230docker\u5bb9\u5668\u4e2d\u3002<\/p>\n<pre class=\"post-pre\"><code># molecule login\r\n--&gt; Validating schema \/etc\/ansible\/roles\/redis-cluster\/molecule\/default\/molecule.yml.\r\nValidation completed successfully.\r\n<\/code><\/pre>\n<h3>\u67e5\u8be2 Redis \u7248\u672c\u3002<\/h3>\n<p>\u8ba9\u6211\u4eec\u67e5\u770b\u5b89\u88c5\u5728Docker\u5bb9\u5668\u4e2d\u7684Redis\u7248\u672c\u3002<\/p>\n<pre class=\"post-pre\"><code>[root@redis-cluster-instance \/]# redis-cli --version\r\nredis-cli 5.0.7\r\n[root@redis-cluster-instance \/]# redis-server --version\r\nRedis server v=5.0.7 sha=00000000:0 malloc=jemalloc-5.1.0 bits=64 build=91145edf25c40cd7\r\n<\/code><\/pre>\n<h3>\u642d\u5efaRedis-Cluster<\/h3>\n<p>\u90a3\u4e48\uff0c\u8ba9\u6211\u4eec\u5728docker\u5bb9\u5668\u4e2d\u8fd0\u884c\u4ee5\u4e0b\u547d\u4ee4\uff0c\u6784\u5efaRedis-Cluster\u3002<\/p>\n<pre class=\"post-pre\"><code>[root@redis-cluster-instance \/]# redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code>&gt;&gt;&gt; Performing hash slots allocation on 6 nodes...\r\nMaster[0] -&gt; Slots 0 - 5460\r\nMaster[1] -&gt; Slots 5461 - 10922\r\nMaster[2] -&gt; Slots 10923 - 16383\r\nAdding replica 127.0.0.1:7004 to 127.0.0.1:7000\r\nAdding replica 127.0.0.1:7005 to 127.0.0.1:7001\r\nAdding replica 127.0.0.1:7003 to 127.0.0.1:7002\r\n&gt;&gt;&gt; Trying to optimize slaves allocation for anti-affinity\r\n[WARNING] Some slaves are in the same host as their master\r\nM: 7bc5f80dd90213eeb3361571ea3dbbb3291e97d8 127.0.0.1:7000\r\n   slots:[0-5460] (5461 slots) master\r\nM: d59fe4d92511e504ba5cf7f9001cb8ea7def6b7f 127.0.0.1:7001\r\n   slots:[5461-10922] (5462 slots) master\r\nM: d53abfb685e3592a40affcc763a39036f3027103 127.0.0.1:7002\r\n   slots:[10923-16383] (5461 slots) master\r\nS: 906638361f1c40cb349d0a4f507cadb497a7d02a 127.0.0.1:7003\r\n   replicates d53abfb685e3592a40affcc763a39036f3027103\r\nS: ebb4b50135a4ea7c0ad5061cc169d1a14f760fb1 127.0.0.1:7004\r\n   replicates 7bc5f80dd90213eeb3361571ea3dbbb3291e97d8\r\nS: 483c521c5a2b10d23f7335d57d960c274645f2b5 127.0.0.1:7005\r\n   replicates d59fe4d92511e504ba5cf7f9001cb8ea7def6b7f\r\nCan I set the above configuration? (type 'yes' to accept): yes\r\n&gt;&gt;&gt; Nodes configuration updated\r\n&gt;&gt;&gt; Assign a different config epoch to each node\r\n&gt;&gt;&gt; Sending CLUSTER MEET messages to join the cluster\r\nWaiting for the cluster to join\r\n..\r\n&gt;&gt;&gt; Performing Cluster Check (using node 127.0.0.1:7000)\r\nM: 7bc5f80dd90213eeb3361571ea3dbbb3291e97d8 127.0.0.1:7000\r\n   slots:[0-5460] (5461 slots) master\r\n   1 additional replica(s)\r\nM: d53abfb685e3592a40affcc763a39036f3027103 127.0.0.1:7002\r\n   slots:[10923-16383] (5461 slots) master\r\n   1 additional replica(s)\r\nS: 483c521c5a2b10d23f7335d57d960c274645f2b5 127.0.0.1:7005\r\n   slots: (0 slots) slave\r\n   replicates d59fe4d92511e504ba5cf7f9001cb8ea7def6b7f\r\nS: ebb4b50135a4ea7c0ad5061cc169d1a14f760fb1 127.0.0.1:7004\r\n   slots: (0 slots) slave\r\n   replicates 7bc5f80dd90213eeb3361571ea3dbbb3291e97d8\r\nM: d59fe4d92511e504ba5cf7f9001cb8ea7def6b7f 127.0.0.1:7001\r\n   slots:[5461-10922] (5462 slots) master\r\n   1 additional replica(s)\r\nS: 906638361f1c40cb349d0a4f507cadb497a7d02a 127.0.0.1:7003\r\n   slots: (0 slots) slave\r\n   replicates d53abfb685e3592a40affcc763a39036f3027103\r\n[OK] All nodes agree about slots configuration.\r\n&gt;&gt;&gt; Check for open slots...\r\n&gt;&gt;&gt; Check slots coverage...\r\n[OK] All 16384 slots covered.\r\n<\/code><\/pre>\n<h3>Redis-Cluster\u7684\u72b6\u6001\u67e5\u8be2<\/h3>\n<p>\u8ba9\u6211\u4eec\u6765\u68c0\u67e5\u4e00\u4e0b\u5728Docker\u5bb9\u5668\u4e2d\u6784\u5efa\u7684Redis-Cluster\u7684\u72b6\u6001\u3002<\/p>\n<pre class=\"post-pre\"><code>[root@redis-cluster-instance \/]# redis-cli -p 7000 cluster nodes\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code>d53abfb685e3592a40affcc763a39036f3027103 127.0.0.1:7002@17002 master - 0 1581523028526 3 connected 10923-16383\r\n483c521c5a2b10d23f7335d57d960c274645f2b5 127.0.0.1:7005@17005 slave d59fe4d92511e504ba5cf7f9001cb8ea7def6b7f 0 1581523028316 6 connected\r\nebb4b50135a4ea7c0ad5061cc169d1a14f760fb1 127.0.0.1:7004@17004 slave 7bc5f80dd90213eeb3361571ea3dbbb3291e97d8 0 1581523028113 5 connected\r\nd59fe4d92511e504ba5cf7f9001cb8ea7def6b7f 127.0.0.1:7001@17001 master - 0 1581523026273 2 connected 5461-10922\r\n906638361f1c40cb349d0a4f507cadb497a7d02a 127.0.0.1:7003@17003 slave d53abfb685e3592a40affcc763a39036f3027103 0 1581523028000 4 connected\r\n7bc5f80dd90213eeb3361571ea3dbbb3291e97d8 127.0.0.1:7000@17000 myself,master - 0 1581523026000 1 connected 0-5460\r\n<\/code><\/pre>\n<h2>\u522a\u9664\u7528\u65bc\u5206\u5b50\u7684\u6e2c\u8a66\u74b0\u5883\u3002<\/h2>\n<p>\u6267\u884c\u4e0b\u9762\u7684\u547d\u4ee4\uff0c\u5220\u9664\u7528\u4e8eMolecule\u6d4b\u8bd5\u7684Docker\u5bb9\u5668\u3002<\/p>\n<pre class=\"post-pre\"><code>[root@redis-cluster-instance \/]# exit\r\nexit\r\n# molecule destroy\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code>--&gt; Validating schema \/etc\/ansible\/roles\/redis-cluster\/molecule\/default\/molecule.yml.\r\nValidation completed successfully.\r\n--&gt; Test matrix\r\n\r\n\u2514\u2500\u2500 default\r\n    \u251c\u2500\u2500 dependency\r\n    \u251c\u2500\u2500 cleanup\r\n    \u2514\u2500\u2500 destroy\r\n\r\n--&gt; Scenario: 'default'\r\n--&gt; Action: 'dependency'\r\nSkipping, missing the requirements file.\r\n--&gt; Scenario: 'default'\r\n--&gt; Action: 'cleanup'\r\nSkipping, cleanup playbook not configured.\r\n--&gt; Scenario: 'default'\r\n--&gt; Action: 'destroy'\r\n\r\n    PLAY [Destroy] *****************************************************************\r\n\r\n    TASK [Destroy molecule instance(s)] ********************************************\r\n    changed: [localhost] =&gt; (item=redis-cluster-instance)\r\n\r\n    TASK [Wait for instance(s) deletion to complete] *******************************\r\n    changed: [localhost] =&gt; (item={'ansible_loop_var': u'item', u'ansible_job_id': u'412030201772.27418', 'item': {'pull': False, 'command': u'\/sbin\/init', 'name': u'redis-cluster-instance', 'volumes': [u'\/sys\/fs\/cgroup:\/sys\/fs\/cgroup:ro'], 'image': u'centos:7', 'tmps': [u'\/run', u'\/tmp']}, u'started': 1, 'changed': True, 'failed': False, u'finished': 0, u'results_file': u'\/root\/.ansible_async\/412030201772.27418'})\r\n\r\n    TASK [Delete docker network(s)] ************************************************\r\n\r\n    PLAY RECAP *********************************************************************\r\n    localhost                  : ok=2    changed=2    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0\r\n\r\n--&gt; Pruning extra files from scenario ephemeral directory\r\n<\/code><\/pre>\n<p>\u68c0\u67e5Docker\u5bb9\u5668\u662f\u5426\u88ab\u5220\u9664\u3002<\/p>\n<pre class=\"post-pre\"><code># docker ps -a | grep molecule\r\n# \r\n<\/code><\/pre>\n<h2>\u603b\u7ed3<\/h2>\n<p>\u4f7f\u7528Molecule\uff0c\u6211\u4eec\u80fd\u591f\u5bf9\u6784\u5efaRedis-Cluster\u7684playbook\u8fdb\u884c\u9759\u6001\u5206\u6790\u548c\u89d2\u8272\u6d4b\u8bd5\u3002<\/p>\n<p>\u4f7f\u7528Molecule\uff0c\u6211\u5f88\u9ad8\u5174\u80fd\u591f\u5728\u4e0d\u6c61\u67d3\u65b0\u521b\u5efa\u7684\u5b9e\u4f8b\u6216\u865a\u62df\u673a\u7684\u60c5\u51b5\u4e0b\u8fdb\u884cplaybook\u7684\u8bd5\u9a8c\u548c\u9519\u8bef\u3002\u5982\u679c\u5931\u8d25\u4e86\uff0c\u53ef\u4ee5\u901a\u8fc7\u5220\u9664\u548c\u91cd\u65b0\u521b\u5efa\u5bb9\u5668\uff0c\u5728\u5168\u65b0\u7684\u72b6\u6001\u4e0b\u8fdb\u884c\u9a8c\u8bc1\u3002\u4e0b\u4e00\u6b65\uff0c\u6211\u60f3\u5c06GitLab Runner\u4e0eMolecule\u7ed3\u5408\u8d77\u6765\uff0c\u5b9e\u73b0playbook\u7684CI\/CD\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002\u901a\u8fc7\u8bbe\u7f6e\u8ba1\u5212\u4efb\u52a1\uff0c\u6bcf\u5929\u5348\u591c\u90fd\u53ef\u4ee5\u8fdb\u884c\u6d4b\u8bd5\uff0c\u4e0d\u518d\u4f1a\u5bf9\u6d4b\u8bd5\u65f6\u95f4\u4ea7\u751f\u56f0\u60d1\u3002\u6211\u8ba4\u4e3a\u5b9e\u73b0\u7c7b\u4f3c\u4e0b\u9762URL\u4e2d\u7684\u72b6\u6001\u4f1a\u66f4\u597d\u3002<\/p>\n<ul class=\"post-ul\">ANSIBLE TOWER + GITLAB + MOLECULE\u3067\u4f5c\u308bCI\/CD\u74b0\u5883<\/ul>\n<h2>\u53c2\u8003\u4e66\u7c4d\u00b7\u53c2\u8003\u7f51\u5740<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Ansible\u69cb\u7bc9\u30fb\u904b\u7528\u30ac\u30a4\u30c9\u30d6\u30c3\u30af\uff08Compass Books\u30b7\u30ea\u30fc\u30ba\uff09 \u30a4\u30f3\u30d5\u30e9\u81ea\u52d5\u5316\u306e\u305f\u3081\u306e\u73fe\u5834\u306e\u30ce\u30a6\u30cf\u30a6<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">SlideShare: Molecule\u5165\u9580<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">molecule \u3067ansible \u306e role \u3068 playbook \u3092\u30c6\u30b9\u30c8\u3059\u308b<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">molecule: Installation<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">molecule: Getting Started Guide<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">molecule: Command Line Reference<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">molecule: Common Molecule Use Cases<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">BACK 2 CODE: Molecule<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Molecule\u3092\u4f7f\u7528\u3057\u3066\u3001Redis-Cluster\u3092\u69cb\u7bc9\u3059\u308bplaybook\u306e\u30c6\u30b9\u30c8\u3092\u884c\u3046 Molecul [&hellip;]<\/p>\n","protected":false},"author":8,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-33805","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u4f7f\u7528Molecule\u8fdb\u884c\u6d4b\u8bd5Redis\u96c6\u7fa4\u6784\u5efa\u7684playbook - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528molecule\u8fdb\u884c\u6d4b\u8bd5redis\u96c6\u7fa4\u6784\u5efa\u7684playbook\u3002\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u4f7f\u7528Molecule\u8fdb\u884c\u6d4b\u8bd5Redis\u96c6\u7fa4\u6784\u5efa\u7684playbook\" \/>\n<meta property=\"og:description\" content=\"Molecule\u3092\u4f7f\u7528\u3057\u3066\u3001Redis-Cluster\u3092\u69cb\u7bc9\u3059\u308bplaybook\u306e\u30c6\u30b9\u30c8\u3092\u884c\u3046 Molecul [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528molecule\u8fdb\u884c\u6d4b\u8bd5redis\u96c6\u7fa4\u6784\u5efa\u7684playbook\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-01-24T02:09:12+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-05-03T19:16:36+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d198b37434c4406c09835\/12-0.png\" \/>\n<meta name=\"author\" content=\"\u96c5, \u609f\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u96c5, \u609f\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8molecule%e8%bf%9b%e8%a1%8c%e6%b5%8b%e8%af%95redis%e9%9b%86%e7%be%a4%e6%9e%84%e5%bb%ba%e7%9a%84playbook%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8molecule%e8%bf%9b%e8%a1%8c%e6%b5%8b%e8%af%95redis%e9%9b%86%e7%be%a4%e6%9e%84%e5%bb%ba%e7%9a%84playbook%e3%80%82\/\",\"name\":\"\u4f7f\u7528Molecule\u8fdb\u884c\u6d4b\u8bd5Redis\u96c6\u7fa4\u6784\u5efa\u7684playbook - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-01-24T02:09:12+00:00\",\"dateModified\":\"2024-05-03T19:16:36+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/f044a4b7fa4ee2701702942002419ca6\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8molecule%e8%bf%9b%e8%a1%8c%e6%b5%8b%e8%af%95redis%e9%9b%86%e7%be%a4%e6%9e%84%e5%bb%ba%e7%9a%84playbook%e3%80%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8molecule%e8%bf%9b%e8%a1%8c%e6%b5%8b%e8%af%95redis%e9%9b%86%e7%be%a4%e6%9e%84%e5%bb%ba%e7%9a%84playbook%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8molecule%e8%bf%9b%e8%a1%8c%e6%b5%8b%e8%af%95redis%e9%9b%86%e7%be%a4%e6%9e%84%e5%bb%ba%e7%9a%84playbook%e3%80%82\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u4f7f\u7528Molecule\u8fdb\u884c\u6d4b\u8bd5Redis\u96c6\u7fa4\u6784\u5efa\u7684playbook\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/f044a4b7fa4ee2701702942002419ca6\",\"name\":\"\u96c5, \u609f\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/e71a913e914f1aad1efc391f92084294bac54bc782acd289638580134cf667a6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/e71a913e914f1aad1efc391f92084294bac54bc782acd289638580134cf667a6?s=96&d=mm&r=g\",\"caption\":\"\u96c5, \u609f\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/yawu\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8molecule%e8%bf%9b%e8%a1%8c%e6%b5%8b%e8%af%95redis%e9%9b%86%e7%be%a4%e6%9e%84%e5%bb%ba%e7%9a%84playbook%e3%80%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u4f7f\u7528Molecule\u8fdb\u884c\u6d4b\u8bd5Redis\u96c6\u7fa4\u6784\u5efa\u7684playbook - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528molecule\u8fdb\u884c\u6d4b\u8bd5redis\u96c6\u7fa4\u6784\u5efa\u7684playbook\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"\u4f7f\u7528Molecule\u8fdb\u884c\u6d4b\u8bd5Redis\u96c6\u7fa4\u6784\u5efa\u7684playbook","og_description":"Molecule\u3092\u4f7f\u7528\u3057\u3066\u3001Redis-Cluster\u3092\u69cb\u7bc9\u3059\u308bplaybook\u306e\u30c6\u30b9\u30c8\u3092\u884c\u3046 Molecul [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528molecule\u8fdb\u884c\u6d4b\u8bd5redis\u96c6\u7fa4\u6784\u5efa\u7684playbook\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-01-24T02:09:12+00:00","article_modified_time":"2024-05-03T19:16:36+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d198b37434c4406c09835\/12-0.png"}],"author":"\u96c5, \u609f","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u96c5, \u609f","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"13 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8molecule%e8%bf%9b%e8%a1%8c%e6%b5%8b%e8%af%95redis%e9%9b%86%e7%be%a4%e6%9e%84%e5%bb%ba%e7%9a%84playbook%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8molecule%e8%bf%9b%e8%a1%8c%e6%b5%8b%e8%af%95redis%e9%9b%86%e7%be%a4%e6%9e%84%e5%bb%ba%e7%9a%84playbook%e3%80%82\/","name":"\u4f7f\u7528Molecule\u8fdb\u884c\u6d4b\u8bd5Redis\u96c6\u7fa4\u6784\u5efa\u7684playbook - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-01-24T02:09:12+00:00","dateModified":"2024-05-03T19:16:36+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/f044a4b7fa4ee2701702942002419ca6"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8molecule%e8%bf%9b%e8%a1%8c%e6%b5%8b%e8%af%95redis%e9%9b%86%e7%be%a4%e6%9e%84%e5%bb%ba%e7%9a%84playbook%e3%80%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8molecule%e8%bf%9b%e8%a1%8c%e6%b5%8b%e8%af%95redis%e9%9b%86%e7%be%a4%e6%9e%84%e5%bb%ba%e7%9a%84playbook%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8molecule%e8%bf%9b%e8%a1%8c%e6%b5%8b%e8%af%95redis%e9%9b%86%e7%be%a4%e6%9e%84%e5%bb%ba%e7%9a%84playbook%e3%80%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u4f7f\u7528Molecule\u8fdb\u884c\u6d4b\u8bd5Redis\u96c6\u7fa4\u6784\u5efa\u7684playbook"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/f044a4b7fa4ee2701702942002419ca6","name":"\u96c5, \u609f","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/e71a913e914f1aad1efc391f92084294bac54bc782acd289638580134cf667a6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e71a913e914f1aad1efc391f92084294bac54bc782acd289638580134cf667a6?s=96&d=mm&r=g","caption":"\u96c5, \u609f"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/yawu\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8molecule%e8%bf%9b%e8%a1%8c%e6%b5%8b%e8%af%95redis%e9%9b%86%e7%be%a4%e6%9e%84%e5%bb%ba%e7%9a%84playbook%e3%80%82\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/33805","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=33805"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/33805\/revisions"}],"predecessor-version":[{"id":95786,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/33805\/revisions\/95786"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=33805"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=33805"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=33805"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}