{"id":42878,"date":"2023-07-28T07:48:24","date_gmt":"2024-01-29T14:20:49","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e6%9c%80%e8%bf%91%e9%96%8b%e5%a7%8b%e4%bd%bf%e7%94%a8ansible%e5%92%8cdocker%ef%bc%8c%e4%b8%80%e9%96%8b%e5%a7%8b%e9%81%87%e5%88%b0%e4%ba%86%e5%9b%b0%e9%9b%a3%ef%bc%8c%e4%bd%86%e7%b5%82\/"},"modified":"2024-04-30T15:43:32","modified_gmt":"2024-04-30T07:43:32","slug":"%e6%88%91%e6%9c%80%e8%bf%91%e9%96%8b%e5%a7%8b%e4%bd%bf%e7%94%a8ansible%e5%92%8cdocker%ef%bc%8c%e4%b8%80%e9%96%8b%e5%a7%8b%e9%81%87%e5%88%b0%e4%ba%86%e5%9b%b0%e9%9b%a3%ef%bc%8c%e4%bd%86%e7%b5%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e6%9c%80%e8%bf%91%e9%96%8b%e5%a7%8b%e4%bd%bf%e7%94%a8ansible%e5%92%8cdocker%ef%bc%8c%e4%b8%80%e9%96%8b%e5%a7%8b%e9%81%87%e5%88%b0%e4%ba%86%e5%9b%b0%e9%9b%a3%ef%bc%8c%e4%bd%86%e7%b5%82\/","title":{"rendered":"\u6211\u6700\u8fd1\u958b\u59cb\u4f7f\u7528ansible\u548cdocker\uff0c\u4e00\u958b\u59cb\u9047\u5230\u4e86\u56f0\u96e3\uff0c\u4f46\u7d42\u65bc\u6210\u529f\u555f\u52d5\u4e86"},"content":{"rendered":"<h2>\u7b80\u8ff0<\/h2>\n<p>\u770b\u5230\u67d0\u4e2a\u7f51\u7ad9\u63d0\u5230ansible\u53ef\u80fd\u53ef\u4ee5\u6539\u53d8\u6309\u7167Excel\u64cd\u4f5c\u624b\u518c\u8fdb\u884c\u64cd\u4f5c\u7684\u73b0\u5b9e\uff0c\u6240\u4ee5\u6211\u5c1d\u8bd5\u4e86\u4e0edocker\u7684\u7ec4\u5408\u6765\u9a8c\u8bc1\u3002\u7136\u540e\u5728\u9a8c\u8bc1\u8fc7\u7a0b\u4e2d\u53d1\u73b0\u4e86\u4e00\u4e2a\u53eb\u505a\u201cAnsible\u7684Docker\u8fde\u63a5\u63d2\u4ef6\u201d\u7684\u65b9\u6cd5\uff0c\u53ef\u4ee5\u5728\u8fde\u63a5\u5230\u5bb9\u5668\u65f6\u4e0d\u9700\u8981ssh\uff0c\u4e8e\u662f\u6211\u4fee\u6539\u4e86\u914d\u7f6e\u4ee5\u5b9e\u73b0\u80fd\u591f\u8fdb\u884c\u8fde\u63a5\u7684\u5907\u5fd8\u5f55\u3002<\/p>\n<h2>\u73af\u5883<\/h2>\n<p>\u64cd\u4f5c\u7cfb\u7edf\uff1aCentOS 7<br \/>\nAnsible\u7248\u672c\uff1a2.9.13<br \/>\nDocker\u7248\u672c\uff1a19.03.13<br \/>\nDocker Compose\u7248\u672c\uff1a1.26.2<\/p>\n<p>\u7531\u4e8e\u5404\u79cd\u4e2d\u95f4\u4ef6\u7684\u5b89\u88c5\u65b9\u5f0f\u5df2\u5728\u4e0d\u540c\u7684\u6765\u6e90\u4e0a\u516c\u5f00\uff0c\u56e0\u6b64\u4e0d\u518d\u8d58\u8ff0\u3002<\/p>\n<h2>\u906d\u9047\u5931\u8d25\u65f6\u7684\u8bbe\u7f6e<\/h2>\n<h3>\u5bb9\u5668\u7aef<\/h3>\n<ul class=\"post-ul\">DockerFile<\/ul>\n<pre class=\"post-pre\"><code><span class=\"c\"># OS<\/span>\r\n<span class=\"k\">FROM<\/span><span class=\"s\"> centos:centos7<\/span>\r\n\r\n<span class=\"c\"># pkg install<\/span>\r\n<span class=\"k\">RUN <\/span>yum <span class=\"nb\">install<\/span> <span class=\"nt\">-y<\/span> epel-release <span class=\"o\">&amp;&amp;<\/span> <span class=\"se\">\\\r\n<\/span>    yum update <span class=\"nt\">-y<\/span>  <span class=\"o\">&amp;&amp;<\/span> <span class=\"se\">\\\r\n<\/span>    yum <span class=\"nb\">install<\/span> <span class=\"nt\">-y<\/span> openssh-server openssh-clients sshpass <span class=\"o\">&amp;&amp;<\/span> <span class=\"se\">\\\r\n<\/span>    yum <span class=\"nb\">install<\/span> <span class=\"nt\">-y<\/span> net-tools vim\r\n\r\n<span class=\"k\">ENV<\/span><span class=\"s\"> LANG ja_JP.UTF-8<\/span>\r\n\r\n<span class=\"c\"># root password<\/span>\r\n<span class=\"k\">RUN <\/span><span class=\"nb\">echo <\/span>password | passwd <span class=\"nt\">--stdin<\/span> root\r\n\r\n<span class=\"c\"># # sshd_config edit<\/span>\r\n<span class=\"k\">RUN <\/span><span class=\"nb\">sed<\/span> <span class=\"nt\">-ri<\/span> <span class=\"s2\">\"s\/#PermitRootLogin yes\/PermitRootLogin yes\/g\"<\/span> \/etc\/ssh\/sshd_config\r\n<span class=\"k\">RUN <\/span>systemctl <span class=\"nb\">enable <\/span>sshd.service\r\n\r\n<span class=\"k\">CMD<\/span><span class=\"s\"> [\"\/sbin\/init\"]<\/span>\r\n<\/code><\/pre>\n<p>\u4f7f\u7528ansible\u6765\u51c6\u5907\u8fde\u63a5\u5bb9\u5668\uff08\u6700\u521d\u6253\u7b97\u4f7f\u7528ssh\uff0c\u56e0\u6b64\u521b\u5efa\u4e86\u8be5\u5bb9\u5668\uff09\u3002<\/p>\n<ul class=\"post-ul\">docker-compose<\/ul>\n<pre class=\"post-pre\"><code><span class=\"na\">version<\/span><span class=\"pi\">:<\/span> <span class=\"s1\">'<\/span><span class=\"s\">3.7'<\/span>\r\n\r\n<span class=\"na\">services<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">srv1<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">build<\/span><span class=\"pi\">:<\/span>\r\n     <span class=\"na\">context<\/span><span class=\"pi\">:<\/span> <span class=\"s\">.<\/span>\r\n     <span class=\"na\">dockerfile<\/span><span class=\"pi\">:<\/span> <span class=\"s\">srv-dockerfile<\/span>\r\n    <span class=\"na\">hostname<\/span><span class=\"pi\">:<\/span> <span class=\"s\">srv1<\/span>\r\n    <span class=\"na\">container_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">srv1<\/span>\r\n    <span class=\"na\">environment<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">TZ=Asia\/Tokyo<\/span>\r\n    <span class=\"na\">restart<\/span><span class=\"pi\">:<\/span> <span class=\"s\">always<\/span>\r\n    <span class=\"na\">tty<\/span><span class=\"pi\">:<\/span> <span class=\"no\">true<\/span>\r\n    <span class=\"na\">networks<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"na\">app_net<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"na\">ipv4_address<\/span><span class=\"pi\">:<\/span> <span class=\"s\">172.16.238.101<\/span>\r\n\r\n  <span class=\"na\">srv2<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">build<\/span><span class=\"pi\">:<\/span>\r\n     <span class=\"na\">context<\/span><span class=\"pi\">:<\/span> <span class=\"s\">.<\/span>\r\n     <span class=\"na\">dockerfile<\/span><span class=\"pi\">:<\/span> <span class=\"s\">srv-dockerfile<\/span>\r\n    <span class=\"na\">hostname<\/span><span class=\"pi\">:<\/span> <span class=\"s\">srv2<\/span>\r\n    <span class=\"na\">container_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">srv2<\/span>\r\n    <span class=\"na\">environment<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">TZ=Asia\/Tokyo<\/span>\r\n    <span class=\"na\">restart<\/span><span class=\"pi\">:<\/span> <span class=\"s\">always<\/span>\r\n    <span class=\"na\">tty<\/span><span class=\"pi\">:<\/span> <span class=\"no\">true<\/span>\r\n    <span class=\"na\">networks<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"na\">app_net<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"na\">ipv4_address<\/span><span class=\"pi\">:<\/span> <span class=\"s\">172.16.238.102<\/span>\r\n\r\n<span class=\"c1\"># \u56fa\u5b9aIP\u4ed8\u4e0e\u7528\u306eNW\u8a2d\u5b9a<\/span>\r\n<span class=\"na\">networks<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">app_net<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">driver<\/span><span class=\"pi\">:<\/span> <span class=\"s\">bridge<\/span>\r\n    <span class=\"na\">ipam<\/span><span class=\"pi\">:<\/span>\r\n     <span class=\"na\">driver<\/span><span class=\"pi\">:<\/span> <span class=\"s\">default<\/span>\r\n     <span class=\"na\">config<\/span><span class=\"pi\">:<\/span>\r\n       <span class=\"pi\">-<\/span> <span class=\"na\">subnet<\/span><span class=\"pi\">:<\/span> <span class=\"s\">172.16.238.0\/24<\/span>\r\n<\/code><\/pre>\n<p>\u52a0\u4e0a\u56fa\u5b9aIP\uff0c\u770b\u8d77\u6765SSH\u4f1a\u65b9\u4fbf\u4e00\u4e9b\u3002<\/p>\n<h4>\u542f\u52a8\u5bb9\u5668\u3002<\/h4>\n<pre class=\"post-pre\"><code><span class=\"c\"># docker-compose up -d<\/span>\r\nStarting srv1 ... <span class=\"k\">done\r\n<\/span>Starting srv2 ... <span class=\"k\">done<\/span>\r\n<\/code><\/pre>\n<h3>ansible\u4fa7\u3002<\/h3>\n<ul class=\"post-ul\">hosts<\/ul>\n<pre class=\"post-pre\"><code><span class=\"pi\">[<\/span><span class=\"nv\">testGrp<\/span><span class=\"pi\">]<\/span>\r\n<span class=\"s\">172.16.238.101<\/span>\r\n<span class=\"s\">172.16.238.102<\/span>\r\n<\/code><\/pre>\n<ul class=\"post-ul\">yaml<\/ul>\n<pre class=\"post-pre\"><code><span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">start up a docker container<\/span>\r\n  <span class=\"na\">hosts<\/span><span class=\"pi\">:<\/span> <span class=\"s\">localhost<\/span>\r\n  <span class=\"na\">tasks<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">start up a docker container by running bash<\/span>\r\n      <span class=\"na\">command<\/span><span class=\"pi\">:<\/span> <span class=\"s\">docker-compose -f \/srv\/ansible\/docker-compose.yml up -d<\/span>\r\n  <span class=\"na\">tags<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"pi\">-<\/span> <span class=\"s\">never<\/span> <span class=\"c1\"># docker-compose\u3067\u300calwaus: restart\u300d\u3068\u3057\u3066\u3044\u308b\u306e\u3067\u3001\u666e\u6bb5\u306f\u52d5\u4f5c\u3057\u306a\u3044\u3088\u3046\u306b\u3057\u305f<\/span>\r\n\r\n<span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">connection test<\/span>\r\n  <span class=\"na\">hosts<\/span><span class=\"pi\">:<\/span> <span class=\"s\">testGrp<\/span>\r\n  <span class=\"na\">connection<\/span><span class=\"pi\">:<\/span> <span class=\"s\">docker<\/span> <span class=\"c1\">#connection plugin\u5229\u7528\u306e\u6307\u5b9a<\/span>\r\n  <span class=\"na\">tasks<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">ping<\/span>\r\n    <span class=\"na\">ping<\/span><span class=\"pi\">:<\/span>\r\n<\/code><\/pre>\n<h4>\u8fd0\u884cplaybook\u7684\u7ed3\u679c<\/h4>\n<pre class=\"post-pre\"><code><span class=\"c\"># ansible-playbook -i hosts test-ansible.yml --check --diff<\/span>\r\n\r\nPLAY <span class=\"o\">[<\/span>start up a docker container] <span class=\"k\">***********************************************************************************************************************************<\/span>\r\n\r\nPLAY <span class=\"o\">[<\/span>connection <span class=\"nb\">test<\/span><span class=\"o\">]<\/span> <span class=\"k\">***********************************************************************************************************************************************<\/span>\r\n\r\nTASK <span class=\"o\">[<\/span>Gathering Facts] <span class=\"k\">***********************************************************************************************************************************************<\/span>\r\nfatal: <span class=\"o\">[<\/span>172.16.238.101]: UNREACHABLE! <span class=\"o\">=&gt;<\/span> <span class=\"o\">{<\/span><span class=\"s2\">\"changed\"<\/span>: <span class=\"nb\">false<\/span>, <span class=\"s2\">\"msg\"<\/span>: <span class=\"s2\">\"Failed to create temporary directory.In some cases, you may have been able to authenticate and did not have permissions on the target directory. Consider changing the remote tmp path in ansible.cfg to a path rooted in <\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">\/tmp<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">, for more error information use -vvv. Failed command was: ( umask 77 &amp;&amp; mkdir -p <\/span><span class=\"se\">\\\"<\/span><span class=\"sb\">`<\/span> <span class=\"nb\">echo<\/span> ~\/.ansible\/tmp <span class=\"sb\">`<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">&amp;&amp; mkdir <\/span><span class=\"se\">\\\"<\/span><span class=\"sb\">`<\/span> <span class=\"nb\">echo<\/span> ~\/.ansible\/tmp\/ansible-tmp-1602479114.98-3164-90901945313893 <span class=\"sb\">`<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\"> &amp;&amp; echo ansible-tmp-1602479114.98-3164-90901945313893=<\/span><span class=\"se\">\\\"<\/span><span class=\"sb\">`<\/span> <span class=\"nb\">echo<\/span> ~\/.ansible\/tmp\/ansible-tmp-1602479114.98-3164-90901945313893 <span class=\"sb\">`<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\"> ), exited with result 1\"<\/span>, <span class=\"s2\">\"unreachable\"<\/span>: <span class=\"nb\">true<\/span><span class=\"o\">}<\/span>\r\nfatal: <span class=\"o\">[<\/span>172.16.238.102]: UNREACHABLE! <span class=\"o\">=&gt;<\/span> <span class=\"o\">{<\/span><span class=\"s2\">\"changed\"<\/span>: <span class=\"nb\">false<\/span>, <span class=\"s2\">\"msg\"<\/span>: <span class=\"s2\">\"Failed to create temporary directory.In some cases, you may have been able to authenticate and did not have permissions on the target directory. Consider changing the remote tmp path in ansible.cfg to a path rooted in <\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">\/tmp<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">, for more error information use -vvv. Failed command was: ( umask 77 &amp;&amp; mkdir -p <\/span><span class=\"se\">\\\"<\/span><span class=\"sb\">`<\/span> <span class=\"nb\">echo<\/span> ~\/.ansible\/tmp <span class=\"sb\">`<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">&amp;&amp; mkdir <\/span><span class=\"se\">\\\"<\/span><span class=\"sb\">`<\/span> <span class=\"nb\">echo<\/span> ~\/.ansible\/tmp\/ansible-tmp-1602479115.05-3165-268763785818242 <span class=\"sb\">`<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\"> &amp;&amp; echo ansible-tmp-1602479115.05-3165-268763785818242=<\/span><span class=\"se\">\\\"<\/span><span class=\"sb\">`<\/span> <span class=\"nb\">echo<\/span> ~\/.ansible\/tmp\/ansible-tmp-1602479115.05-3165-268763785818242 <span class=\"sb\">`<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\"> ), exited with result 1\"<\/span>, <span class=\"s2\">\"unreachable\"<\/span>: <span class=\"nb\">true<\/span><span class=\"o\">}<\/span>\r\n\r\nPLAY RECAP <span class=\"k\">***********************************************************************************************************************************************************<\/span>\r\n172.16.238.101             : <span class=\"nv\">ok<\/span><span class=\"o\">=<\/span>0    <span class=\"nv\">changed<\/span><span class=\"o\">=<\/span>0    <span class=\"nv\">unreachable<\/span><span class=\"o\">=<\/span>1    <span class=\"nv\">failed<\/span><span class=\"o\">=<\/span>0    <span class=\"nv\">skipped<\/span><span class=\"o\">=<\/span>0    <span class=\"nv\">rescued<\/span><span class=\"o\">=<\/span>0    <span class=\"nv\">ignored<\/span><span class=\"o\">=<\/span>0   \r\n172.16.238.102             : <span class=\"nv\">ok<\/span><span class=\"o\">=<\/span>0    <span class=\"nv\">changed<\/span><span class=\"o\">=<\/span>0    <span class=\"nv\">unreachable<\/span><span class=\"o\">=<\/span>1    <span class=\"nv\">failed<\/span><span class=\"o\">=<\/span>0    <span class=\"nv\">skipped<\/span><span class=\"o\">=<\/span>0    <span class=\"nv\">rescued<\/span><span class=\"o\">=<\/span>0    <span class=\"nv\">ignored<\/span><span class=\"o\">=<\/span>0   \r\n\r\n<\/code><\/pre>\n<p>\u6ca1\u6709\u53d1\u751f\u4efb\u4f55\u5931\u8d25\u3002<br \/>\n\u9519\u8bef\u4fe1\u606f\u4e2d\u63d0\u5230tmp\u6587\u4ef6\u5939\u53ef\u80fd\u6ca1\u6709\u6743\u9650\uff0c\u4f46\u662f\u6211\u89c9\u5f97\u4e0d\u53ef\u80fd\u662f\u6743\u9650\u4e0d\u8db3\u4e4b\u7c7b\u7684\u95ee\u9898\uff0c\u6240\u4ee5\u5c31\u6ca1\u5904\u7406\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c\"># docker-compose ps<\/span>\r\nName    Command     State   Ports\r\n<span class=\"nt\">---------------------------------<\/span>\r\nsrv1   \/sbin\/init   Up           \r\nsrv2   \/sbin\/init   Up\r\n<span class=\"c\"># docker inspect srv1 | grep IPv4Address<\/span>\r\n                        <span class=\"s2\">\"IPv4Address\"<\/span>: <span class=\"s2\">\"172.16.238.101\"<\/span>\r\n<span class=\"c\"># ping 172.16.238.101<\/span>\r\nPING 172.16.238.101 <span class=\"o\">(<\/span>172.16.238.101<span class=\"o\">)<\/span> 56<span class=\"o\">(<\/span>84<span class=\"o\">)<\/span> bytes of data.\r\n64 bytes from 172.16.238.101: <span class=\"nv\">icmp_seq<\/span><span class=\"o\">=<\/span>1 <span class=\"nv\">ttl<\/span><span class=\"o\">=<\/span>64 <span class=\"nb\">time<\/span><span class=\"o\">=<\/span>0.133 ms\r\n64 bytes from 172.16.238.101: <span class=\"nv\">icmp_seq<\/span><span class=\"o\">=<\/span>2 <span class=\"nv\">ttl<\/span><span class=\"o\">=<\/span>64 <span class=\"nb\">time<\/span><span class=\"o\">=<\/span>0.134 ms\r\n<\/code><\/pre>\n<p>\u4e3a\u4e86\u786e\u8ba4\u4e00\u4e0b\uff0c\u6211\u5355\u72ec\u6267\u884c\u4e86ping\u547d\u4ee4\uff0c\u7ed3\u679c\u662f\u6210\u529f\u7684\uff0c\u6240\u4ee5\u53ef\u4ee5\u786e\u5b9a\u5bb9\u5668\u672c\u8eab\u6ca1\u6709\u95ee\u9898\u3002<\/p>\n<h2>\u6210\u529f\u65f6\u7684\u8bbe\u7f6e sh\u00ed de<\/h2>\n<ul class=\"post-ul\">hosts<\/ul>\n<pre class=\"post-pre\"><code><span class=\"pi\">[<\/span><span class=\"nv\">testGrp<\/span><span class=\"pi\">]<\/span>\r\n<span class=\"c1\">#172.16.238.101<\/span>\r\n<span class=\"c1\">#172.16.238.102<\/span>\r\n<span class=\"s\">srv1<\/span>\r\n<span class=\"s\">srv2<\/span>\r\n<\/code><\/pre>\n<p>\u5728\u6d4f\u89c8\u4e86\u8bb8\u591a\u6709\u53c2\u8003\u4ef7\u503c\u7684\u6587\u7ae0\u540e\uff0c\u6211\u7a81\u7136\u610f\u8bc6\u5230\u6bcf\u7bc7\u6587\u7ae0\u5728\u4f7f\u7528\u63d2\u4ef6\u65f6\u90fd\u662f\u7528&#8221;\u4e3b\u673a\u540d&#8221;\u6765\u8fdb\u884c\u6307\u5b9a\uff08\u5728\u8fd9\u6bb5\u65f6\u95f4\u5185\u5df2\u7ecf\u534a\u5929\u8fc7\u53bb\u4e86\uff09\u3002<br \/>\n\u56e0\u6b64\uff0c\u6211\u51b3\u5b9a\u5c06\u76ee\u6807\u6307\u5b9a\u65b9\u5f0f\u4ece&#8221;IP&#8221;\u6539\u4e3a&#8221;\u5bb9\u5668\u540d&#8221;\u3002<br \/>\n\u203b\u9664\u6b64\u4e4b\u5916\uff0c\u6211\u8fd8\u5220\u9664\u4e86dockerfile\u4e2d\u7684ssh\u7b49\u5185\u5bb9\uff0c\u4f46\u8fd9\u4e0e\u6210\u529f\u65e0\u5173\uff0c\u6240\u4ee5\u4e0d\u518d\u8d58\u8ff0\u3002<\/p>\n<h4>\u6267\u884c\u7ed3\u679c<\/h4>\n<pre class=\"post-pre\"><code><span class=\"c\"># ansible-playbook -i hosts test-ansible.yml --check --diff<\/span>\r\n\r\nPLAY <span class=\"o\">[<\/span>start up a docker container] <span class=\"k\">***********************************************************************************************************************************<\/span>\r\n\r\nPLAY <span class=\"o\">[<\/span>connection <span class=\"nb\">test<\/span><span class=\"o\">]<\/span> <span class=\"k\">***********************************************************************************************************************************************<\/span>\r\n\r\nTASK <span class=\"o\">[<\/span>Gathering Facts] <span class=\"k\">***********************************************************************************************************************************************<\/span>\r\nok: <span class=\"o\">[<\/span>srv2]\r\nok: <span class=\"o\">[<\/span>srv1]\r\n\r\nTASK <span class=\"o\">[<\/span>ping] <span class=\"k\">**********************************************************************************************************************************************************<\/span>\r\nok: <span class=\"o\">[<\/span>srv2]\r\nok: <span class=\"o\">[<\/span>srv1]\r\n\r\nPLAY RECAP <span class=\"k\">***********************************************************************************************************************************************************<\/span>\r\nsrv1                       : <span class=\"nv\">ok<\/span><span class=\"o\">=<\/span>2    <span class=\"nv\">changed<\/span><span class=\"o\">=<\/span>0    <span class=\"nv\">unreachable<\/span><span class=\"o\">=<\/span>0    <span class=\"nv\">failed<\/span><span class=\"o\">=<\/span>0    <span class=\"nv\">skipped<\/span><span class=\"o\">=<\/span>0    <span class=\"nv\">rescued<\/span><span class=\"o\">=<\/span>0    <span class=\"nv\">ignored<\/span><span class=\"o\">=<\/span>0   \r\nsrv2                       : <span class=\"nv\">ok<\/span><span class=\"o\">=<\/span>2    <span class=\"nv\">changed<\/span><span class=\"o\">=<\/span>0    <span class=\"nv\">unreachable<\/span><span class=\"o\">=<\/span>0    <span class=\"nv\">failed<\/span><span class=\"o\">=<\/span>0    <span class=\"nv\">skipped<\/span><span class=\"o\">=<\/span>0    <span class=\"nv\">rescued<\/span><span class=\"o\">=<\/span>0    <span class=\"nv\">ignored<\/span><span class=\"o\">=<\/span>0   \r\n<\/code><\/pre>\n<p>\u80dc\u5229\u4e86\uff01<\/p>\n<h2>\u603b\u7ed3\u4e00\u4e0b<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u300cDocker connection plugin for Ansible\u300d\u3092\u5229\u7528\u3059\u308b\u3068\u30b3\u30f3\u30c6\u30ca\u5185\u306bsshd\u304c\u8981\u3089\u306a\u3044<\/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\">plugin\u3092\u5229\u7528\u3057\u3066\u63a5\u7d9a\u3059\u308b\u5834\u5408\u306f\u3001playbook\u3067\u300cconnection: docker\u300d\u3092\u6307\u5b9a\u3059\u308b<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u30db\u30b9\u30c8\u306e\u6307\u5b9a\u65b9\u6cd5\u306f\u5fc5\u305a\u300c\u30b3\u30f3\u30c6\u30ca\u540d\u300d\u3067\u6307\u5b9a\u3059\u308b<\/ul>\n<p>\u5373\u4f7f\u4e0d\u4ed4\u7ec6\u770b\uff0c\u4e5f\u53ef\u4ee5\u770b\u5230\u5305\u62ec\u5bb9\u5668\u540d\u79f0\u548c\u4e3b\u673a\u540d\u79f0\u5728\u5185\u7684\u5b98\u65b9\u6587\u4ef6\u4e2d\u6709\u6240\u5199\u660e\u3002\u4ece\u9a8c\u8bc1SSH\u8fde\u63a5\u5f00\u59cb\uff0c\u4e00\u76f4\u575a\u4fe1\u80fd\u591f\u56fa\u5b9aIP\u5e76\u8fdb\u884c\u6307\u5b9aIP\u8fde\u63a5\u7684\u6d4b\u8bd5\uff0c\u7136\u800c\u6700\u540e\u4ee5\u5931\u8d25\u544a\u7ec8&#8230;<\/p>\n<h2>\u672a\u89e3\u51b3\u7684\u95ee\u9898<\/h2>\n<ul class=\"post-ul\">ansible\u306e\u30b3\u30f3\u30c6\u30ca\u5316<\/ul>\n<p>\u5b9e\u9645\u4e0a\uff0c\u6211\u539f\u672c\u5e0c\u671b\u5c06\u6240\u6709\u4e1c\u897f\u90fd\u5728\u5bb9\u5668\u4e2d\u542f\u52a8\uff0c\u5305\u62ecAnsible\uff0c\u4f46\u662f\u5bb9\u5668\u5316\u540e\uff0c\u65e0\u6cd5\u901a\u8fc7\u76f8\u5e94\u7684\u63d2\u4ef6\u8bbf\u95ee\u5176\u4ed6\u5bb9\u5668\uff0c\u56e0\u6b64\u6682\u65f6\u76f4\u63a5\u5728\u4e3b\u673a\u4e0a\u5b89\u88c5\u4e86\u3002<br \/>\n\u6211\u770b\u5230\u6709\u4e00\u7bc7\u6587\u7ae0\u8bf4\u5982\u679c\u4f7f\u7528DooD\u53ef\u4ee5\u5b9e\u73b0\uff0c\u4f46\u5947\u602a\u7684\u662f\u5bb9\u5668\u65e0\u6cd5\u8bc6\u522b\uff0c\u5e76\u4e14\u65e0\u6cd5\u4f7f\u7528docker\u547d\u4ee4\u3002<br \/>\n\u55ef\uff0c\u867d\u7136\u8fd9\u4e0d\u662f\u4e3b\u8981\u95ee\u9898\uff0c\u4f46\u4ee5\u540e\u518d\u8bf4\u5427\u3002<\/p>\n<h2>\u8bf7\u67e5\u9605<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Ansible\u3067Docker\u30b3\u30f3\u30c6\u30ca\u3092\u64cd\u4f5c\u3057\u3066\u307f\u3088\u3046<\/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\">docker\u306e\u30b3\u30f3\u30c6\u30ca\u306b\u56fa\u5b9aIP\u3092\u632f\u308b(compose file version 3\u306e\u6ce8\u610f\u70b9)<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u30b3\u30f3\u30c6\u30ca\u304b\u3089\u30b3\u30f3\u30c6\u30ca\u3092\u64cd\u4f5c\u3059\u308b<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\u7b80\u8ff0 \u770b\u5230\u67d0\u4e2a\u7f51\u7ad9\u63d0\u5230ansible\u53ef\u80fd\u53ef\u4ee5\u6539\u53d8\u6309\u7167Excel\u64cd\u4f5c\u624b\u518c\u8fdb\u884c\u64cd\u4f5c\u7684\u73b0\u5b9e\uff0c\u6240\u4ee5\u6211\u5c1d\u8bd5\u4e86\u4e0edocke [&hellip;]<\/p>\n","protected":false},"author":6,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-42878","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>\u6211\u6700\u8fd1\u958b\u59cb\u4f7f\u7528ansible\u548cdocker\uff0c\u4e00\u958b\u59cb\u9047\u5230\u4e86\u56f0\u96e3\uff0c\u4f46\u7d42\u65bc\u6210\u529f\u555f\u52d5\u4e86 - 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\/\u6211\u6700\u8fd1\u958b\u59cb\u4f7f\u7528ansible\u548cdocker\uff0c\u4e00\u958b\u59cb\u9047\u5230\u4e86\u56f0\u96e3\uff0c\u4f46\u7d42\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u6211\u6700\u8fd1\u958b\u59cb\u4f7f\u7528ansible\u548cdocker\uff0c\u4e00\u958b\u59cb\u9047\u5230\u4e86\u56f0\u96e3\uff0c\u4f46\u7d42\u65bc\u6210\u529f\u555f\u52d5\u4e86\" \/>\n<meta property=\"og:description\" content=\"\u7b80\u8ff0 \u770b\u5230\u67d0\u4e2a\u7f51\u7ad9\u63d0\u5230ansible\u53ef\u80fd\u53ef\u4ee5\u6539\u53d8\u6309\u7167Excel\u64cd\u4f5c\u624b\u518c\u8fdb\u884c\u64cd\u4f5c\u7684\u73b0\u5b9e\uff0c\u6240\u4ee5\u6211\u5c1d\u8bd5\u4e86\u4e0edocke [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u6211\u6700\u8fd1\u958b\u59cb\u4f7f\u7528ansible\u548cdocker\uff0c\u4e00\u958b\u59cb\u9047\u5230\u4e86\u56f0\u96e3\uff0c\u4f46\u7d42\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2024-01-29T14:20:49+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-30T07:43:32+00:00\" \/>\n<meta name=\"author\" content=\"\u6587, \u7fd4\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u6587, \u7fd4\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 \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%e6%9c%80%e8%bf%91%e9%96%8b%e5%a7%8b%e4%bd%bf%e7%94%a8ansible%e5%92%8cdocker%ef%bc%8c%e4%b8%80%e9%96%8b%e5%a7%8b%e9%81%87%e5%88%b0%e4%ba%86%e5%9b%b0%e9%9b%a3%ef%bc%8c%e4%bd%86%e7%b5%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e6%9c%80%e8%bf%91%e9%96%8b%e5%a7%8b%e4%bd%bf%e7%94%a8ansible%e5%92%8cdocker%ef%bc%8c%e4%b8%80%e9%96%8b%e5%a7%8b%e9%81%87%e5%88%b0%e4%ba%86%e5%9b%b0%e9%9b%a3%ef%bc%8c%e4%bd%86%e7%b5%82\/\",\"name\":\"\u6211\u6700\u8fd1\u958b\u59cb\u4f7f\u7528ansible\u548cdocker\uff0c\u4e00\u958b\u59cb\u9047\u5230\u4e86\u56f0\u96e3\uff0c\u4f46\u7d42\u65bc\u6210\u529f\u555f\u52d5\u4e86 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2024-01-29T14:20:49+00:00\",\"dateModified\":\"2024-04-30T07:43:32+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/64d5cc7727fffbff2f9a2a8da1de3e5c\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e6%9c%80%e8%bf%91%e9%96%8b%e5%a7%8b%e4%bd%bf%e7%94%a8ansible%e5%92%8cdocker%ef%bc%8c%e4%b8%80%e9%96%8b%e5%a7%8b%e9%81%87%e5%88%b0%e4%ba%86%e5%9b%b0%e9%9b%a3%ef%bc%8c%e4%bd%86%e7%b5%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e6%9c%80%e8%bf%91%e9%96%8b%e5%a7%8b%e4%bd%bf%e7%94%a8ansible%e5%92%8cdocker%ef%bc%8c%e4%b8%80%e9%96%8b%e5%a7%8b%e9%81%87%e5%88%b0%e4%ba%86%e5%9b%b0%e9%9b%a3%ef%bc%8c%e4%bd%86%e7%b5%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e6%9c%80%e8%bf%91%e9%96%8b%e5%a7%8b%e4%bd%bf%e7%94%a8ansible%e5%92%8cdocker%ef%bc%8c%e4%b8%80%e9%96%8b%e5%a7%8b%e9%81%87%e5%88%b0%e4%ba%86%e5%9b%b0%e9%9b%a3%ef%bc%8c%e4%bd%86%e7%b5%82\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u6211\u6700\u8fd1\u958b\u59cb\u4f7f\u7528ansible\u548cdocker\uff0c\u4e00\u958b\u59cb\u9047\u5230\u4e86\u56f0\u96e3\uff0c\u4f46\u7d42\u65bc\u6210\u529f\u555f\u52d5\u4e86\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/64d5cc7727fffbff2f9a2a8da1de3e5c\",\"name\":\"\u6587, \u7fd4\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/920c3d673e0bccacc98e5e6b7149bb3c22edd8d39cb753e5d7d7e471498118a1?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/920c3d673e0bccacc98e5e6b7149bb3c22edd8d39cb753e5d7d7e471498118a1?s=96&d=mm&r=g\",\"caption\":\"\u6587, \u7fd4\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/wenxiang\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e6%9c%80%e8%bf%91%e9%96%8b%e5%a7%8b%e4%bd%bf%e7%94%a8ansible%e5%92%8cdocker%ef%bc%8c%e4%b8%80%e9%96%8b%e5%a7%8b%e9%81%87%e5%88%b0%e4%ba%86%e5%9b%b0%e9%9b%a3%ef%bc%8c%e4%bd%86%e7%b5%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u6211\u6700\u8fd1\u958b\u59cb\u4f7f\u7528ansible\u548cdocker\uff0c\u4e00\u958b\u59cb\u9047\u5230\u4e86\u56f0\u96e3\uff0c\u4f46\u7d42\u65bc\u6210\u529f\u555f\u52d5\u4e86 - 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\/\u6211\u6700\u8fd1\u958b\u59cb\u4f7f\u7528ansible\u548cdocker\uff0c\u4e00\u958b\u59cb\u9047\u5230\u4e86\u56f0\u96e3\uff0c\u4f46\u7d42\/","og_locale":"zh_CN","og_type":"article","og_title":"\u6211\u6700\u8fd1\u958b\u59cb\u4f7f\u7528ansible\u548cdocker\uff0c\u4e00\u958b\u59cb\u9047\u5230\u4e86\u56f0\u96e3\uff0c\u4f46\u7d42\u65bc\u6210\u529f\u555f\u52d5\u4e86","og_description":"\u7b80\u8ff0 \u770b\u5230\u67d0\u4e2a\u7f51\u7ad9\u63d0\u5230ansible\u53ef\u80fd\u53ef\u4ee5\u6539\u53d8\u6309\u7167Excel\u64cd\u4f5c\u624b\u518c\u8fdb\u884c\u64cd\u4f5c\u7684\u73b0\u5b9e\uff0c\u6240\u4ee5\u6211\u5c1d\u8bd5\u4e86\u4e0edocke [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u6211\u6700\u8fd1\u958b\u59cb\u4f7f\u7528ansible\u548cdocker\uff0c\u4e00\u958b\u59cb\u9047\u5230\u4e86\u56f0\u96e3\uff0c\u4f46\u7d42\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2024-01-29T14:20:49+00:00","article_modified_time":"2024-04-30T07:43:32+00:00","author":"\u6587, \u7fd4","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u6587, \u7fd4","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"3 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e6%9c%80%e8%bf%91%e9%96%8b%e5%a7%8b%e4%bd%bf%e7%94%a8ansible%e5%92%8cdocker%ef%bc%8c%e4%b8%80%e9%96%8b%e5%a7%8b%e9%81%87%e5%88%b0%e4%ba%86%e5%9b%b0%e9%9b%a3%ef%bc%8c%e4%bd%86%e7%b5%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e6%9c%80%e8%bf%91%e9%96%8b%e5%a7%8b%e4%bd%bf%e7%94%a8ansible%e5%92%8cdocker%ef%bc%8c%e4%b8%80%e9%96%8b%e5%a7%8b%e9%81%87%e5%88%b0%e4%ba%86%e5%9b%b0%e9%9b%a3%ef%bc%8c%e4%bd%86%e7%b5%82\/","name":"\u6211\u6700\u8fd1\u958b\u59cb\u4f7f\u7528ansible\u548cdocker\uff0c\u4e00\u958b\u59cb\u9047\u5230\u4e86\u56f0\u96e3\uff0c\u4f46\u7d42\u65bc\u6210\u529f\u555f\u52d5\u4e86 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2024-01-29T14:20:49+00:00","dateModified":"2024-04-30T07:43:32+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/64d5cc7727fffbff2f9a2a8da1de3e5c"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e6%9c%80%e8%bf%91%e9%96%8b%e5%a7%8b%e4%bd%bf%e7%94%a8ansible%e5%92%8cdocker%ef%bc%8c%e4%b8%80%e9%96%8b%e5%a7%8b%e9%81%87%e5%88%b0%e4%ba%86%e5%9b%b0%e9%9b%a3%ef%bc%8c%e4%bd%86%e7%b5%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e6%9c%80%e8%bf%91%e9%96%8b%e5%a7%8b%e4%bd%bf%e7%94%a8ansible%e5%92%8cdocker%ef%bc%8c%e4%b8%80%e9%96%8b%e5%a7%8b%e9%81%87%e5%88%b0%e4%ba%86%e5%9b%b0%e9%9b%a3%ef%bc%8c%e4%bd%86%e7%b5%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e6%9c%80%e8%bf%91%e9%96%8b%e5%a7%8b%e4%bd%bf%e7%94%a8ansible%e5%92%8cdocker%ef%bc%8c%e4%b8%80%e9%96%8b%e5%a7%8b%e9%81%87%e5%88%b0%e4%ba%86%e5%9b%b0%e9%9b%a3%ef%bc%8c%e4%bd%86%e7%b5%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u6211\u6700\u8fd1\u958b\u59cb\u4f7f\u7528ansible\u548cdocker\uff0c\u4e00\u958b\u59cb\u9047\u5230\u4e86\u56f0\u96e3\uff0c\u4f46\u7d42\u65bc\u6210\u529f\u555f\u52d5\u4e86"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/64d5cc7727fffbff2f9a2a8da1de3e5c","name":"\u6587, \u7fd4","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/920c3d673e0bccacc98e5e6b7149bb3c22edd8d39cb753e5d7d7e471498118a1?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/920c3d673e0bccacc98e5e6b7149bb3c22edd8d39cb753e5d7d7e471498118a1?s=96&d=mm&r=g","caption":"\u6587, \u7fd4"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/wenxiang\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e6%9c%80%e8%bf%91%e9%96%8b%e5%a7%8b%e4%bd%bf%e7%94%a8ansible%e5%92%8cdocker%ef%bc%8c%e4%b8%80%e9%96%8b%e5%a7%8b%e9%81%87%e5%88%b0%e4%ba%86%e5%9b%b0%e9%9b%a3%ef%bc%8c%e4%bd%86%e7%b5%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\/42878","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=42878"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/42878\/revisions"}],"predecessor-version":[{"id":92798,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/42878\/revisions\/92798"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=42878"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=42878"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=42878"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}