{"id":29008,"date":"2023-03-12T06:21:09","date_gmt":"2023-08-28T08:15:15","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%81%9a%e4%ba%86%e4%b8%80%e4%b8%aa%e7%94%a8%e4%ba%8e%e8%87%aa%e5%8a%a8%e8%ae%be%e7%bd%aeansible-semaphore%e7%9a%84%e8%84%9a%e6%9c%ac%e3%80%82\/"},"modified":"2025-08-12T11:16:51","modified_gmt":"2025-08-12T03:16:51","slug":"%e6%88%91%e5%81%9a%e4%ba%86%e4%b8%80%e4%b8%aa%e7%94%a8%e4%ba%8e%e8%87%aa%e5%8a%a8%e8%ae%be%e7%bd%aeansible-semaphore%e7%9a%84%e8%84%9a%e6%9c%ac%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%81%9a%e4%ba%86%e4%b8%80%e4%b8%aa%e7%94%a8%e4%ba%8e%e8%87%aa%e5%8a%a8%e8%ae%be%e7%bd%aeansible-semaphore%e7%9a%84%e8%84%9a%e6%9c%ac%e3%80%82\/","title":{"rendered":"\u6211\u505a\u4e86\u4e00\u4e2a\u7528\u4e8e\u81ea\u52a8\u8bbe\u7f6eAnsible Semaphore\u7684\u811a\u672c"},"content":{"rendered":"<h1>\u9996\u5148\u53ef\u80fd\u4f1a\u6709\u5f88\u5c11\u7684\u4eba\u8ba4\u4e3a\u8fd9\u4e2a\u4e1c\u897f\u6709\u7528\uff0c\u4f46\u65e2\u7136\u6211\u5df2\u7ecf\u505a\u4e86\uff0c\u6240\u4ee5\u51b3\u5b9a\u516c\u5f00\u3002<\/p>\n<p>\u5982\u679c\u8fd9\u53ef\u4ee5\u4f5c\u4e3a\u4e00\u4e2aBash\u811a\u672c\u7684\u53c2\u8003\uff0c\u90a3\u5c31\u592a\u597d\u4e86\u3002<\/p>\n<h1>\u8fd0\u7528\u65b9\u5f0f\u5982\u679c\u5728\u547d\u4ee4\u884c\u4e2d\u6309\u7167\u4ee5\u4e0b\u65b9\u5f0f\u6267\u884c\uff0c\u5c06\u4f1a\u5b89\u88c5Anaconda Python\u5230\u7528\u6237\u7684\u4e3b\u76ee\u5f55\uff0c\u5e76\u4e14\u5feb\u901f\u5b8c\u6210Conda\u73af\u5883\u7684\u8bbe\u7f6e\u4ee5\u53caansible\u548cmariadb\u7b49\u914d\u7f6e\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>bash Ansible-Semaphore-Setup.sh <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--fullname<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"Goichi Iisaka\"<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--email<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"iisaka51@gmail.com\"<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--password<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"hogehoge\"<\/span> <span class=\"nt\">--dbpass<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"hogehoge\"<\/span>\r\n<\/code><\/pre>\n<p>\u6267\u884c\u540e\uff0c\u8bf7\u4e0d\u8981\u5fd8\u8bb0\u7f16\u8f91$HOME\/.bash_profile\u3002<br \/>\n\u7f16\u8f91\u793a\u4f8b\uff1a<\/p>\n<pre class=\"post-pre\"><code><span class=\"nb\">export <\/span><span class=\"nv\">PATH<\/span><span class=\"o\">=<\/span><span class=\"nv\">$HOME<\/span>\/conda\/bin:<span class=\"nv\">$PATH<\/span>:<span class=\"nv\">$HOME<\/span>\/.local\/bin:<span class=\"nv\">$HOME<\/span>\/bin\r\n<\/code><\/pre>\n<p>\u4e0b\u9762\u662f\u811a\u672c\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c\">#!\/bin\/bash<\/span>\r\n\r\n<span class=\"nv\">_SUMMARY_<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"Auto Setup for Ansible Semaphore\"<\/span>\r\n<span class=\"nv\">_AUTHOR_<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"Goichi Iisaka &lt;iisaka51@gmail.com&gt;\"<\/span>\r\n<span class=\"nv\">_VERSION_<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"0.2\"<\/span>\r\n\r\n<span class=\"nv\">MINICONDA<\/span><span class=\"o\">=<\/span>MicroConda3-18.01-Linux-x86_64.sh\r\n\r\n<span class=\"nv\">DEBUG<\/span><span class=\"o\">=<\/span><span class=\"k\">${<\/span><span class=\"nv\">DEBUG<\/span><span class=\"k\">:-<\/span><span class=\"s2\">\"0\"<\/span><span class=\"k\">}<\/span>\r\n<span class=\"nv\">PROG<\/span><span class=\"o\">=<\/span><span class=\"si\">$(<\/span> <span class=\"nb\">basename<\/span> <span class=\"nv\">$0<\/span> <span class=\"si\">)<\/span>\r\n<span class=\"nv\">MYHOST<\/span><span class=\"o\">=<\/span><span class=\"si\">$(<\/span> <span class=\"nb\">hostname<\/span> <span class=\"nt\">-s<\/span> <span class=\"si\">)<\/span>\r\n\r\n<span class=\"nv\">FULLNAME<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"\"<\/span>\r\n<span class=\"nv\">EMAIL<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"\"<\/span>\r\n<span class=\"nv\">USERNAME<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"\"<\/span>\r\n<span class=\"nv\">PASSWORD<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"\"<\/span>\r\n<span class=\"nv\">DBPASS<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"\"<\/span>\r\n\r\nVERSION<span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n<span class=\"nb\">cat<\/span> <span class=\"o\">&lt;&lt;<\/span><span class=\"no\">_EOF_<\/span><span class=\"sh\"> 1&gt;&amp;2\r\n<\/span><span class=\"k\">${<\/span><span class=\"nv\">PROG<\/span><span class=\"k\">}<\/span><span class=\"sh\"> - <\/span><span class=\"k\">${<\/span><span class=\"nv\">_SUMMARY_<\/span><span class=\"p\">)<\/span><span class=\"k\">}<\/span><span class=\"sh\">\r\nVersion: <\/span><span class=\"k\">${<\/span><span class=\"nv\">_VERSION_<\/span><span class=\"k\">}<\/span><span class=\"sh\">\r\nCopyright 2018, <\/span><span class=\"k\">${<\/span><span class=\"nv\">_AUTHOR_<\/span><span class=\"k\">}<\/span>\r\n<span class=\"no\">_EOF_\r\n<\/span><span class=\"o\">}<\/span>\r\n\r\nUSAGE<span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n<span class=\"nb\">cat<\/span> <span class=\"o\">&lt;&lt;<\/span><span class=\"no\">_EOF_<\/span><span class=\"sh\"> 1&gt;&amp;2\r\n\r\nUsage: <\/span><span class=\"k\">${<\/span><span class=\"nv\">PROG<\/span><span class=\"k\">}<\/span><span class=\"sh\"> [options]\r\n\r\nOPTIONS:\r\n    --prefix              - Install Prefix (default: <\/span><span class=\"k\">${<\/span><span class=\"nv\">PREFIX<\/span><span class=\"k\">}<\/span><span class=\"sh\">)\r\n    --envname             - Conda EnvName for Ansible (default: ansible)\r\n    --port                - Port number for semaphore (default: 3000)\r\n    --fullname            - Your FullName \r\n    --email               - Your Email \r\n    --username            - Username for semaphore \r\n    --password            - Password for semaphore\r\n    --dbname              - Database name for semaphore (default: semaphore)\r\n    --dbuser              - Database name for semaphore (default: semaphore)\r\n    --dbpass              - Database password for semaphore \r\n    --dbport              - Port number for database (default: 3306)\r\n    --help                - This messages.\r\n    --version             - Print version and author\r\n<\/span><span class=\"no\">_EOF_\r\n<\/span><span class=\"o\">}<\/span>\r\n\r\n<span class=\"nv\">LONG_OPTIONS<\/span><span class=\"o\">=<\/span><span class=\"s2\">\" -l help,version,debug:,fullname:,email:,username:,password:,prefix:,envname:,dbname:,dbpass:,dbport:,port:\"<\/span>\r\n<span class=\"nv\">OPTIONS<\/span><span class=\"o\">=<\/span><span class=\"si\">$(<\/span> \/usr\/bin\/getopt <span class=\"nt\">-o<\/span> D:  <span class=\"k\">${<\/span><span class=\"nv\">LONG_OPTIONS<\/span><span class=\"k\">}<\/span> <span class=\"nt\">--<\/span> <span class=\"s2\">\"<\/span><span class=\"nv\">$@<\/span><span class=\"s2\">\"<\/span> <span class=\"si\">)<\/span>\r\n\r\n<span class=\"nb\">eval set<\/span> <span class=\"nt\">--<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nv\">OPTIONS<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n\r\n<span class=\"k\">while <\/span><span class=\"nb\">true\r\n<\/span><span class=\"k\">do\r\n    case<\/span> <span class=\"s2\">\"<\/span><span class=\"nv\">$1<\/span><span class=\"s2\">\"<\/span> <span class=\"k\">in<\/span>\r\n    <span class=\"nt\">--prefix<\/span><span class=\"p\">)<\/span>      <span class=\"nv\">PREFIX<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"<\/span><span class=\"nv\">$2<\/span><span class=\"s2\">\"<\/span>   <span class=\"p\">;<\/span> <span class=\"nb\">shift <\/span>2 <span class=\"p\">;;<\/span>\r\n    <span class=\"nt\">--envname<\/span><span class=\"p\">)<\/span>     <span class=\"nv\">ENVNAME<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"<\/span><span class=\"nv\">$2<\/span><span class=\"s2\">\"<\/span>  <span class=\"p\">;<\/span> <span class=\"nb\">shift <\/span>2 <span class=\"p\">;;<\/span>\r\n    <span class=\"nt\">--fullname<\/span><span class=\"p\">)<\/span>    <span class=\"nv\">FULLNAME<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"<\/span><span class=\"nv\">$2<\/span><span class=\"s2\">\"<\/span> <span class=\"p\">;<\/span> <span class=\"nb\">shift <\/span>2 <span class=\"p\">;;<\/span>\r\n    <span class=\"nt\">--email<\/span><span class=\"p\">)<\/span>       <span class=\"nv\">EMAIL<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"<\/span><span class=\"nv\">$2<\/span><span class=\"s2\">\"<\/span>    <span class=\"p\">;<\/span> <span class=\"nb\">shift <\/span>2 <span class=\"p\">;;<\/span>\r\n    <span class=\"nt\">--username<\/span><span class=\"p\">)<\/span>    <span class=\"nv\">USERNAME<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"<\/span><span class=\"nv\">$2<\/span><span class=\"s2\">\"<\/span> <span class=\"p\">;<\/span> <span class=\"nb\">shift <\/span>2 <span class=\"p\">;;<\/span>\r\n    <span class=\"nt\">--password<\/span><span class=\"p\">)<\/span>    <span class=\"nv\">PASSWORD<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"<\/span><span class=\"nv\">$2<\/span><span class=\"s2\">\"<\/span> <span class=\"p\">;<\/span> <span class=\"nb\">shift <\/span>2 <span class=\"p\">;;<\/span>\r\n    <span class=\"nt\">--port<\/span><span class=\"p\">)<\/span>        <span class=\"nv\">PORT<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"<\/span><span class=\"nv\">$2<\/span><span class=\"s2\">\"<\/span>     <span class=\"p\">;<\/span> <span class=\"nb\">shift <\/span>2 <span class=\"p\">;;<\/span>\r\n    <span class=\"nt\">--dbname<\/span><span class=\"p\">)<\/span>      <span class=\"nv\">DBNAME<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"<\/span><span class=\"nv\">$2<\/span><span class=\"s2\">\"<\/span>   <span class=\"p\">;<\/span> <span class=\"nb\">shift <\/span>2 <span class=\"p\">;;<\/span>\r\n    <span class=\"nt\">--dbpass<\/span><span class=\"p\">)<\/span>      <span class=\"nv\">DBPASS<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"<\/span><span class=\"nv\">$2<\/span><span class=\"s2\">\"<\/span>   <span class=\"p\">;<\/span> <span class=\"nb\">shift <\/span>2 <span class=\"p\">;;<\/span>\r\n    <span class=\"nt\">--dbport<\/span><span class=\"p\">)<\/span>      <span class=\"nv\">DBPORT<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"<\/span><span class=\"nv\">$2<\/span><span class=\"s2\">\"<\/span>   <span class=\"p\">;<\/span> <span class=\"nb\">shift <\/span>2 <span class=\"p\">;;<\/span>\r\n    <span class=\"nt\">--<\/span><span class=\"p\">)<\/span> <span class=\"nb\">shift<\/span> <span class=\"p\">;<\/span> <span class=\"nb\">break<\/span> <span class=\"p\">;;<\/span>\r\n    <span class=\"k\">*<\/span><span class=\"p\">)<\/span> USAGE  <span class=\"p\">;<\/span> <span class=\"nb\">exit<\/span> <span class=\"p\">;;<\/span>\r\n    <span class=\"k\">esac<\/span>\r\n<span class=\"k\">done\r\n\r\n<\/span><span class=\"nv\">PREFIX<\/span><span class=\"o\">=<\/span><span class=\"k\">${<\/span><span class=\"nv\">PREFIX<\/span><span class=\"k\">:-<\/span><span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nv\">HOME<\/span><span class=\"k\">}<\/span><span class=\"s2\">\/conda\"<\/span><span class=\"k\">}<\/span>\r\n<span class=\"nv\">ENVNAME<\/span><span class=\"o\">=<\/span><span class=\"k\">${<\/span><span class=\"nv\">ENVNAME<\/span><span class=\"k\">:-<\/span><span class=\"s2\">\"ansible\"<\/span><span class=\"k\">}<\/span>\r\n<span class=\"nv\">PORT<\/span><span class=\"o\">=<\/span><span class=\"k\">${<\/span><span class=\"nv\">PORT<\/span><span class=\"k\">:-<\/span><span class=\"s2\">\"3000\"<\/span><span class=\"k\">}<\/span>\r\n<span class=\"nv\">DBPORT<\/span><span class=\"o\">=<\/span><span class=\"k\">${<\/span><span class=\"nv\">DBPORT<\/span><span class=\"k\">:-<\/span><span class=\"s2\">\"3306\"<\/span><span class=\"k\">}<\/span>\r\n<span class=\"nv\">DBNAME<\/span><span class=\"o\">=<\/span><span class=\"k\">${<\/span><span class=\"nv\">DBNAME<\/span><span class=\"k\">:-<\/span><span class=\"s2\">\"semaphore\"<\/span><span class=\"k\">}<\/span>\r\n<span class=\"nv\">DBUSER<\/span><span class=\"o\">=<\/span><span class=\"k\">${<\/span><span class=\"nv\">DBNAME<\/span><span class=\"k\">:-<\/span><span class=\"s2\">\"semaphore\"<\/span><span class=\"k\">}<\/span>\r\n<span class=\"o\">[<\/span> x<span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nv\">FULLNAME<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">\"x\"<\/span> <span class=\"o\">]<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">read<\/span> <span class=\"nt\">-p<\/span> <span class=\"s2\">\"Your Fullname: \"<\/span> FULLNAME\r\n<span class=\"o\">[<\/span> x<span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nv\">EMAIL<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">\"x\"<\/span> <span class=\"o\">]<\/span>    <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">read<\/span> <span class=\"nt\">-p<\/span> <span class=\"s2\">\"Your Email: \"<\/span> EMAIL\r\n<span class=\"o\">[<\/span> x<span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nv\">USERNAME<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">\"x\"<\/span> <span class=\"o\">]<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"nv\">USERNAME<\/span><span class=\"o\">=<\/span><span class=\"si\">$(<\/span> <span class=\"nb\">echo<\/span> <span class=\"k\">${<\/span><span class=\"nv\">EMAIL<\/span><span class=\"k\">}<\/span> | <span class=\"nb\">cut<\/span> <span class=\"nt\">-d<\/span>@ <span class=\"nt\">-f1<\/span> <span class=\"si\">)<\/span>\r\n<span class=\"o\">[<\/span> x<span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nv\">PASSWORD<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">\"x\"<\/span> <span class=\"o\">]<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"se\">\\<\/span>\r\n<span class=\"k\">while <\/span><span class=\"nb\">true\r\n<\/span><span class=\"k\">do\r\n    <\/span><span class=\"nb\">read<\/span> <span class=\"nt\">-es<\/span> <span class=\"nt\">-p<\/span> <span class=\"s2\">\"Enter passowrd: \"<\/span> PASS1 <span class=\"p\">;<\/span> <span class=\"nb\">echo\r\n    read<\/span> <span class=\"nt\">-es<\/span> <span class=\"nt\">-p<\/span> <span class=\"s2\">\"Verify passowrd: \"<\/span> PASS2 <span class=\"p\">;<\/span> <span class=\"nb\">echo\r\n    <\/span><span class=\"k\">if<\/span> <span class=\"o\">[<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nv\">PASS1<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span> <span class=\"o\">!=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nv\">PASS2<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span> <span class=\"o\">]<\/span> <span class=\"p\">;<\/span> <span class=\"k\">then\r\n        <\/span><span class=\"nb\">echo<\/span> <span class=\"s2\">\"Passowrd do not match.\"<\/span>\r\n    <span class=\"k\">else\r\n        <\/span><span class=\"nv\">PASSWORD<\/span><span class=\"o\">=<\/span><span class=\"k\">${<\/span><span class=\"nv\">PASS1<\/span><span class=\"k\">}<\/span>\r\n        <span class=\"nb\">break\r\n    <\/span><span class=\"k\">fi\r\ndone<\/span>\r\n\r\n<span class=\"o\">[<\/span> x<span class=\"k\">${<\/span><span class=\"nv\">DBPASS<\/span><span class=\"k\">}<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">\"x\"<\/span> <span class=\"o\">]<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"se\">\\<\/span>\r\n<span class=\"k\">while <\/span><span class=\"nb\">true\r\n<\/span><span class=\"k\">do\r\n    <\/span><span class=\"nb\">read<\/span> <span class=\"nt\">-es<\/span> <span class=\"nt\">-p<\/span> <span class=\"s2\">\"Enter DB passowrd: \"<\/span> PASS1 <span class=\"p\">;<\/span> <span class=\"nb\">echo\r\n    read<\/span> <span class=\"nt\">-es<\/span> <span class=\"nt\">-p<\/span> <span class=\"s2\">\"Verify DB passowrd: \"<\/span> PASS2 <span class=\"p\">;<\/span> <span class=\"nb\">echo\r\n    <\/span><span class=\"k\">if<\/span> <span class=\"o\">[<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nv\">PASS1<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span> <span class=\"o\">!=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nv\">PASS2<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span> <span class=\"o\">]<\/span> <span class=\"p\">;<\/span> <span class=\"k\">then\r\n        <\/span><span class=\"nb\">echo<\/span> <span class=\"s2\">\"Passowrd do not match.\"<\/span>\r\n    <span class=\"k\">else\r\n        <\/span><span class=\"nv\">DBPASS<\/span><span class=\"o\">=<\/span><span class=\"k\">${<\/span><span class=\"nv\">PASS1<\/span><span class=\"k\">}<\/span>\r\n        <span class=\"nb\">break\r\n    <\/span><span class=\"k\">fi\r\ndone\r\n\r\nif<\/span> <span class=\"o\">[<\/span> <span class=\"o\">!<\/span> <span class=\"nt\">-f<\/span> <span class=\"k\">${<\/span><span class=\"nv\">MINICONDA<\/span><span class=\"k\">}<\/span> <span class=\"o\">]<\/span> <span class=\"p\">;<\/span> <span class=\"k\">then\r\n    <\/span>wget <span class=\"nt\">-O<\/span> <span class=\"k\">${<\/span><span class=\"nv\">MINICONDA<\/span><span class=\"k\">}<\/span> http:\/\/repobank.openmyroad.com\/conda\/<span class=\"k\">${<\/span><span class=\"nv\">MINICONDA<\/span><span class=\"k\">}<\/span>\r\n    <span class=\"nb\">chmod <\/span>700 <span class=\"k\">${<\/span><span class=\"nv\">MINICONDA<\/span><span class=\"k\">}<\/span>\r\n    bash <span class=\"k\">${<\/span><span class=\"nv\">MINICONDA<\/span><span class=\"k\">}<\/span> <span class=\"nt\">-b<\/span> <span class=\"nt\">-p<\/span> <span class=\"k\">${<\/span><span class=\"nv\">PREFIX<\/span><span class=\"k\">}<\/span>\r\n    <span class=\"nb\">export <\/span><span class=\"nv\">PATH<\/span><span class=\"o\">=<\/span><span class=\"k\">${<\/span><span class=\"nv\">PREFIX<\/span><span class=\"k\">}<\/span>\/bin:<span class=\"k\">${<\/span><span class=\"nv\">PATH<\/span><span class=\"k\">}<\/span>\r\n<span class=\"k\">fi<\/span>\r\n\r\n<span class=\"o\">[<\/span> <span class=\"nt\">-f<\/span> <span class=\"k\">${<\/span><span class=\"nv\">HOME<\/span><span class=\"k\">}<\/span>\/.condarc <span class=\"o\">]<\/span> <span class=\"o\">||<\/span> <span class=\"se\">\\<\/span>\r\n<span class=\"nb\">cat<\/span> <span class=\"o\">&lt;&lt;<\/span><span class=\"no\">EOF<\/span><span class=\"sh\"> &gt; <\/span><span class=\"k\">${<\/span><span class=\"nv\">HOME<\/span><span class=\"k\">}<\/span><span class=\"sh\">\/.condarc\r\ncustom_multichannels:\r\n  openmyroad: [\r\n    'http:\/\/repobank.openmyroad.com\/conda\/pkgs\/openmyroad\/'\r\n  ]\r\nchannels:\r\n  - defaults\r\n  - openmyroad\r\nchannels_alias: http:\/\/repobank.openmyroad.com\/conda\/pkgs\r\nshow_channel_urls: true\r\n<\/span><span class=\"no\">EOF\r\n\r\n<\/span><span class=\"k\">if<\/span> <span class=\"o\">[<\/span> <span class=\"o\">!<\/span> <span class=\"nt\">-d<\/span> <span class=\"k\">${<\/span><span class=\"nv\">PREFIX<\/span><span class=\"k\">}<\/span>\/envs\/<span class=\"k\">${<\/span><span class=\"nv\">ENVNAME<\/span><span class=\"k\">}<\/span> <span class=\"o\">]<\/span> <span class=\"p\">;<\/span> <span class=\"k\">then\r\n    <\/span>conda create <span class=\"nt\">-y<\/span> <span class=\"nt\">-n<\/span> <span class=\"k\">${<\/span><span class=\"nv\">ENVNAME<\/span><span class=\"k\">}<\/span>\r\n<span class=\"k\">fi\r\n\r\n<\/span><span class=\"nb\">source <\/span>activate <span class=\"k\">${<\/span><span class=\"nv\">ENVNAME<\/span><span class=\"k\">}<\/span>\r\nconda <span class=\"nb\">install<\/span> <span class=\"nt\">-y<\/span> ansible ansible-semaphore ansible-runner <span class=\"se\">\\<\/span>\r\n    ansible-role ansible-vault ansible-review ansible-generator <span class=\"se\">\\<\/span>\r\n    supervisor3 mariadb jq node.js bcrypt\r\n\r\n<span class=\"nv\">ENV_PREFIX<\/span><span class=\"o\">=<\/span><span class=\"si\">$(<\/span> conda info <span class=\"nt\">--json<\/span> | jq <span class=\"nt\">-r<\/span> .default_prefix <span class=\"si\">)<\/span>\r\n<span class=\"nb\">install<\/span> <span class=\"nt\">-m0700<\/span> <span class=\"nt\">-d<\/span> <span class=\"k\">${<\/span><span class=\"nv\">HOME<\/span><span class=\"k\">}<\/span>\/playbooks\r\n<span class=\"nb\">install<\/span> <span class=\"nt\">-m0700<\/span> <span class=\"nt\">-d<\/span> <span class=\"k\">${<\/span><span class=\"nv\">ENV_PREFIX<\/span><span class=\"k\">}<\/span>\/<span class=\"o\">{<\/span>logs,tmp<span class=\"o\">}<\/span>\r\n<span class=\"nb\">install<\/span> <span class=\"nt\">-m0700<\/span> <span class=\"nt\">-d<\/span> <span class=\"k\">${<\/span><span class=\"nv\">ENV_PREFIX<\/span><span class=\"k\">}<\/span>\/etc\/supervisor.d\r\n\r\n<span class=\"o\">[<\/span> <span class=\"nt\">-f<\/span> <span class=\"k\">${<\/span><span class=\"nv\">ENV_PREFIX<\/span><span class=\"k\">}<\/span>\/etc\/supervisord.conf <span class=\"o\">]<\/span> <span class=\"o\">||<\/span> <span class=\"se\">\\<\/span>\r\n<span class=\"nb\">cat<\/span> <span class=\"o\">&lt;&lt;<\/span><span class=\"no\">EOF<\/span><span class=\"sh\"> &gt; <\/span><span class=\"k\">${<\/span><span class=\"nv\">ENV_PREFIX<\/span><span class=\"k\">}<\/span><span class=\"sh\">\/etc\/supervisord.conf\r\n[unix_http_server]\r\nfile=<\/span><span class=\"k\">${<\/span><span class=\"nv\">ENV_PREFIX<\/span><span class=\"k\">}<\/span><span class=\"sh\">\/tmp\/supervisor.sock    ; the path to the socket file\r\n[supervisord]\r\nlogfile=<\/span><span class=\"k\">${<\/span><span class=\"nv\">ENV_PREFIX<\/span><span class=\"k\">}<\/span><span class=\"sh\">\/tmp\/supervisord.log ; main log file\r\nlogfile_maxbytes=50MB    ; max main logfile bytes b4 rotation; default 50MB\r\nlogfile_backups=10       ; # of main logfile backups; 0 means none, default 10\r\nloglevel=info            ; log level; default info; others: debug,warn,trace\r\npidfile=<\/span><span class=\"k\">${<\/span><span class=\"nv\">ENV_PREFIX<\/span><span class=\"k\">}<\/span><span class=\"sh\">\/tmp\/supervisord.pid ; supervisord pidfile; default supervisord.pid\r\nnodaemon=false           ; start in foreground if true; default false\r\nminfds=1024              ; min. avail startup file descriptors; default 1024\r\nminprocs=200             ; min. avail process descriptors;default 200\r\n[rpcinterface:supervisor]\r\nsupervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface\r\n[supervisorctl]\r\nserverurl=unix:\/\/<\/span><span class=\"k\">${<\/span><span class=\"nv\">ENV_PREFIX<\/span><span class=\"k\">}<\/span><span class=\"sh\">\/tmp\/supervisor.sock ; use a unix:\/\/ URL  for a unix socket\r\n[include]\r\nfiles = supervisor.d\/*.ini\r\n<\/span><span class=\"no\">EOF\r\n\r\n<\/span><span class=\"o\">[<\/span> <span class=\"nt\">-f<\/span> <span class=\"k\">${<\/span><span class=\"nv\">ENV_PREFIX<\/span><span class=\"k\">}<\/span>\/mariadb\/data\/mysql <span class=\"o\">]<\/span> <span class=\"o\">||<\/span> <span class=\"se\">\\<\/span>\r\n    <span class=\"k\">${<\/span><span class=\"nv\">ENV_PREFIX<\/span><span class=\"k\">}<\/span>\/mariadb\/scripts\/mysql_install_db <span class=\"se\">\\<\/span>\r\n        <span class=\"nt\">--user<\/span><span class=\"o\">=<\/span><span class=\"k\">${<\/span><span class=\"nv\">USER<\/span><span class=\"k\">}<\/span> <span class=\"se\">\\<\/span>\r\n        <span class=\"nt\">--basedir<\/span><span class=\"o\">=<\/span><span class=\"k\">${<\/span><span class=\"nv\">ENV_PREFIX<\/span><span class=\"k\">}<\/span>\/mariadb <span class=\"se\">\\<\/span>\r\n        <span class=\"nt\">--datadir<\/span><span class=\"o\">=<\/span><span class=\"k\">${<\/span><span class=\"nv\">ENV_PREFIX<\/span><span class=\"k\">}<\/span>\/mariadb\/data\r\n\r\n<span class=\"o\">[<\/span> <span class=\"nt\">-f<\/span> <span class=\"k\">${<\/span><span class=\"nv\">ENV_PREFIX<\/span><span class=\"k\">}<\/span>\/mariadb\/errmsg.sys <span class=\"o\">]<\/span> <span class=\"o\">||<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nb\">cp<\/span> <span class=\"k\">${<\/span><span class=\"nv\">ENV_PREFIX<\/span><span class=\"k\">}<\/span>\/mariadb\/share\/english\/errmsg.sys <span class=\"k\">${<\/span><span class=\"nv\">ENV_PREFIX<\/span><span class=\"k\">}<\/span>\/mariadb\r\n\r\n<span class=\"nb\">touch<\/span> <span class=\"k\">${<\/span><span class=\"nv\">ENV_PREFIX<\/span><span class=\"k\">}<\/span>\/mariadb\/data\/mysql.sock\r\n\r\n<span class=\"nb\">sed<\/span> <span class=\"nt\">-e<\/span> <span class=\"s2\">\"\/]\/ a port=<\/span><span class=\"k\">${<\/span><span class=\"nv\">DBPORT<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span> <span class=\"se\">\\<\/span>\r\n    <span class=\"nt\">-i<\/span> <span class=\"k\">${<\/span><span class=\"nv\">ENV_PREFIX<\/span><span class=\"k\">}<\/span>\/mariadb\/etc\/my.cnf\r\n\r\n<span class=\"o\">[<\/span> <span class=\"nt\">-f<\/span> <span class=\"k\">${<\/span><span class=\"nv\">ENV_PREFIX<\/span><span class=\"k\">}<\/span>\/etc\/supervisor.d\/mariadb.ini <span class=\"o\">]<\/span> <span class=\"o\">||<\/span> <span class=\"se\">\\<\/span>\r\n<span class=\"nb\">cat<\/span> <span class=\"o\">&lt;&lt;<\/span><span class=\"no\">EOF<\/span><span class=\"sh\"> &gt; <\/span><span class=\"k\">${<\/span><span class=\"nv\">ENV_PREFIX<\/span><span class=\"k\">}<\/span><span class=\"sh\">\/etc\/supervisor.d\/mariadb.ini\r\n[program:mariadb]\r\ncommand=<\/span><span class=\"k\">${<\/span><span class=\"nv\">ENV_PREFIX<\/span><span class=\"k\">}<\/span><span class=\"sh\">\/mariadb\/bin\/mysqld\r\n    --user=<\/span><span class=\"k\">${<\/span><span class=\"nv\">USER<\/span><span class=\"k\">}<\/span><span class=\"sh\">\r\nuser=<\/span><span class=\"k\">${<\/span><span class=\"nv\">USER<\/span><span class=\"k\">}<\/span><span class=\"sh\"> \r\nautostart=false  \r\nautorestart=false  \r\nstdout_logfile=<\/span><span class=\"k\">${<\/span><span class=\"nv\">ENV_PREFIX<\/span><span class=\"k\">}<\/span><span class=\"sh\">\/logs\/maridb.log\r\nstdout_logfile_maxbytes=1MB\r\nstdout_logfile_backups=4\r\nstdout_capture_maxbytes=1MB\r\nredirect_stderr=true \r\n<\/span><span class=\"no\">EOF\r\n\r\n<\/span><span class=\"o\">[<\/span> <span class=\"nt\">-f<\/span> <span class=\"k\">${<\/span><span class=\"nv\">ENV_PREFIX<\/span><span class=\"k\">}<\/span>\/etc\/supervisor.d\/semaphore.ini <span class=\"o\">]<\/span> <span class=\"o\">||<\/span> <span class=\"se\">\\<\/span>\r\n<span class=\"nb\">cat<\/span> <span class=\"o\">&lt;&lt;<\/span><span class=\"no\">EOF<\/span><span class=\"sh\"> &gt; <\/span><span class=\"k\">${<\/span><span class=\"nv\">ENV_PREFIX<\/span><span class=\"k\">}<\/span><span class=\"sh\">\/etc\/supervisor.d\/semaphore.ini\r\n[program:semaphore]\r\ncommand=<\/span><span class=\"k\">${<\/span><span class=\"nv\">ENV_PREFIX<\/span><span class=\"k\">}<\/span><span class=\"sh\">\/bin\/semaphore\r\n    --config=<\/span><span class=\"k\">${<\/span><span class=\"nv\">ENV_PREFIX<\/span><span class=\"k\">}<\/span><span class=\"sh\">\/etc\/semaphore.conf\r\nuser=<\/span><span class=\"k\">${<\/span><span class=\"nv\">USER<\/span><span class=\"k\">}<\/span><span class=\"sh\"> \r\nautostart=false  \r\nautorestart=false  \r\nstdout_logfile=<\/span><span class=\"k\">${<\/span><span class=\"nv\">ENV_PREFIX<\/span><span class=\"k\">}<\/span><span class=\"sh\">\/logs\/semaphore.log\r\nstdout_logfile_maxbytes=1MB\r\nstdout_logfile_backups=4\r\nstdout_capture_maxbytes=1MB\r\nredirect_stderr=true \r\n<\/span><span class=\"no\">EOF\r\n\r\n<\/span><span class=\"o\">[<\/span> <span class=\"nt\">-f<\/span> <span class=\"k\">${<\/span><span class=\"nv\">ENV_PREFIX<\/span><span class=\"k\">}<\/span>\/etc\/semaphore.conf <span class=\"o\">]<\/span> <span class=\"o\">||<\/span> <span class=\"se\">\\<\/span>\r\n<span class=\"nb\">cat<\/span> <span class=\"o\">&lt;&lt;<\/span><span class=\"no\">EOF<\/span><span class=\"sh\"> &gt; <\/span><span class=\"k\">${<\/span><span class=\"nv\">ENV_PREFIX<\/span><span class=\"k\">}<\/span><span class=\"sh\">\/etc\/semaphore.conf\r\n{\r\n        \"mysql\": {\r\n                \"host\": \"127.0.0.1:<\/span><span class=\"k\">${<\/span><span class=\"nv\">DBPORT<\/span><span class=\"k\">}<\/span><span class=\"sh\">\",\r\n                \"user\": \"<\/span><span class=\"k\">${<\/span><span class=\"nv\">DBNAME<\/span><span class=\"k\">}<\/span><span class=\"sh\">\",\r\n                \"pass\": \"<\/span><span class=\"k\">${<\/span><span class=\"nv\">DBPASS<\/span><span class=\"k\">}<\/span><span class=\"sh\">\",\r\n                \"name\": \"<\/span><span class=\"k\">${<\/span><span class=\"nv\">DBUSER<\/span><span class=\"k\">}<\/span><span class=\"sh\">\"\r\n        },\r\n        \"port\": \"<\/span><span class=\"k\">${<\/span><span class=\"nv\">PORT<\/span><span class=\"k\">}<\/span><span class=\"sh\">\",\r\n        \"tmp_path\": \"<\/span><span class=\"k\">${<\/span><span class=\"nv\">HOME<\/span><span class=\"k\">}<\/span><span class=\"sh\">\/playbooks\",\r\n        \"cookie_hash\": \"sJilmUw\/WqxUCspXevZAswyJUzBhwIa3TafVizE7fPk=\",\r\n        \"cookie_encryption\": \"7zz90QwjBKB8\/zygGC4R7hoAVXW8EQ4v3nsuA72WsAI=\",\r\n        \"email_sender\": \"\",\r\n        \"email_host\": \"\",\r\n        \"email_port\": \"\",\r\n        \"web_host\": \"\",\r\n        \"ldap_binddn\": \"\",\r\n        \"ldap_bindpassword\": \"\",\r\n        \"ldap_server\": \"\",\r\n        \"ldap_searchdn\": \"\",\r\n        \"ldap_searchfilter\": \"\",\r\n        \"ldap_mappings\": {\r\n                \"dn\": \"\",\r\n                \"mail\": \"\",\r\n                \"uid\": \"\",\r\n                \"cn\": \"\"\r\n        },\r\n        \"telegram_chat\": \"\",\r\n        \"telegram_token\": \"\",\r\n        \"concurrency_mode\": \"\",\r\n        \"max_parallel_tasks\": 0,\r\n        \"email_alert\": false,\r\n        \"telegram_alert\": false,\r\n        \"ldap_enable\": false,\r\n        \"ldap_needtls\": false\r\n }\r\n<\/span><span class=\"no\">EOF\r\n\r\n<\/span>supervisord\r\nsupervisorctl start mariadb\r\n\r\nmysql <span class=\"nt\">-u<\/span> root <span class=\"nt\">-e<\/span> <span class=\"s2\">\"CREATE DATABASE <\/span><span class=\"k\">${<\/span><span class=\"nv\">DBNAME<\/span><span class=\"k\">}<\/span><span class=\"s2\">;\"<\/span>\r\nmysql <span class=\"nt\">-u<\/span> root <span class=\"nt\">-e<\/span> <span class=\"s2\">\"CREATE USER '<\/span><span class=\"k\">${<\/span><span class=\"nv\">DBUSER<\/span><span class=\"k\">}<\/span><span class=\"s2\">'@'localhost' IDENTIFIED BY '<\/span><span class=\"k\">${<\/span><span class=\"nv\">DBPASS<\/span><span class=\"k\">}<\/span><span class=\"s2\">';\"<\/span>\r\nmysql <span class=\"nt\">-u<\/span> root <span class=\"nt\">-e<\/span> <span class=\"s2\">\"GRANT ALL PRIVILEGES ON <\/span><span class=\"k\">${<\/span><span class=\"nv\">DBNAME<\/span><span class=\"k\">}<\/span><span class=\"s2\">.* TO '<\/span><span class=\"k\">${<\/span><span class=\"nv\">DBUSER<\/span><span class=\"k\">}<\/span><span class=\"s2\">'@'localhost' WITH GRANT OPTION;\"<\/span>\r\n\r\n<span class=\"nv\">PASSWORDHASH<\/span><span class=\"o\">=<\/span><span class=\"si\">$(<\/span> python <span class=\"nt\">-c<\/span> <span class=\"s2\">\"import bcrypt; P=bcrypt.hashpw('<\/span><span class=\"k\">${<\/span><span class=\"nv\">PASSWORD<\/span><span class=\"k\">}<\/span><span class=\"s2\">'.encode(),bcrypt.gensalt()); print(P.decode('utf-8'))\"<\/span> <span class=\"si\">)<\/span>\r\n\r\nsemaphore <span class=\"nt\">-config<\/span> <span class=\"k\">${<\/span><span class=\"nv\">ENV_PREFIX<\/span><span class=\"k\">}<\/span>\/etc\/semaphore.conf <span class=\"nt\">-migrate<\/span>\r\nmysql <span class=\"nt\">-u<\/span> <span class=\"k\">${<\/span><span class=\"nv\">DBUSER<\/span><span class=\"k\">}<\/span> <span class=\"nt\">-p<\/span><span class=\"k\">${<\/span><span class=\"nv\">DBPASS<\/span><span class=\"k\">}<\/span> <span class=\"nt\">-e<\/span> <span class=\"s2\">\"INSERT INTO user set name='<\/span><span class=\"k\">${<\/span><span class=\"nv\">FULLNAME<\/span><span class=\"k\">}<\/span><span class=\"s2\">',username='<\/span><span class=\"k\">${<\/span><span class=\"nv\">USERNAME<\/span><span class=\"k\">}<\/span><span class=\"s2\">',email='<\/span><span class=\"k\">${<\/span><span class=\"nv\">EMAIL<\/span><span class=\"k\">}<\/span><span class=\"s2\">',password='<\/span><span class=\"k\">${<\/span><span class=\"nv\">PASSWORDHASH<\/span><span class=\"k\">}<\/span><span class=\"s2\">',admin=1,created=UTC_TIMESTAMP()\"<\/span> <span class=\"k\">${<\/span><span class=\"nv\">DBNAME<\/span><span class=\"k\">}<\/span>\r\n\r\nsupervisorctl start semaphore\r\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u9996\u5148\u53ef\u80fd\u4f1a\u6709\u5f88\u5c11\u7684\u4eba\u8ba4\u4e3a\u8fd9\u4e2a\u4e1c\u897f\u6709\u7528\uff0c\u4f46\u65e2\u7136\u6211\u5df2\u7ecf\u505a\u4e86\uff0c\u6240\u4ee5\u51b3\u5b9a\u516c\u5f00\u3002 \u5982\u679c\u8fd9\u53ef\u4ee5\u4f5c\u4e3a\u4e00\u4e2aBash\u811a\u672c\u7684\u53c2\u8003\uff0c [&hellip;]<\/p>\n","protected":false},"author":11,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[227],"class_list":["post-29008","post","type-post","status-publish","format-standard","hentry","category-uncategorized","tag-227"],"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>\u6211\u505a\u4e86\u4e00\u4e2a\u7528\u4e8e\u81ea\u52a8\u8bbe\u7f6eAnsible Semaphore\u7684\u811a\u672c - Blog - Silicon Cloud<\/title>\n<meta name=\"description\" content=\"\u5173\u4e8e\u6211\u505a\u4e86\u4e00\u4e2a\u7528\u4e8e\u81ea\u52a8\u8bbe\u7f6eAnsible Semaphore\u7684\u811a\u672c\u7684\u6280\u672f\u6587\u7ae0\" \/>\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\/\u6211\u505a\u4e86\u4e00\u4e2a\u7528\u4e8e\u81ea\u52a8\u8bbe\u7f6eansible-semaphore\u7684\u811a\u672c\u3002\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u6211\u505a\u4e86\u4e00\u4e2a\u7528\u4e8e\u81ea\u52a8\u8bbe\u7f6eAnsible Semaphore\u7684\u811a\u672c\" \/>\n<meta property=\"og:description\" content=\"\u5173\u4e8e\u6211\u505a\u4e86\u4e00\u4e2a\u7528\u4e8e\u81ea\u52a8\u8bbe\u7f6eAnsible Semaphore\u7684\u811a\u672c\u7684\u6280\u672f\u6587\u7ae0\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u6211\u505a\u4e86\u4e00\u4e2a\u7528\u4e8e\u81ea\u52a8\u8bbe\u7f6eansible-semaphore\u7684\u811a\u672c\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-08-28T08:15:15+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-08-12T03:16:51+00:00\" \/>\n<meta name=\"author\" content=\"\u65b0, \u97f5\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u65b0, \u97f5\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"1 \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\/%e6%88%91%e5%81%9a%e4%ba%86%e4%b8%80%e4%b8%aa%e7%94%a8%e4%ba%8e%e8%87%aa%e5%8a%a8%e8%ae%be%e7%bd%aeansible-semaphore%e7%9a%84%e8%84%9a%e6%9c%ac%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%81%9a%e4%ba%86%e4%b8%80%e4%b8%aa%e7%94%a8%e4%ba%8e%e8%87%aa%e5%8a%a8%e8%ae%be%e7%bd%aeansible-semaphore%e7%9a%84%e8%84%9a%e6%9c%ac%e3%80%82\/\",\"name\":\"\u6211\u505a\u4e86\u4e00\u4e2a\u7528\u4e8e\u81ea\u52a8\u8bbe\u7f6eAnsible Semaphore\u7684\u811a\u672c - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-08-28T08:15:15+00:00\",\"dateModified\":\"2025-08-12T03:16:51+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/4ba4019495123db3038fd0809e6959c9\"},\"description\":\"\u5173\u4e8e\u6211\u505a\u4e86\u4e00\u4e2a\u7528\u4e8e\u81ea\u52a8\u8bbe\u7f6eAnsible Semaphore\u7684\u811a\u672c\u7684\u6280\u672f\u6587\u7ae0\",\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%81%9a%e4%ba%86%e4%b8%80%e4%b8%aa%e7%94%a8%e4%ba%8e%e8%87%aa%e5%8a%a8%e8%ae%be%e7%bd%aeansible-semaphore%e7%9a%84%e8%84%9a%e6%9c%ac%e3%80%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%81%9a%e4%ba%86%e4%b8%80%e4%b8%aa%e7%94%a8%e4%ba%8e%e8%87%aa%e5%8a%a8%e8%ae%be%e7%bd%aeansible-semaphore%e7%9a%84%e8%84%9a%e6%9c%ac%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%81%9a%e4%ba%86%e4%b8%80%e4%b8%aa%e7%94%a8%e4%ba%8e%e8%87%aa%e5%8a%a8%e8%ae%be%e7%bd%aeansible-semaphore%e7%9a%84%e8%84%9a%e6%9c%ac%e3%80%82\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u6211\u505a\u4e86\u4e00\u4e2a\u7528\u4e8e\u81ea\u52a8\u8bbe\u7f6eAnsible Semaphore\u7684\u811a\u672c\"}]},{\"@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\/4ba4019495123db3038fd0809e6959c9\",\"name\":\"\u65b0, \u97f5\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d484b6c6e4ae82e8a9efea989e1d2af46d9b6ef128101e63b18f559fca0ae627?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d484b6c6e4ae82e8a9efea989e1d2af46d9b6ef128101e63b18f559fca0ae627?s=96&d=mm&r=g\",\"caption\":\"\u65b0, \u97f5\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/yunxin\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%81%9a%e4%ba%86%e4%b8%80%e4%b8%aa%e7%94%a8%e4%ba%8e%e8%87%aa%e5%8a%a8%e8%ae%be%e7%bd%aeansible-semaphore%e7%9a%84%e8%84%9a%e6%9c%ac%e3%80%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u6211\u505a\u4e86\u4e00\u4e2a\u7528\u4e8e\u81ea\u52a8\u8bbe\u7f6eAnsible Semaphore\u7684\u811a\u672c - Blog - Silicon Cloud","description":"\u5173\u4e8e\u6211\u505a\u4e86\u4e00\u4e2a\u7528\u4e8e\u81ea\u52a8\u8bbe\u7f6eAnsible Semaphore\u7684\u811a\u672c\u7684\u6280\u672f\u6587\u7ae0","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\/\u6211\u505a\u4e86\u4e00\u4e2a\u7528\u4e8e\u81ea\u52a8\u8bbe\u7f6eansible-semaphore\u7684\u811a\u672c\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"\u6211\u505a\u4e86\u4e00\u4e2a\u7528\u4e8e\u81ea\u52a8\u8bbe\u7f6eAnsible Semaphore\u7684\u811a\u672c","og_description":"\u5173\u4e8e\u6211\u505a\u4e86\u4e00\u4e2a\u7528\u4e8e\u81ea\u52a8\u8bbe\u7f6eAnsible Semaphore\u7684\u811a\u672c\u7684\u6280\u672f\u6587\u7ae0","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u6211\u505a\u4e86\u4e00\u4e2a\u7528\u4e8e\u81ea\u52a8\u8bbe\u7f6eansible-semaphore\u7684\u811a\u672c\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-08-28T08:15:15+00:00","article_modified_time":"2025-08-12T03:16:51+00:00","author":"\u65b0, \u97f5","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u65b0, \u97f5","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"1 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%81%9a%e4%ba%86%e4%b8%80%e4%b8%aa%e7%94%a8%e4%ba%8e%e8%87%aa%e5%8a%a8%e8%ae%be%e7%bd%aeansible-semaphore%e7%9a%84%e8%84%9a%e6%9c%ac%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%81%9a%e4%ba%86%e4%b8%80%e4%b8%aa%e7%94%a8%e4%ba%8e%e8%87%aa%e5%8a%a8%e8%ae%be%e7%bd%aeansible-semaphore%e7%9a%84%e8%84%9a%e6%9c%ac%e3%80%82\/","name":"\u6211\u505a\u4e86\u4e00\u4e2a\u7528\u4e8e\u81ea\u52a8\u8bbe\u7f6eAnsible Semaphore\u7684\u811a\u672c - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-08-28T08:15:15+00:00","dateModified":"2025-08-12T03:16:51+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/4ba4019495123db3038fd0809e6959c9"},"description":"\u5173\u4e8e\u6211\u505a\u4e86\u4e00\u4e2a\u7528\u4e8e\u81ea\u52a8\u8bbe\u7f6eAnsible Semaphore\u7684\u811a\u672c\u7684\u6280\u672f\u6587\u7ae0","breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%81%9a%e4%ba%86%e4%b8%80%e4%b8%aa%e7%94%a8%e4%ba%8e%e8%87%aa%e5%8a%a8%e8%ae%be%e7%bd%aeansible-semaphore%e7%9a%84%e8%84%9a%e6%9c%ac%e3%80%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%81%9a%e4%ba%86%e4%b8%80%e4%b8%aa%e7%94%a8%e4%ba%8e%e8%87%aa%e5%8a%a8%e8%ae%be%e7%bd%aeansible-semaphore%e7%9a%84%e8%84%9a%e6%9c%ac%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%81%9a%e4%ba%86%e4%b8%80%e4%b8%aa%e7%94%a8%e4%ba%8e%e8%87%aa%e5%8a%a8%e8%ae%be%e7%bd%aeansible-semaphore%e7%9a%84%e8%84%9a%e6%9c%ac%e3%80%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u6211\u505a\u4e86\u4e00\u4e2a\u7528\u4e8e\u81ea\u52a8\u8bbe\u7f6eAnsible Semaphore\u7684\u811a\u672c"}]},{"@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\/4ba4019495123db3038fd0809e6959c9","name":"\u65b0, \u97f5","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/d484b6c6e4ae82e8a9efea989e1d2af46d9b6ef128101e63b18f559fca0ae627?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d484b6c6e4ae82e8a9efea989e1d2af46d9b6ef128101e63b18f559fca0ae627?s=96&d=mm&r=g","caption":"\u65b0, \u97f5"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/yunxin\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%81%9a%e4%ba%86%e4%b8%80%e4%b8%aa%e7%94%a8%e4%ba%8e%e8%87%aa%e5%8a%a8%e8%ae%be%e7%bd%aeansible-semaphore%e7%9a%84%e8%84%9a%e6%9c%ac%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\/29008","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\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=29008"}],"version-history":[{"count":3,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/29008\/revisions"}],"predecessor-version":[{"id":111426,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/29008\/revisions\/111426"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=29008"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=29008"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=29008"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}