{"id":42788,"date":"2024-01-16T17:26:16","date_gmt":"2024-01-23T14:51:38","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8ansible%e8%bf%9b%e8%a1%8cazure%e4%b8%8a%e7%9a%84windows-10%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%e7%9a%84%e9%85%8d%e7%bd%ae%e5%92%8c%e5%b0%9d%e8%af%95win_dsc%e6%a8%a1%e5%9d%97%e3%80%82\/"},"modified":"2024-05-04T18:41:25","modified_gmt":"2024-05-04T10:41:25","slug":"%e4%bd%bf%e7%94%a8ansible%e8%bf%9b%e8%a1%8cazure%e4%b8%8a%e7%9a%84windows-10%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%e7%9a%84%e9%85%8d%e7%bd%ae%e5%92%8c%e5%b0%9d%e8%af%95win_dsc%e6%a8%a1%e5%9d%97%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8ansible%e8%bf%9b%e8%a1%8cazure%e4%b8%8a%e7%9a%84windows-10%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%e7%9a%84%e9%85%8d%e7%bd%ae%e5%92%8c%e5%b0%9d%e8%af%95win_dsc%e6%a8%a1%e5%9d%97%e3%80%82\/","title":{"rendered":"\u4f7f\u7528Ansible\u8fdb\u884cAzure\u4e0a\u7684Windows 10\u5f00\u53d1\u73af\u5883\u7684\u914d\u7f6e\u548c\u5c1d\u8bd5win_dsc\u6a21\u5757"},"content":{"rendered":"<p>\u8fd9\u7bc7\u6587\u7ae0\u662fFUJITSU Advent Calendar 2017\u7b2c13\u5929\u7684\u6587\u7ae0\u3002<br \/>\n\u5728\u7b2c11\u5929\u7684\u6587\u7ae0\u300a\u4f7f\u7528ansible\u5728\u8fdc\u7a0b\u7aef\u89e3\u538b\u591a\u4e2azip\u6587\u4ef6\u7684\u65b9\u6cd5\u300b\u4e4b\u540e\uff0c\u6211\u4eec\u5c06\u7ee7\u7eed\u8ba8\u8bbaAnsible\u3002<\/p>\n<p>\u6211\u57fa\u4e8e\u5fae\u8f6f\u4eca\u5e74\u53d1\u5e03\u7684\u4e24\u4e2a\u6211\u4e2a\u4eba\u8ba4\u4e3a\u975e\u5e38\u51fa\u8272\u7684\u529f\u80fd\uff0c\u5728Azure\u4e0a\u6784\u5efa\u4e86Windows\u5f00\u53d1\u73af\u5883\u3002\u53e6\u5916\uff0c\u6211\u8fd8\u4eb2\u81ea\u4f53\u9a8c\u4e86\u4eca\u5e749\u6708\u6b63\u5f0f\u53d1\u5e03\u7684Ansible 2.4\u4e2d\u65b0\u589e\u7684win_dsc\u6a21\u5757\u3002<\/p>\n<h2>\u592a\u957f\u6ca1\u770b\u3002<\/h2>\n<p>Nested Virtualization in Azure \u306f\u958b\u767a\u74b0\u5883\u306b\u3084\u3055\u3057\u3044<\/p>\n<p>Ansible on Windows Subsystem for Linux \u306f\u958b\u767a\u74b0\u5883\u306e\u6574\u5099\u306b\u4f7f\u3048\u308b<br \/>\nAnsible v2.4 \u304b\u3089\u5c0e\u5165\u3055\u308c\u305f win_dsc \u30e2\u30b8\u30e5\u30fc\u30eb\u306f\u3001Windows PowerShell Desired State Configuration \u306e \u7d44\u307f\u8fbc\u307f\u30ea\u30bd\u30fc\u30b9 \u3082\u3057\u304f\u306f PowerShell Gallery \u306b\u3042\u308b\u30ab\u30b9\u30bf\u30e0\u30ea\u30bd\u30fc\u30b9\u3092\u4f7f\u3044\u305f\u3044\u5834\u5408\u306b\u306f\u6709\u52b9<\/p>\n<h2>\u8bf7\u6ce8\u610f<\/h2>\n<blockquote><p>Windows Subsystem for Linux\u4e0d\u53d7Microsoft\u6216Ansible\u652f\u6301\uff0c\u4e0d\u5e94\u8be5\u7528\u4e8e\u751f\u4ea7\u7cfb\u7edf\u3002<br \/>\n&#8211; Ansible\u53ef\u4ee5\u5728Windows\u4e0a\u8fd0\u884c\u5417\uff1f- Ansible\u6587\u6863<\/p><\/blockquote>\n<p>\u8bf7\u6ce8\u610f\uff0c\u5728\u751f\u4ea7\u73af\u5883\u4e2d\uff0c\u4e0d\u652f\u6301\u5728 WSL \u4e0a\u8fd0\u884c Ansible\u3002<\/p>\n<h2>Ansible \u548c\u671f\u671b\u72b6\u6001\u914d\u7f6e<\/h2>\n<h3>\u5b89\u901f\u500d<\/h3>\n<p>\u7ea2\u5e3d\u63d0\u4f9b\u7684\u662f\u4e00\u6b3e\u7b80\u5355\u7684\u8fd0\u7ef4\u81ea\u52a8\u5316\u5de5\u5177\u3002\u5b83\u5728\u5f00\u6e90\u793e\u533a\u7684\u53d1\u5c55\u4e5f\u975e\u5e38\u6d3b\u8dc3\u3002\u5b83\u901a\u8fc7\u540d\u4e3aPlaybook\u7684YAML\u683c\u5f0f\u914d\u7f6e\u6587\u4ef6\uff0c\u4ee5\u58f0\u660e\u65b9\u5f0f\u63cf\u8ff0\u8d44\u6e90\u7684\u72b6\u6001\u3002\u4e0eChef\u6216Puppet\u7684\u533a\u522b\u53ef\u4ee5\u5728\uff20IT\u7684\u6587\u7ae0\u4e2d\u627e\u5230\u3002Ansible\u7684\u5f15\u64ce\u548c\u6a21\u5757\uff08\u5e93\uff09\u662f\u7528Python\u5f00\u53d1\u7684\uff0c\u4f46\u5bf9\u4e8eWindows\u6a21\u5757\u6765\u8bf4\uff0c\u5b83\u4e0e\u76ee\u6807\u673a\u5668\u7684\u8fde\u63a5\u4f7f\u7528\u7684\u662fWinRM\u534f\u8bae\uff0c\u4e0e\u4e4b\u9ad8\u5ea6\u517c\u5bb9\uff0c\u800c\u4e14\u4f7f\u7528Powershell\u6765\u5f00\u53d1\uff0c\u53ef\u4ee5\u83b7\u5f97.NET\u6846\u67b6\u7684\u597d\u5904\u3002<\/p>\n<p>Ansible \u63d0\u4f9b\u4e86\u4e00\u7cfb\u5217\u670d\u52a1\uff0c\u5305\u62ec Ansible Galaxy\uff08\u7528\u4e8e\u5171\u4eab\u5904\u7406\u5355\u5143\u7684\u89d2\u8272\uff09\uff0cAnsible Tower\uff08\u63d0\u4f9b GUI \u4eea\u8868\u76d8\u548c\u4efb\u52a1\u8c03\u5ea6\u529f\u80fd\uff09\uff0c\u4ee5\u53ca\u5176\u4e0a\u6e38\u7248\u672c AWX\u3002<\/p>\n<p>\u6b64\u5916\uff0c\u8fd8\u6709\u4e00\u79cd\u53eb\u505aAnsible Container\u7684\u5de5\u5177\uff0c\u53ef\u4ee5\u4f7f\u7528\u73b0\u6709\u7684Ansible Playbook\u521b\u5efa\u548c\u6267\u884c\u5bb9\u5668\u955c\u50cf\u3002<\/p>\n<h3>\u671f\u671b\u7684\u72b6\u6001\u914d\u7f6e<\/h3>\n<p>\u8fd9\u662f\u4e00\u4e2a\u57fa\u4e8e Microsoft \u63d0\u4f9b\u7684 Powershell \u7684\u914d\u7f6e\u7ba1\u7406\u5de5\u5177\u3002\u867d\u7136\u4e5f\u4ee5\u5f00\u6e90\u65b9\u5f0f\u516c\u5f00\uff0c\u4f46\u5f00\u53d1\u793e\u533a\u7684\u6d3b\u8dc3\u5ea6\u5e76\u4e0d\u9ad8\u3002DSC \u9996\u5148\u901a\u8fc7 WinRM \u8fde\u63a5\u5230\u76ee\u6807\u673a\u5668\uff0c\u7136\u540e\u5206\u522b\u6267\u884c\u4efb\u52a1\u7684\u4e09\u4e2a\u9636\u6bb5\uff1a\u83b7\u53d6\u5f53\u524d\u72b6\u6001\u3001\u68c0\u67e5\u662f\u5426\u9700\u8981\u8fdb\u884c\u914d\u7f6e\u66f4\u6539\u3001\u6267\u884c\u914d\u7f6e\u66f4\u6539\u3002\u5728 Ansible \u4e2d\u79f0\u4e4b\u4e3a\u6a21\u5757\uff0c\u800c\u5728 DSC \u4e2d\u79f0\u4e4b\u4e3a\u8d44\u6e90\u3002<\/p>\n<h3>\u80dc\u5229 \u7684 DSC \u6a21\u5757<\/h3>\n<p>Ansible\u7684win_dsc\u6a21\u5757\u662f\u4e00\u4e2a\u7528\u4e8e\u6267\u884c\u76ee\u6807\u4e3b\u673a\u4e0a\u5b58\u5728\u7684DSC\u8d44\u6e90\u7684\u5305\u88c5\u5668\u6a21\u5757\u3002\u6700\u521d\uff0c\u5b83\u662f\u4f5c\u4e3a\u975e\u5b98\u65b9\u6a21\u5757\u53d1\u5e03\u7684\uff0c\u4f46\u662f\u4ecev2.4\u5f00\u59cb\uff0c\u5b83\u7ec8\u4e8e\u6210\u4e3a\u5b98\u65b9\u6a21\u5757\u4e86\u3002\u53ef\u4ee5\u8bf4\uff0c\u5b83\u6210\u4e3a\u4e86\u5df2\u7ecf\u7a00\u7f3a\u7684Windows\u6a21\u5757\u7684\u6551\u4e16\u4e3b\uff0c\u8bb8\u591a\u4eba\u90fd\u671f\u5f85\u7740\u8fd9\u4e2a\u6a21\u5757\u7684\u5230\u6765\u3002 (\u9065\u8fdc\u7684\u76ee\u5149)<\/p>\n<h2>\u901a\u8fc7\u5b89\u88c5\u548c\u914d\u7f6eWindows Subsystem for Linux\uff0c\u4f7f\u5f97\u5728Windows\u64cd\u4f5c\u7cfb\u7edf\u4e0a\u80fd\u591f\u8fd0\u884cAnsible\u3002<\/h2>\n<p>\u8fd9\u6b21\u5728Azure\u4e0a\u521b\u5efa\u4e86\u652f\u6301\u5d4c\u5957\u865a\u62df\u5316\u7684Dv3\u5c3a\u5bf8\u865a\u62df\u673a\uff0c\u7136\u540e\u5728\u4e0a\u9762\u8fdb\u884c\u4e86\u5404\u79cd\u5c1d\u8bd5\u3002\u6211\u60f3\u8bd5\u8bd5WSL\uff0c\u6240\u4ee5\u4f7f\u7528\u4e86Windows 10 Pro\uff0c\u7248\u672c\u4e3a1709\u7684\u865a\u62df\u673a\u6620\u50cf\u3002\u867d\u7136Windows Server 2016\u4ece\u7248\u672c1709\u5f00\u59cb\u652f\u6301Semi-Anual Channel\u53d1\u5e03\uff0c\u4f46\u684c\u9762\u7248\u7684Windows Server\u4e0d\u652f\u6301\uff0c\u6240\u4ee5\u8fd9\u6b21\u9009\u62e9\u4e86Windows 10\u3002<\/p>\n<p>\u6b64\u5916\uff0c\u501f\u52a9\u4e8eVagrant\uff0c\u5728VirtualBox\u865a\u62df\u73af\u5883\u4e2d\u5efa\u7acb\u5ba2\u6237\u64cd\u4f5c\u7cfb\u7edf\uff08\u9a8c\u8bc1\u73af\u5883\uff09\uff0c\u5e76\u5c1d\u8bd5\u4f7f\u7528win_dsc\u6a21\u5757\u3002<\/p>\n<h3>\u4e3b\u673a\u64cd\u4f5c\u7cfb\u7edf\u7684\u914d\u7f6e<\/h3>\n<p>\u4e3b\u673a\u64cd\u4f5c\u7cfb\u7edf\u7684\u914d\u7f6e\u5982\u4e0b\u6240\u793a\u3002<\/p>\n<h4>Azure\u7684\u57fa\u7840\u8bbe\u65bd\u5373\u670d\u52a1<\/h4>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">VM \u30b5\u30a4\u30ba: Standard D2 v3 (2 vcpu \u6570\u30018 GB \u30e1\u30e2\u30ea)<\/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\">OS: Windows 10, Version 1709 (OS Build 16299.64)<\/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\">VirtualBox: v5.1.30<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">Vagrant: v2.0.1<\/ul>\n<h3>\u642d\u5efa Ansible \u6267\u884c\u73af\u5883<\/h3>\n<p>\u6211\u5728WSL\u4e0a\u4f7f\u7528\u4e86Ubuntu\u7684\u8f6f\u4ef6\u5305\u3002\u5173\u4e8e\u5b89\u88c5Ubuntu\u7684\u5177\u4f53\u6b65\u9aa4\uff0c\u8bf7\u53c2\u8003Build Insider\u7684\u6587\u7ae0\u3002<\/p>\n<pre class=\"post-pre\"><code>$ cat \/etc\/os-release\r\nNAME=\"Ubuntu\"\r\nVERSION=\"16.04.3 LTS (Xenial Xerus)\"\r\nID=ubuntu\r\nID_LIKE=debian\r\nPRETTY_NAME=\"Ubuntu 16.04.3 LTS\"\r\nVERSION_ID=\"16.04\"\r\nHOME_URL=\"http:\/\/www.ubuntu.com\/\"\r\nSUPPORT_URL=\"http:\/\/help.ubuntu.com\/\"\r\nBUG_REPORT_URL=\"http:\/\/bugs.launchpad.net\/ubuntu\/\"\r\nVERSION_CODENAME=xenial\r\nUBUNTU_CODENAME=xenial\r\n<\/code><\/pre>\n<p>\u67e5\u770b\u5b98\u65b9\u6587\u6863\u624d\u80fd\u51c6\u786e\u5b89\u88c5Ansible\uff0c\u4f46\u4ee5\u4e0b\u662f\u53c2\u8003\u6b65\u9aa4\u3002\u8fd9\u6b21\u6211\u4eec\u5c06\u914d\u7f6eCredSSP\u8ba4\u8bc1\uff0c\u5141\u8bb8\u59d4\u6d3e\u51ed\u636e\uff0c\u5373\u4f7f\u767b\u5f55\u57df\u8d26\u6237\u4e5f\u80fd\u987a\u5229\u5efa\u7acbWinRM\u8fde\u63a5\u3002<\/p>\n<pre class=\"post-pre\"><code>$ sudo apt-get update\r\n$ sudo apt-get install python-pip git libffi-dev libssl-dev -y\r\n$ sudo pip install --upgrade pip\r\n$ sudo pip install ansible pywinrm\r\n$ sudo pip install pywinrm[credssp]\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code>$ ansible --version\r\nansible 2.4.1.0\r\n  config file = None\r\n  configured module search path = [u'\/home\/toversus\/.ansible\/plugins\/modules', u'\/usr\/share\/ansible\/plugins\/modules']\r\n  ansible python module location = \/home\/toversus\/.local\/lib\/python2.7\/site-packages\/ansible\r\n  executable location = \/home\/toversus\/.local\/bin\/ansible\r\n  python version = 2.7.12 (default, Nov 19 2016, 06:48:10) [GCC 5.4.0 20160609]\r\n<\/code><\/pre>\n<h4>\u786e\u8ba4\u4e0e\u4e3b\u673a\u64cd\u4f5c\u7cfb\u7edf\u7684\u8fde\u63a5<\/h4>\n<p>\u5728\u4e3b\u673a\u64cd\u4f5c\u7cfb\u7edf\u4e0a\u6267\u884cAnsible\u5b98\u65b9\u63d0\u4f9b\u7684\u7528\u4e8eWindows\u73af\u5883\u7684\u8bbe\u7f6e\u811a\u672cexamples\/scripts\/ConfigureRemotingForAnsible.ps1\u3002<\/p>\n<pre class=\"post-pre\"><code>PS &gt; Invoke-WebRequest `\r\n-Uri https:\/\/raw.githubusercontent.com\/ansible\/ansible\/devel\/examples\/scripts\/ConfigureRemotingForAnsible.ps1 `\r\n-OutFile ConfigureRemotingForAnsible.ps1\r\nPS &gt; powershell -ExecutionPolicy RemoteSigned .\\ConfigureRemotingForAnsible.ps1 -EnableCredSSP\r\n<\/code><\/pre>\n<p>\u521b\u5efa\u4e00\u4e2a\u6e05\u5355\u6587\u4ef6\uff0c\u5e76\u5199\u4e0b\u8fde\u63a5\u76ee\u6807\u673a\u5668\u7684\u4fe1\u606f\u3002<\/p>\n<pre class=\"post-pre\"><code>[windows]\r\nlocalhost\r\n\r\n[windows:vars]\r\nansible_user=&lt;your_account&gt;\r\nansible_password=&lt;your_password&gt;\r\nansible_port=5986\r\nansible_connection=winrm\r\nansible_winrm_server_cert_validation=ignore\r\n<\/code><\/pre>\n<p>\u4f7f\u7528win_ping\u6a21\u5757\u5bf9\u6258\u7ba1\u64cd\u4f5c\u7cfb\u7edf\u8fdb\u884c\u8fde\u901a\u6027\u68c0\u67e5\u3002<\/p>\n<pre class=\"post-pre\"><code>$ ansible windows -m win_ping -i development\r\nlocalhost | SUCCESS =&gt; {\r\n    \"changed\": false,\r\n    \"failed\": false,\r\n    \"ping\": \"pong\"\r\n}\r\n<\/code><\/pre>\n<p>\u6210\u529f\u8fde\u63a5\u5230\u4e3b\u64cd\u4f5c\u7cfb\u7edf\uff0c\u6ca1\u6709\u4efb\u4f55\u95ee\u9898\u3002<\/p>\n<h4>\u5982\u679c\u9047\u5230SSL\u76f8\u5173\u7684\u9519\u8bef&#8230;<\/h4>\n<pre class=\"post-pre\"><code>localhost | UNREACHABLE! =&gt; {\r\n    \"changed\": false,\r\n    \"msg\": \"ssl: HTTPSConnectionPool(host='localhost', port=5986): Max retries exceeded with url: \/wsman (Caused by SSLError(SSLError(\\\"bad handshake: SysCallError(-1, 'Unexpected EOF')\\\",),))\",\r\n    \"unreachable\": true\r\n}\r\n<\/code><\/pre>\n<p>\u4f7f\u7528&#8221;ConfigureRemotingForAnsible.ps1&#8243;\u811a\u672c\u65f6\uff0c\u4f20\u9012&#8221;-ForceNewSSLCert&#8221;\u9009\u9879\uff0c\u91cd\u65b0\u751f\u6210\u81ea\u7b7e\u540d\u8bc1\u4e66\u3002<\/p>\n<pre class=\"post-pre\"><code>PS &gt; powershell -ExecutionPolicy RemoteSigned .\\ConfigureRemotingForAnsible.ps1 -ForceNewSSLCert\r\n<\/code><\/pre>\n<p>\u53c2\u8003\uff1a\u521b\u5efa\u4e00\u4e2aWindows\u4e3b\u673a<\/p>\n<h2>\u5f00\u53d1\u73af\u5883\u7684\u51c6\u5907<\/h2>\n<p>\u65e2\u7136\u5982\u6b64\uff0c\u6211\u5011\u53ef\u4ee5\u8a66\u8a66\u7528WSL\u4e0a\u7684Ansible\u4f86\u642d\u5efa\u5bbf\u4e3b\u64cd\u4f5c\u7cfb\u7d71\u4f5c\u70ba\u958b\u767c\u74b0\u5883\u3002<\/p>\n<h3>\u4f5c\u696d\u76ee\u9304\u7684\u7d50\u69cb<\/h3>\n<p>\u6211\u53c2\u8003\u4e86Ansible\u6700\u4f73\u5b9e\u8df5\u4e2d\u63d0\u5230\u7684\u76ee\u5f55\u7ed3\u6784\u3002<\/p>\n<pre class=\"post-pre\"><code>$ tree\r\n.\r\n\u251c\u2500\u2500 ansible.cfg\r\n\u251c\u2500\u2500 dev4win.yml\r\n\u251c\u2500\u2500 development\r\n\u2514\u2500\u2500 roles\r\n\u00a0\u00a0 \u2514\u2500\u2500 dev4win\r\n\u00a0\u00a0     \u251c\u2500\u2500 handlers\r\n\u00a0\u00a0     \u2502\u00a0\u00a0 \u2514\u2500\u2500 main.yml\r\n\u00a0\u00a0     \u2514\u2500\u2500 tasks\r\n\u00a0\u00a0         \u2514\u2500\u2500 main.yml\r\n\r\n4 directories, 5 files\r\n<\/code><\/pre>\n<h3>\u521b\u5efaansible.cfg\u6587\u4ef6<\/h3>\n<p>\u7531\u4e8e\u6bcf\u6b21\u6267\u884c Playbook \u5931\u8d25\u65f6\u90fd\u4f1a\u521b\u5efa .retry \u6587\u4ef6\uff0c\u8fd9\u8ba9\u4eba\u611f\u5230\u538c\u70e6\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u8bbe\u7f6e\u4e3a\u4e0d\u521b\u5efa .retry \u6587\u4ef6\u3002\u540c\u65f6\uff0c\u8fd8\u4f1a\u8bbe\u7f6e\u4fdd\u5b58 Ansible \u6267\u884c\u65e5\u5fd7\u3002<\/p>\n<pre class=\"post-pre\"><code>[defaults]\r\nretry_files_enabled = False\r\nlog_path=\/var\/tmp\/ansible.log\r\n<\/code><\/pre>\n<h3>\u5904\u7406\u7a0b\u5e8f\u7684\u5b9a\u4e49<\/h3>\n<p>\u7576\u7279\u5b9a\u4efb\u52d9\u88ab\u57f7\u884c\u4e26\u4e14\u72c0\u614b\u767c\u751f\u8b8a\u5316\uff08\u8fd4\u56de\u4e86&#8221;changed&#8221;\uff09\uff0c\u6211\u5011\u53ef\u4ee5\u5b9a\u7fa9\u4e00\u500b\u4ee5\u6b64\u70ba\u89f8\u767c\u689d\u4ef6\u7684\u4efb\u52d9\u3002\u4f8b\u5982\uff0c\u5982\u679c\u53ea\u60f3\u5728\u57f7\u884c\u67d0\u500b\u4efb\u52d9\u6642\u91cd\u65b0\u555f\u52d5\u6a5f\u5668\uff0c\u53ef\u4ee5\u4f7f\u7528\u9019\u500b\u65b9\u6cd5\u3002\u95dc\u65bc\u5176\u4ed6 handlers \u7684\u7279\u9ede\uff0c\u53ef\u53c3\u8003\u300aAnsible\uff1a\u4e86\u89e3notify\u548chandlers\u7684\u7528\u6cd5\u300b\u4e00\u6587\u4e2d\u6709\u8a73\u7d30\u4ecb\u7d39\u3002<\/p>\n<pre class=\"post-pre\"><code>- name: reboot a machine\r\n  win_reboot:\r\n    reboot_timeout_sec: 6000\r\n    test_command: whoami\r\n\r\n- name: restart Explorer process\r\n  win_shell: Stop-Process -Name Explorer\r\n<\/code><\/pre>\n<h3>\u4efb\u52a1\u7684\u5b9a\u4e49<\/h3>\n<p>\u4efb\u52a1\u5b9a\u4e49\u7684\u5185\u5bb9\u5982\u4e0b:<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u30b7\u30b9\u30c6\u30e0\u30ed\u30b1\u30fc\u30eb\u306e\u5909\u66f4<\/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\">\u30ed\u30b0\u30a4\u30f3\u30e6\u30fc\u30b6\u30fc\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u7121\u671f\u9650\u5316<\/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\">\u300c\u81ea\u52d5\u7684\u306b\u73fe\u5728\u306e\u30d5\u30a9\u30eb\u30c0\u30fc\u307e\u3067\u5c55\u958b\u3059\u308b\u300d\u3092\u6709\u52b9\u5316<\/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\">\u300c\u30d5\u30a1\u30a4\u30eb\u540d\u62e1\u5f35\u5b50\u306e\u8868\u793a\u300d\u3092\u6709\u52b9\u5316<\/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\">\u30d5\u30a1\u30a4\u30a2\u30a6\u30a9\u30fc\u30eb\u306e\u53d7\u4fe1\u30eb\u30fc\u30eb\u3067 ping \u3092\u53d7\u3051\u4ed8\u3051\u308b\u3088\u3046\u8a2d\u5b9a<\/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\">chocolatey \u7d4c\u7531\u3067\u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/ul>\n<\/li>\n<\/ul>\n<p>chocolatey \u3067\u5165\u624b\u3057\u305f\u3044\u30d1\u30c3\u30b1\u30fc\u30b8\u306f\u3053\u3053\u3067\u63a2\u305b\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code>- name: Get current system locale\r\n  win_shell: (Get-WinSystemLocale).Name\r\n  register: locale\r\n  changed_when: false\r\n\r\n- name: Set system locale to ja-JP\r\n  win_shell: Set-WinSystemLocale ja-JP\r\n  when: locale.stdout.find('ja-JP') == -1\r\n  notify: reboot a machine\r\n\r\n- name: Set individual user's password to never expire\r\n  win_user:\r\n    name: \"{{ ansible_env.USERNAME }}\"\r\n    password_expired: no\r\n\r\n- name: Enable automatically expand to current folder option\r\n  win_regedit:\r\n    path: HKCU:\\\\Software\\\\Microsoft\/Windows\\\\CurrentVersion\\\\Explorer\\\\Advanced\r\n    name: NavPaneExpandToCurrentFolder\r\n    data: 1\r\n    type: dword\r\n  notify: restart Explorer process\r\n\r\n- name: Show file name extentions\r\n  win_regedit:\r\n    path: HKCU:\\\\Software\\\\Microsoft\/Windows\\\\CurrentVersion\\\\Explorer\\\\Advanced\r\n    name: HideFileExt\r\n    data: 0\r\n    type: dword\r\n  notify: restart Explorer process\r\n\r\n- name: Enable firewall rule for receiving echo request\r\n  win_firewall_rule:\r\n    name: Virtual Machine Monitoring (Echo Request - ICMPv4-In)\r\n    direction: in\r\n    action: allow\r\n\r\n- name: Install latest packages via chocolatey\r\n  win_chocolatey:\r\n    name: \"{{ item }}\"\r\n    state: latest\r\n  with_items:\r\n    - chocolatey-core.extension\r\n    - 7zip.install\r\n    - visualstudiocode\r\n    - sourcetree\r\n    - teraterm\r\n    - git\r\n\r\n- name: Install fixed verion of packages via chocolatey\r\n  win_chocolatey:\r\n    name: \"{{ item.name }}\"\r\n    version: \"{{ item.version}}\"\r\n    state: present\r\n  with_items:\r\n    - name: virtualbox\r\n      version: 5.1.30\r\n    - name: vagrant\r\n      version: 2.0.1\r\n    - name: nodejs.install\r\n      version: 6.12.1\r\n    - name: nvm\r\n      version: 1.1.5\r\n    - name: googlechrome\r\n      version: 62.0.3202.94\r\n    - name: selenium-chrome-driver\r\n      version: 2.33\r\n<\/code><\/pre>\n<h3>\u521b\u5efaPlaybook<\/h3>\n<p>\u521b\u5efaPlaybook\uff0c\u5e76\u5bfc\u5165\u521a\u521a\u5b9a\u4e49\u7684\u4efb\u52a1\u3002<\/p>\n<pre class=\"post-pre\"><code>- hosts: windows\r\n  gather_facts: yes\r\n  tasks:\r\n    - import_tasks: roles\/dev4win\/tasks\/main.yml\r\n  handlers:\r\n    - import_tasks: roles\/dev4win\/handlers\/main.yml\r\n<\/code><\/pre>\n<h3>\u6267\u884cPlaybook<\/h3>\n<p>\u5728\u6267\u884c\u5b8c\u6240\u6709\u4efb\u52a1\u540e\uff0c\u5c06\u6267\u884c\u5728handlers\u4e2d\u5b9a\u4e49\u7684\u4e3b\u673a\u64cd\u4f5c\u7cfb\u7edf\u7684\u91cd\u65b0\u542f\u52a8\u3002<\/p>\n<pre class=\"post-pre\"><code>$ ansible-playbook dev4win.yml -i development\r\n\r\nPLAY [windows] *************************************************************************************************************\r\n\r\nTASK [Gathering Facts] *************************************************************************************************\r\nok: [localhost]\r\n\r\nTASK [Get current system locale] ***************************************************************************************\r\nok: [localhost]\r\n\r\nTASK [Set system locale to ja-JP] **************************************************************************************\r\nchanged: [localhost]\r\n\r\nTASK [Set individual user's password to never expire] ******************************************************************\r\nok: [localhost]\r\n\r\nTASK [Enable automatically expand to current folder option] ************************************************************\r\nchanged: [localhost]\r\n\r\nTASK [Show file name extentions] ***************************************************************************************\r\nchanged: [localhost]\r\n\r\nTASK [Enable firewall rule for receiving echo request] *****************************************************************\r\nchanged: [localhost]\r\n\r\nTASK [Install latest packages via chocolatey] **************************************************************************\r\nchanged: [localhost] =&gt; (item=chocolatey-core.extension)\r\nchanged: [localhost] =&gt; (item=7zip.install)\r\nchanged: [localhost] =&gt; (item=visualstudiocode)\r\nchanged: [localhost] =&gt; (item=sourcetree)\r\nchanged: [localhost] =&gt; (item=teraterm)\r\nchanged: [localhost] =&gt; (item=git)\r\n [WARNING]: Chocolatey was missing from this system, so it was installed during this task run.\r\n\r\n\r\nTASK [Install fixed verion of packages via chocolatey] **************************************************************************\r\nchanged: [localhost] =&gt; (item={u'version': u'5.1.30', u'name': u'virtualbox'})\r\nchanged: [localhost] =&gt; (item={u'version': u'2.0.1', u'name': u'vagrant'})\r\nchanged: [localhost] =&gt; (item={u'version': u'6.12.1', u'name': u'nodejs.install'})\r\nchanged: [localhost] =&gt; (item={u'version': u'1.1.5', u'name': u'nvm'})\r\nchanged: [localhost] =&gt; (item={u'version': u'62.0.3202.94', u'name': u'googlechrome'})\r\nchanged: [localhost] =&gt; (item={u'version': u'2.33', u'name': u'selenium-chrome-driver'})\r\n<\/code><\/pre>\n<h3>\u5b9a\u4e49\u989d\u5916\u4efb\u52a1<\/h3>\n<p>\u6211\u5c06\u5c1d\u8bd5\u5b9a\u4e49\u4ee5\u4e0b\u9644\u52a0\u4efb\u52a1\uff1a<br \/>\n&#8211; \u5b89\u88c5GO<br \/>\n&#8211; \u521b\u5efaGO\u7684\u5de5\u4f5c\u6587\u4ef6\u5939<br \/>\n&#8211; \u5c06GOPATH\u6dfb\u52a0\u5230\u7528\u6237\u73af\u5883\u53d8\u91cf\u4e2d<\/p>\n<p>\u56e0\u4e3a\u4ece\u5934\u5f00\u59cb\u6267\u884c\u6240\u6709\u4efb\u52a1\u5f88\u70e6\u7410\uff0c\u6240\u4ee5\u6211\u4eec\u5c06\u8bbe\u7f6e\u6807\u7b7e\uff0c\u53ea\u6267\u884c\u9644\u52a0\u4efb\u52a1\u3002<\/p>\n<pre class=\"post-pre\"><code>- name: Install Golang v1.9.2 via chocolatey\r\n  win_chocolatey:\r\n    name: golang\r\n    version: 1.9.2\r\n    state: present\r\n  tags: golang\r\n\r\n- name: Create Go workplace\r\n  win_file:\r\n    path: \"{{ ansible_env.USERPROFILE }}\/go\"\r\n    state: directory\r\n  tags: golang\r\n\r\n- name: Set GOPATH environment variable for current user\r\n  win_path:\r\n    name: GOPATH\r\n    elements: \"{{ ansible_env.USERPROFILE }}\/go\"\r\n    scope: user\r\n    state: present\r\n  tags: golang\r\n<\/code><\/pre>\n<h3>\u6267\u884c\u989d\u5916\u4efb\u52a1<\/h3>\n<p>\u53ea\u9700\u901a\u8fc7\u6307\u5b9a tags \u9009\u9879\uff0c\u5c31\u53ef\u4ee5\u6267\u884c\u7279\u5b9a\u7684\u4efb\u52a1\u3002<\/p>\n<pre class=\"post-pre\"><code>$ ansible-playbook dev4win.yml -i development --tags golang\r\n\r\nPLAY [windows] **************************************************************************************\r\n\r\nTASK [Gathering Facts] ******************************************************************************\r\nok: [localhost]\r\n\r\nTASK [Install Golang v1.9.2 via chocolatey] *********************************************************\r\nchanged: [localhost]\r\n\r\nTASK [Create Go workplace] **************************************************************************\r\nchanged: [localhost]\r\n\r\nTASK [Set GOPATH environment variable for current user] *********************************************\r\nchanged: [localhost]\r\n\r\nPLAY RECAP ******************************************************************************************\r\nlocalhost                  : ok=4    changed=3    unreachable=0    failed=0\r\n<\/code><\/pre>\n<p>\u4ee5\u4e0a\u662fWindows 10\u5f00\u53d1\u73af\u5883\u7684\u51c6\u5907\u5de5\u4f5c\u5b8c\u6210\u3002<\/p>\n<h2>\u5728VirtualBox\u4e2d\u642d\u5efaWindows Server 2016\u8bc4\u4f30\u7248\u3002<\/h2>\n<p>\u6211\u4f7f\u7528\u4e86\u201cgusztavvargadr\/w16s Vagrant box\u201d\u4f5c\u4e3a\u57fa\u7840\u7684 Vagrant box\u3002<\/p>\n<p>\u4ee5\u4e0b\u662f\u521b\u5efa\u7684Vagrantfile\u5185\u5bb9\uff1a&#8221;config.winrm.retry_limit&#8221;\u548c&#8221;config.winrm.retry_delay&#8221;\u662f\u4e3a\u4e86\u89e3\u51b3\u865a\u62df\u673a\u542f\u52a8\u8d85\u65f6\u9891\u7e41\u800c\u6dfb\u52a0\u7684\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c1\"># -*- mode: ruby -*-<\/span>\r\n<span class=\"c1\"># vi: set ft=ruby :<\/span>\r\n\r\n<span class=\"no\">Vagrant<\/span><span class=\"p\">.<\/span><span class=\"nf\">configure<\/span><span class=\"p\">(<\/span><span class=\"s2\">\"2\"<\/span><span class=\"p\">)<\/span> <span class=\"k\">do<\/span> <span class=\"o\">|<\/span><span class=\"n\">config<\/span><span class=\"o\">|<\/span>\r\n  <span class=\"n\">config<\/span><span class=\"p\">.<\/span><span class=\"nf\">vm<\/span><span class=\"p\">.<\/span><span class=\"nf\">box<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">\"gusztavvargadr\/w16s\"<\/span>\r\n  <span class=\"n\">config<\/span><span class=\"p\">.<\/span><span class=\"nf\">vm<\/span><span class=\"p\">.<\/span><span class=\"nf\">network<\/span> <span class=\"s2\">\"private_network\"<\/span><span class=\"p\">,<\/span> <span class=\"ss\">ip: <\/span><span class=\"s2\">\"192.168.56.10\"<\/span>\r\n  <span class=\"n\">config<\/span><span class=\"p\">.<\/span><span class=\"nf\">winrm<\/span><span class=\"p\">.<\/span><span class=\"nf\">retry_limit<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">30<\/span>\r\n  <span class=\"n\">config<\/span><span class=\"p\">.<\/span><span class=\"nf\">winrm<\/span><span class=\"p\">.<\/span><span class=\"nf\">retry_delay<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">20<\/span>\r\n  <span class=\"n\">config<\/span><span class=\"p\">.<\/span><span class=\"nf\">vm<\/span><span class=\"p\">.<\/span><span class=\"nf\">provider<\/span> <span class=\"s2\">\"virtualbox\"<\/span> <span class=\"k\">do<\/span> <span class=\"o\">|<\/span><span class=\"n\">vb<\/span><span class=\"o\">|<\/span>\r\n    <span class=\"n\">vb<\/span><span class=\"p\">.<\/span><span class=\"nf\">gui<\/span> <span class=\"o\">=<\/span> <span class=\"kp\">true<\/span>\r\n    <span class=\"n\">vb<\/span><span class=\"p\">.<\/span><span class=\"nf\">name<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">\"win2016-test01\"<\/span>\r\n    <span class=\"n\">vb<\/span><span class=\"p\">.<\/span><span class=\"nf\">memory<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">\"2048\"<\/span>\r\n    <span class=\"n\">vb<\/span><span class=\"p\">.<\/span><span class=\"nf\">cpus<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span>\r\n    <span class=\"n\">vb<\/span><span class=\"p\">.<\/span><span class=\"nf\">customize<\/span> <span class=\"p\">[<\/span> <span class=\"s2\">\"modifyvm\"<\/span><span class=\"p\">,<\/span> <span class=\"ss\">:id<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"--clipboard\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"bidirectional\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"--draganddrop\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"bidirectional\"<\/span> <span class=\"p\">]<\/span>\r\n  <span class=\"k\">end<\/span>\r\n<span class=\"k\">end<\/span>\r\n<\/code><\/pre>\n<ul class=\"post-ul\">Windows Server 2016 \u8a55\u4fa1\u7248 box \u3092\u8d77\u52d5\u3057\u307e\u3059\u3002<\/ul>\n<pre class=\"post-pre\"><code>PS&gt; vagrant up\r\n<\/code><\/pre>\n<h3>\u5728\u5bbf\u4e3b\u64cd\u4f5c\u7cfb\u7edf\u4e2d\u8bbe\u7f6eWinRM<\/h3>\n<p>\u56e0\u4e3a\u4e0e\u4e3b\u673a\u64cd\u4f5c\u7cfb\u7edf\u76f8\u540c\uff0c\u6240\u4ee5\u6211\u7701\u7565\u4e86\u3002<\/p>\n<h3>\u786e\u8ba4\u64cd\u4f5c<\/h3>\n<p>\u5c06\u8fde\u63a5\u4fe1\u606f\u6dfb\u52a0\u5230hosts\u6587\u4ef6\u4e2d\u3002<\/p>\n<pre class=\"post-pre\"><code>[winservers]\r\n192.168.56.10\r\n\r\n[winservers:vars]\r\nansible_user=vagrant\r\nansible_password=vagrant\r\nansible_port=5986\r\nansible_connection=winrm\r\nansible_winrm_server_cert_validation=ignore\r\nansible_winrm_transport=credssp\r\n<\/code><\/pre>\n<p>\u901a\u8fc7 win_ping \u6a21\u5757\u8fdb\u884c\u8fde\u901a\u6027\u6d4b\u8bd5\u3002<\/p>\n<pre class=\"post-pre\"><code>$ ansible winservers -m win_ping -i staging\r\n192.168.56.10 | SUCCESS =&gt; {\r\n    \"changed\": false,\r\n    \"failed\": false,\r\n    \"ping\": \"pong\"\r\n}\r\n<\/code><\/pre>\n<h3>\u4f7f\u7528 win_dsc \u6a21\u5757<\/h3>\n<p>\u4ece\u8fd9\u91cc\u5f00\u59cb\u8fdb\u5165\u6b63\u9898\u3002<br \/>\n\u672c\u6b21\u6211\u4eec\u5c06\u64cd\u4f5c xCertificate \u8d44\u6e90\uff0c\u5c1d\u8bd5\u5c06 .pfx \u6587\u4ef6\u8bc1\u4e66\u5bfc\u5165\u8bc1\u4e66\u5b58\u50a8\u3002<\/p>\n<h4>\u4f5c\u696d\u76ee\u9304\u7684\u7d44\u6210<\/h4>\n<pre class=\"post-pre\"><code>$ tree\r\n.\r\n\u251c\u2500\u2500 ansible.cfg\r\n\u251c\u2500\u2500 dev4win.yml\r\n\u251c\u2500\u2500 development\r\n\u251c\u2500\u2500 roles\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 common\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 certs\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 myserver.pfx\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 dev4win\r\n\u2502\u00a0\u00a0     \u251c\u2500\u2500 handlers\r\n\u2502\u00a0\u00a0     \u2502\u00a0\u00a0 \u2514\u2500\u2500 main.yml\r\n\u2502\u00a0\u00a0     \u2514\u2500\u2500 tasks\r\n\u2502\u00a0\u00a0         \u2514\u2500\u2500 main.yml\r\n\u251c\u2500\u2500 staging\r\n\u2514\u2500\u2500 winservers.yml\r\n\r\n7 directories, 9 files\r\n<\/code><\/pre>\n<h4>\u4efb\u52a1\u7684\u5b9a\u4e49<\/h4>\n<p>\u60a8\u53ef\u4ee5\u5728\u6b64\u5904\u67e5\u770b\u6709\u5173 xCertificate \u8d44\u6e90\u6240\u9700\u7684\u53c2\u6570\u3002\u53ef\u4ee5\u770b\u5230\uff0c\u5728\u8bc1\u4e66\u5bfc\u5165\u65f6\u9700\u8981\u4f7f\u7528 PSCredential \u4f20\u9012\u51ed\u636e\u3002\u5728\u5904\u7406 PSCredential \u65f6\uff0c\u9700\u8981\u6ce8\u610f\u5728Ansible\u4e2d\u5904\u7406\u3002\u4e3a\u4e86\u9632\u6b62\u5c06\u51ed\u636e\u4fe1\u606f\u8bb0\u5f55\u5728\u65e5\u5fd7\u4e2d\uff0c\u9700\u8981\u5c06no_log:true \u6dfb\u52a0\u5230\u5b9a\u4e49\u4e86\u8be5\u4efb\u52a1\u7684\u4e2d\u3002<\/p>\n<pre class=\"post-pre\"><code>\r\n- name: install xCertificate DSC resource\r\n  win_psmodule:\r\n    name: xCertificate\r\n    state: present\r\n\r\n- name: Copy certs file to tmp directory\r\n  win_copy:\r\n    src: roles\/common\/certs\/myserver.pfx\r\n    dest: C:\/tmp\/\r\n\r\n- name: import pfx certificate\r\n  win_dsc:\r\n    resource_name: xPfxImport\r\n    Thumbprint: 8b952114b7774787a2d7c7492eb8ca15473cfffd\r\n    Path: C:\/tmp\/myserver.pfx\r\n    Location: LocalMachine\r\n    Store: My\r\n    Credential_username: vagrant\r\n    Credential_password: XXXXXXXXXX\r\n  no_log: true\r\n<\/code><\/pre>\n<h4>\u521b\u5efaPlaybook<\/h4>\n<p>\u6211\u5011\u5c07\u5275\u5efa\u4e00\u500b\u5c0e\u5165\u5148\u524d\u5b9a\u7fa9\u7684\u4efb\u52d9\u7684Playbook\u3002<\/p>\n<pre class=\"post-pre\"><code>- hosts: staging\r\n  gather_facts: no\r\n  tasks:\r\n    - import_tasks: roles\/common\/tasks\/main.yml\r\n<\/code><\/pre>\n<h4>\u6267\u884cPlaybook<\/h4>\n<pre class=\"post-pre\"><code>$ ansible-playbook winservers.yml -i staging\r\n\r\nPLAY [winservers] *********************************************************************************************************\r\n\r\nTASK [install xCertificate DSC resource] *******************************************************************************\r\nchanged: [192.168.56.10]\r\n\r\nTASK [Copy certs file to tmp directory] ********************************************************************************\r\nchanged: [192.168.56.10]\r\n\r\nTASK [import pfx certificate] ******************************************************************************************\r\nchanged: [192.168.56.10]\r\n\r\nPLAY RECAP *************************************************************************************************************\r\n192.168.56.10              : ok=0    changed=3    unreachable=0    failed=0\r\n<\/code><\/pre>\n<p>\u592a\u597d\u4e86\uff01\u622a\u6b62\u52302017\u5e7412\u670813\u65e5\uff0cAnsible\u7684Windows\u6a21\u5757\u4e2d\u6ca1\u6709\u5904\u7406\u8bc1\u4e66\u7684\u6a21\u5757\uff0c\u56e0\u6b64\u9700\u8981\u7ed3\u5408PowerShell\u7684\u547d\u4ee4\u6765\u89e3\u51b3\uff0c\u5e76\u4e14\u4e0d\u9700\u8981\u8003\u8651\u5982\u4f55\u4fdd\u8bc1\u5e42\u7b49\u6027\uff08\u5bf9\u4e8e\u8bc1\u4e66\u800c\u8a00\uff0c\u53ea\u9700\u8981\u5728\u8bc1\u4e66\u5b58\u50a8\u4e2d\u8fdb\u884cTest-Path\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u5219\u653e\u5165\u5373\u53ef\uff09\uff0c\u8fd9\u6837\u4f1a\u66f4\u8f7b\u677e\u3002\u7136\u800c\uff0c\u7531\u4e8exCertificate\u662f\u4e00\u4e2a\u8bd5\u9a8c\u6027\u7684\u8d44\u6e90\uff0c\u56e0\u6b64\u5373\u4f7f\u51fa\u73b0\u95ee\u9898\uff0c\u81ea\u8d1f\u8d23\u4efb\u7684\u90e8\u5206\u4ecd\u7136\u4e0d\u4f1a\u6539\u53d8\u3002<\/p>\n<p>\u7531\u4e8ePowershell Gallery\u4e0a\u8fd8\u6709\u8bb8\u591a\u5176\u4ed6DSC\u8d44\u6e90\u53ef\u4ee5\u516c\u5f00\uff0c\u6240\u4ee5\u4e5f\u8bb8\u53bb\u641c\u7d22\u4e00\u4e0b\u662f\u4e2a\u597d\u4e3b\u610f\u3002\uff08\u987a\u4fbf\u8bf4\u4e00\u53e5\uff0c\u6211\u6ca1\u6709\u627e\u5230\u5176\u4ed6\u53ef\u7528\u7684\u8d44\u6e90\u3002\uff09<\/p>\n<h2>\u603b\u7ed3\u4e00\u4e0b<\/h2>\n<p>\u6211\u5728WSL\u4e0a\u4f7f\u7528Ansible\u642d\u5efa\u4e86Windows\u5f00\u53d1\u73af\u5883\uff0c\u5e76\u5c1d\u8bd5\u4e86win_dsc\u6a21\u5757\u3002\u4e2a\u4eba\u89c9\u5f97win_dsc\u6a21\u5757\u4e2d\u4ec5\u9650\u4e8eDSC\u8d44\u6e90\u7684\u9b45\u529b\u6709\u70b9\u5c11\uff0c\u5e0c\u671b\u5c06\u6765\u80fd\u6709\u66f4\u591a\u7684\u66f4\u65b0\u3002WSL\u672c\u8eab\u529f\u80fd\u6b63\u5728\u4e0d\u65ad\u6269\u5c55\uff0c\u4e5f\u8bb8\u4ece\u4e0b\u4e00\u4e2aWindows 10\u4e3b\u8981\u66f4\u65b0\u7248\u672c\u5f00\u59cb\uff0c\u8fd8\u4f1a\u652f\u6301\u540e\u53f0\u4efb\u52a1\u3002\u6211\u6709\u4e00\u79cd\u76f8\u5f53\u8ba4\u771f\u7684\u9884\u611f\uff0c\u5373\u5728Windows\u4e0a\u8fdb\u884c\u5f00\u53d1\u4e0d\u518d\u88ab\u5632\u7b11\uff0c\u4e00\u4e2a\u4e0d\u8fdc\u7684\u65f6\u4ee3\u5373\u5c06\u6765\u4e34\u3002<\/p>\n<p>\u6ce8\u610f\uff1a\u672c\u6587\u5185\u5bb9\u5c5e\u4e8e\u4e2a\u4eba\u89c2\u70b9\uff0c\u4e0d\u4ee3\u8868\u6240\u5c5e\u516c\u53f8\u6216\u7ec4\u7ec7\u7684\u7acb\u573a\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u8fd9\u7bc7\u6587\u7ae0\u662fFUJITSU Advent Calendar 2017\u7b2c13\u5929\u7684\u6587\u7ae0\u3002 \u5728\u7b2c11\u5929\u7684\u6587\u7ae0\u300a\u4f7f\u7528an [&hellip;]<\/p>\n","protected":false},"author":9,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-42788","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\u7528Ansible\u8fdb\u884cAzure\u4e0a\u7684Windows 10\u5f00\u53d1\u73af\u5883\u7684\u914d\u7f6e\u548c\u5c1d\u8bd5win_dsc\u6a21\u5757 - 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\u7528ansible\u8fdb\u884cazure\u4e0a\u7684windows-10\u5f00\u53d1\u73af\u5883\u7684\u914d\u7f6e\u548c\u5c1d\u8bd5win_dsc\u6a21\u5757\u3002\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u4f7f\u7528Ansible\u8fdb\u884cAzure\u4e0a\u7684Windows 10\u5f00\u53d1\u73af\u5883\u7684\u914d\u7f6e\u548c\u5c1d\u8bd5win_dsc\u6a21\u5757\" \/>\n<meta property=\"og:description\" content=\"\u8fd9\u7bc7\u6587\u7ae0\u662fFUJITSU Advent Calendar 2017\u7b2c13\u5929\u7684\u6587\u7ae0\u3002 \u5728\u7b2c11\u5929\u7684\u6587\u7ae0\u300a\u4f7f\u7528an [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528ansible\u8fdb\u884cazure\u4e0a\u7684windows-10\u5f00\u53d1\u73af\u5883\u7684\u914d\u7f6e\u548c\u5c1d\u8bd5win_dsc\u6a21\u5757\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2024-01-23T14:51:38+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-05-04T10:41:25+00:00\" \/>\n<meta name=\"author\" content=\"\u6e05, \u626c\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u6e05, \u626c\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 \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%a8ansible%e8%bf%9b%e8%a1%8cazure%e4%b8%8a%e7%9a%84windows-10%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%e7%9a%84%e9%85%8d%e7%bd%ae%e5%92%8c%e5%b0%9d%e8%af%95win_dsc%e6%a8%a1%e5%9d%97%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8ansible%e8%bf%9b%e8%a1%8cazure%e4%b8%8a%e7%9a%84windows-10%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%e7%9a%84%e9%85%8d%e7%bd%ae%e5%92%8c%e5%b0%9d%e8%af%95win_dsc%e6%a8%a1%e5%9d%97%e3%80%82\/\",\"name\":\"\u4f7f\u7528Ansible\u8fdb\u884cAzure\u4e0a\u7684Windows 10\u5f00\u53d1\u73af\u5883\u7684\u914d\u7f6e\u548c\u5c1d\u8bd5win_dsc\u6a21\u5757 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2024-01-23T14:51:38+00:00\",\"dateModified\":\"2024-05-04T10:41:25+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/cb5556d2501da73d864cac945e8d9461\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8ansible%e8%bf%9b%e8%a1%8cazure%e4%b8%8a%e7%9a%84windows-10%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%e7%9a%84%e9%85%8d%e7%bd%ae%e5%92%8c%e5%b0%9d%e8%af%95win_dsc%e6%a8%a1%e5%9d%97%e3%80%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8ansible%e8%bf%9b%e8%a1%8cazure%e4%b8%8a%e7%9a%84windows-10%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%e7%9a%84%e9%85%8d%e7%bd%ae%e5%92%8c%e5%b0%9d%e8%af%95win_dsc%e6%a8%a1%e5%9d%97%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8ansible%e8%bf%9b%e8%a1%8cazure%e4%b8%8a%e7%9a%84windows-10%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%e7%9a%84%e9%85%8d%e7%bd%ae%e5%92%8c%e5%b0%9d%e8%af%95win_dsc%e6%a8%a1%e5%9d%97%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\u7528Ansible\u8fdb\u884cAzure\u4e0a\u7684Windows 10\u5f00\u53d1\u73af\u5883\u7684\u914d\u7f6e\u548c\u5c1d\u8bd5win_dsc\u6a21\u5757\"}]},{\"@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\/cb5556d2501da73d864cac945e8d9461\",\"name\":\"\u6e05, \u626c\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/32a4239de8ff29adace466261d309424a1e5fe9f7e3036bf89fe03f2e3dbe717?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/32a4239de8ff29adace466261d309424a1e5fe9f7e3036bf89fe03f2e3dbe717?s=96&d=mm&r=g\",\"caption\":\"\u6e05, \u626c\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/qingyang\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8ansible%e8%bf%9b%e8%a1%8cazure%e4%b8%8a%e7%9a%84windows-10%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%e7%9a%84%e9%85%8d%e7%bd%ae%e5%92%8c%e5%b0%9d%e8%af%95win_dsc%e6%a8%a1%e5%9d%97%e3%80%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u4f7f\u7528Ansible\u8fdb\u884cAzure\u4e0a\u7684Windows 10\u5f00\u53d1\u73af\u5883\u7684\u914d\u7f6e\u548c\u5c1d\u8bd5win_dsc\u6a21\u5757 - 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\u7528ansible\u8fdb\u884cazure\u4e0a\u7684windows-10\u5f00\u53d1\u73af\u5883\u7684\u914d\u7f6e\u548c\u5c1d\u8bd5win_dsc\u6a21\u5757\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"\u4f7f\u7528Ansible\u8fdb\u884cAzure\u4e0a\u7684Windows 10\u5f00\u53d1\u73af\u5883\u7684\u914d\u7f6e\u548c\u5c1d\u8bd5win_dsc\u6a21\u5757","og_description":"\u8fd9\u7bc7\u6587\u7ae0\u662fFUJITSU Advent Calendar 2017\u7b2c13\u5929\u7684\u6587\u7ae0\u3002 \u5728\u7b2c11\u5929\u7684\u6587\u7ae0\u300a\u4f7f\u7528an [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528ansible\u8fdb\u884cazure\u4e0a\u7684windows-10\u5f00\u53d1\u73af\u5883\u7684\u914d\u7f6e\u548c\u5c1d\u8bd5win_dsc\u6a21\u5757\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2024-01-23T14:51:38+00:00","article_modified_time":"2024-05-04T10:41:25+00:00","author":"\u6e05, \u626c","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u6e05, \u626c","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"6 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8ansible%e8%bf%9b%e8%a1%8cazure%e4%b8%8a%e7%9a%84windows-10%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%e7%9a%84%e9%85%8d%e7%bd%ae%e5%92%8c%e5%b0%9d%e8%af%95win_dsc%e6%a8%a1%e5%9d%97%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8ansible%e8%bf%9b%e8%a1%8cazure%e4%b8%8a%e7%9a%84windows-10%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%e7%9a%84%e9%85%8d%e7%bd%ae%e5%92%8c%e5%b0%9d%e8%af%95win_dsc%e6%a8%a1%e5%9d%97%e3%80%82\/","name":"\u4f7f\u7528Ansible\u8fdb\u884cAzure\u4e0a\u7684Windows 10\u5f00\u53d1\u73af\u5883\u7684\u914d\u7f6e\u548c\u5c1d\u8bd5win_dsc\u6a21\u5757 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2024-01-23T14:51:38+00:00","dateModified":"2024-05-04T10:41:25+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/cb5556d2501da73d864cac945e8d9461"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8ansible%e8%bf%9b%e8%a1%8cazure%e4%b8%8a%e7%9a%84windows-10%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%e7%9a%84%e9%85%8d%e7%bd%ae%e5%92%8c%e5%b0%9d%e8%af%95win_dsc%e6%a8%a1%e5%9d%97%e3%80%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8ansible%e8%bf%9b%e8%a1%8cazure%e4%b8%8a%e7%9a%84windows-10%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%e7%9a%84%e9%85%8d%e7%bd%ae%e5%92%8c%e5%b0%9d%e8%af%95win_dsc%e6%a8%a1%e5%9d%97%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8ansible%e8%bf%9b%e8%a1%8cazure%e4%b8%8a%e7%9a%84windows-10%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%e7%9a%84%e9%85%8d%e7%bd%ae%e5%92%8c%e5%b0%9d%e8%af%95win_dsc%e6%a8%a1%e5%9d%97%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\u7528Ansible\u8fdb\u884cAzure\u4e0a\u7684Windows 10\u5f00\u53d1\u73af\u5883\u7684\u914d\u7f6e\u548c\u5c1d\u8bd5win_dsc\u6a21\u5757"}]},{"@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\/cb5556d2501da73d864cac945e8d9461","name":"\u6e05, \u626c","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/32a4239de8ff29adace466261d309424a1e5fe9f7e3036bf89fe03f2e3dbe717?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/32a4239de8ff29adace466261d309424a1e5fe9f7e3036bf89fe03f2e3dbe717?s=96&d=mm&r=g","caption":"\u6e05, \u626c"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/qingyang\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8ansible%e8%bf%9b%e8%a1%8cazure%e4%b8%8a%e7%9a%84windows-10%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%e7%9a%84%e9%85%8d%e7%bd%ae%e5%92%8c%e5%b0%9d%e8%af%95win_dsc%e6%a8%a1%e5%9d%97%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\/42788","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\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=42788"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/42788\/revisions"}],"predecessor-version":[{"id":100028,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/42788\/revisions\/100028"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=42788"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=42788"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=42788"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}