{"id":42681,"date":"2023-10-27T20:37:05","date_gmt":"2023-04-08T10:35:25","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e7%ac%ac%e4%b8%80%e6%ac%a1%e7%9a%84ansible%e8%87%aa%e6%88%91%e6%82%a0%e9%97%b2%e5%b0%8f%e8%81%9a\/"},"modified":"2024-05-04T06:19:06","modified_gmt":"2024-05-03T22:19:06","slug":"%e7%ac%ac%e4%b8%80%e6%ac%a1%e7%9a%84ansible%e8%87%aa%e6%88%91%e6%82%a0%e9%97%b2%e5%b0%8f%e8%81%9a","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e7%ac%ac%e4%b8%80%e6%ac%a1%e7%9a%84ansible%e8%87%aa%e6%88%91%e6%82%a0%e9%97%b2%e5%b0%8f%e8%81%9a\/","title":{"rendered":"\u7b2c\u4e00\u6b21\u7684Ansible\u81ea\u6211\u60a0\u95f2\u5c0f\u805a"},"content":{"rendered":"<p>\u6211\u53c2\u52a0\u4e86Ansible\u793e\u7fa4\u7684\u5de5\u4f5c\u574a\u3002<\/p>\n<p>\u4eca\u5e74\u4e00\u6708\u4efd\u5728 Network Automation with Ansible \u7684\u6d3b\u52a8\u4e2d\uff0c\u4ee5\u53ca\u5176\u4ed6\u7814\u8ba8\u4f1a\u671f\u95f4\uff0c\u542c\u8bf4\u4e86\u5ea7\u8c08\u4f1a\u5e76\u4e0d\u662f\u90a3\u4e48\u56f0\u96be\uff0c\u4e8e\u662f\u51b3\u5b9a\u53c2\u52a0\u5ea7\u8c08\u4f1a\u3002<\/p>\n<p>\u5982\u679c\u6709\u4eba\u611f\u5230\u81ea\u5df1\u5904\u5883\u56f0\u96be\uff0c\u6211\u5e0c\u671b\u8fd9\u7bc7\u6587\u7ae0\u80fd\u591f\u7a0d\u5fae\u51cf\u8f7b\u4e00\u4e9b\u969c\u788d\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d4e2437434c4406cbfde7\/3-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2019-05-16 21.36.47.png\" \/><\/div>\n<p>&#8220;\u7531\u5de5\u7a0b\u5e08\u9a71\u52a8&#8221;\uff0c\u9177\u6bd9\u4e86\uff01<\/p>\n<h1>Ansible\u3082\u304f\u3082\u304f\u4f1a\u662f\u4ec0\u4e48\uff1f<\/h1>\n<p>\u4ee5\u81ea\u5df1\u7684\u8282\u594f\u6765\u63a5\u89e6Ansible\u7684\u5730\u65b9\u3002<\/p>\n<h1>\u5728\u6084\u7136\u601d\u8003\u4e4b\u524d\uff0c\u6211\u8a66\u8457\u81ea\u554f\u4e86\u4e00\u4e0b\u3002<\/h1>\n<h4>\u25b6 \u672c\u6b21\u6084\u6084\u4f1a\u5e0c\u671b\u5f97\u5230\u7684\u5185\u5bb9<\/h4>\n<p>\u30fb\u60f3\u8981\u638c\u63e1\u6280\u80fd\uff0c\u4ee5\u4fbf\u5b9e\u73b0\u60f3\u8981\u7684\u4e8b\u60c5\uff0c\u5305\u62ecAnsible\u7684\u73af\u5883\u642d\u5efa\u3002<br \/>\n\u30fb\u60f3\u5728\u672c\u516c\u53f8\u7684\u4e1a\u52a1\u73af\u5883\u4e2d\u4f7f\u7528Ansible\uff0c\u770b\u770b\u80fd\u4e0d\u80fd\u8fdb\u884c\u6539\u8fdb\u3002\uff08\u66f4\u786e\u5207\u5730\u8bf4\uff0c\u6211\u8981\u505a\u5230\u3002\uff09<br \/>\n\u30fb\u5982\u679c\u80fd\u591f\u54a8\u8be2\u4e0a\u8ff0\u73af\u5883\u642d\u5efa\uff0c\u6211\u4f1a\u5f88\u60f3\u8fd9\u6837\u505a\u3002<\/p>\n<h1>\u5f00\u59cb\u524d\u7684\u901a\u544a<\/h1>\n<h4>&#8211; \u53ea\u9700\u8981\u4e00\u79cd\u9009\u9879\uff0c\u7528\u4e2d\u6587\u8868\u8fbe\u4ee5\u4e0b\u5185\u5bb9\u7684\u91ca\u4e49\uff1a<br \/>\n\u25b6\ufe0e \u66f4\u65b0<\/h4>\n<p>\u6700\u8fd1\uff0cAnsible\u7528\u6237\u7ec4\u7684\u4eba\u6570\u589e\u52a0\u4e86\u5927\u7ea61,000\u4eba\uff0c\u6bd4\u4e00\u5e74\u524d\u591a\u4e86\u7ea61,000\u4eba\u5de6\u53f3\u3002<br \/>\n\u7528\u6237\u7ec4\u8fd8\u63d0\u4f9b\u4e86\u4e00\u4e2a\u53ef\u4ee5\u5206\u4eab\u7ecf\u9a8c\u7b49\u7684\u4ea4\u6d41\u5e73\u53f0\u3002<br \/>\n\u6211\u4eec\u4e5f\u5728Trello\u4e0a\u53d1\u8d77\u4e86\u5173\u4e8eAnsible\u7684\u5f15\u8fdb\u8ba1\u5212\u7684\u5f81\u96c6\u3002<\/p>\n<h4>\u25b6\ufe0e \u6700\u8fd1\u7684\u6d3b\u52a8 de<\/h4>\n<p>\u30fb5\/31\u5927\u962a\u7684Ansible\u4e4b\u591c<br \/>\n\u30fb6\/13\u7ea2\u5e3d\u5b50\u4e0a\u7684Ansible\u9ed8\u9ed8\u76f8\u4f1a<\/p>\n<h1>\u6211\u8bd5\u7740\u4e13\u6ce8\u5730\u505a\u67d0\u4e8b\u3002<\/h1>\n<p>\u4f60\u53ef\u4ee5\u4f7f\u7528\u4e0a\u4f20\u5230Git\u7684\u6559\u6750\uff0c\u6216\u8005\u5982\u679c\u6709\u5176\u4ed6\u60f3\u505a\u7684\u4e8b\u60c5\uff0c\u4e5f\u53ef\u4ee5\u53bb\u505a\u3002<\/p>\n<h4>\u25b6\ufe0e \u4fe1\u606f\u7ec4\u6210<\/h4>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d4e2437434c4406cbfde7\/18-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2019-05-14 19.32.06.png\" \/><\/div>\n<h4>\u25b6\ufe0e \u6559\u6750 &#8211;<\/h4>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d4e2437434c4406cbfde7\/20-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2019-05-14 19.31.54.png\" \/><\/div>\n<p>\u7531\u4e8e\u662f\u7b2c\u4e00\u6b21\u53c2\u52a0\u52a8\u624b\u4f1a\uff0c\u6211\u50cf\u5728\u505a\u6f14\u4e60\u4e00\u6837\uff0c\u7c97\u7565\u5730\u6d4f\u89c8\u4e86\u6559\u6750\u3002\u4e0b\u9762\u662f\u6211\u5b9e\u9645\u505a\u8fc7\u7684\u4e00\u90e8\u5206\u5185\u5bb9\u7684\u7c98\u8d34\u3002\u7531\u4e8e\u6559\u6750\u548c\u5185\u5bb9\u6709\u6240\u91cd\u590d\uff0c\u8bf7\u67e5\u770b\u6559\u6750\u4ee5\u83b7\u53d6\u8be6\u7ec6\u8bf4\u660e\u3002<\/p>\n<h4>\u7b2c01\u7bc0 &#8211; \u4f7f\u7528Ansible\u4ece\u7f51\u7edc\u8bbe\u5907\u4e2d\u6536\u96c6\u6570\u636e<\/h4>\n<p>\u25b6\ufe0e \u7ec3\u4e60 1.0 &#8211; \u786e\u8ba4 Anisble \u5b9e\u9a8c\u73af\u5883<\/p>\n<p>\u786e\u8ba4\u4e00\u4e0bAnsible.cfg\u6587\u4ef6\u7684\u5185\u5bb9<\/p>\n<pre class=\"post-pre\"><code>[student24@ansible networking-workshop]$ cat ~\/.ansible.cfg\r\n[defaults]\r\nstdout_callback = yaml\r\nconnection = smart\r\ntimeout = 60\r\ndeprecation_warnings = False\r\nhost_key_checking = False\r\nretry_files_enabled = False\r\ninventory = \/home\/student24\/networking-workshop\/lab_inventory\/hosts\r\n[persistent_connection]\r\nconnect_timeout = 60\r\ncommand_timeout = 60\r\n[student24@ansible networking-workshop]$ \r\n<\/code><\/pre>\n<p>\u786e\u8ba4 Inventory \u6587\u4ef6\u7684\u5185\u5bb9<br \/>\n&#8211; \u786e\u8ba4\u7528\u4e8e Ansible \u7684\u5b9a\u4e49<\/p>\n<pre class=\"post-pre\"><code>[student24@ansible networking-workshop]$ cat ~\/networking-workshop\/lab_inventory\/hosts \r\n[all:vars]\r\nansible_ssh_private_key_file=\/home\/student24\/.ssh\/aws-private.pem\r\n[routers:children]\r\ncisco\r\n\r\n[cisco]\r\nrtr1 ansible_host=35.172.190.244 private_ip=172.16.172.61\r\nrtr2 ansible_host=54.175.227.150 private_ip=172.17.175.108\r\nrtr3 ansible_host=3.90.179.255 private_ip=172.16.184.46\r\nrtr4 ansible_host=54.82.90.77 private_ip=172.17.55.218\r\n\r\n\r\n[cisco:vars]\r\nansible_user=ec2-user\r\nansible_network_os=ios\r\nansible_connection=network_cli\r\n\r\n\r\n[dc1]\r\nrtr1\r\nrtr3\r\n\r\n[dc2]\r\nrtr2\r\nrtr4\r\n\r\n[hosts]\r\nhost1 ansible_host=54.163.12.44 ansible_user=ec2-user private_ip=172.17.153.76\r\n\r\n[control]\r\nansible ansible_host=3.83.231.68 ansible_user=student24 private_ip=172.16.33.116\r\n[student24@ansible networking-workshop]$ \r\n<\/code><\/pre>\n<p>\u7ec3\u4e601.1 &#8211; \u5c1d\u8bd5\u5199\u7b2c\u4e00\u4e2aplaybook<br \/>\n\u521b\u5efagather_ios_data.yml\u6587\u4ef6<br \/>\n&#8211; \u4f7f\u7528ios_facts\u6a21\u5757<\/p>\n<pre class=\"post-pre\"><code>[student24@ansible networking-workshop]$ vim gather_ios_data.yml\r\n---\r\n- name: GATHER INFORMATION FROM ROUTERS\r\n  hosts: cisco\r\n  connection: network_cli\r\n  gather_facts: no\r\n\r\n  tasks:\r\n    - name: GATHER ROUTER FACTS\r\n      ios_facts:\r\n<\/code><\/pre>\n<p>\u6267\u884c\u6240\u521b\u5efa\u7684Playbook &#8220;gather_ios_data.yml&#8221;<\/p>\n<pre class=\"post-pre\"><code>[student24@ansible networking-workshop]$ ansible-playbook -i lab_inventory\/hosts gather_ios_data.yml \r\n\r\nPLAY [GATHER INFORMATION FROM ROUTERS] *****************************************\r\n\r\nTASK [GATHER ROUTER FACTS] *****************************************************\r\nok: [rtr4]\r\nok: [rtr3]\r\nok: [rtr1]\r\nok: [rtr2]\r\n\r\nPLAY RECAP *********************************************************************\r\nrtr1                       : ok=1    changed=0    unreachable=0    failed=0   \r\nrtr2                       : ok=1    changed=0    unreachable=0    failed=0   \r\nrtr3                       : ok=1    changed=0    unreachable=0    failed=0   \r\nrtr4                       : ok=1    changed=0    unreachable=0    failed=0   \r\n\r\n[student24@ansible networking-workshop]$ \r\n<\/code><\/pre>\n<p>\u5728TASK\u4e2d\u786e\u8ba4\u6240\u6709\u8def\u7531\u5668\u4e0a\u5df2\u7ecf\u751f\u6548\u7684\u4e8b\u9879\u3002<\/p>\n<p>\u901a\u8fc7\u5728Playbook\u4e2d\u52a0\u4e0a-v\uff0c\u53ef\u4ee5\u6267\u884c\u5e76\u786e\u8ba4\u5b9e\u9645\u7684\u6267\u884c\u7ed3\u679c\u3002<br \/>\n\u8fd9\u6b21\u53ea\u663e\u793artr1\u7684\u6267\u884c\u7ed3\u679c\uff0c\u5176\u4ed6\u8def\u7531\u5668\u88ab\u7701\u7565\u3002<\/p>\n<pre class=\"post-pre\"><code>[student24@ansible networking-workshop]$ ansible-playbook -i lab_inventory\/hosts gather_ios_data.yml -v\r\nUsing \/home\/student24\/.ansible.cfg as config file\r\n\r\nPLAY [GATHER INFORMATION FROM ROUTERS] *****************************************\r\n\r\nTASK [GATHER ROUTER FACTS] *****************************************************\r\nok: [rtr3] =&gt; changed=false \r\n  ansible_facts:\r\n    ansible_net_all_ipv4_addresses:\r\n    - 10.100.100.3\r\n\u30fb\r\n\u30fb\r\n\u30fb\r\nok: [rtr1] =&gt; changed=false \r\n  ansible_facts:\r\n    ansible_net_all_ipv4_addresses:\r\n    - 192.168.35.101\r\n    - 172.16.172.61\r\n    - 192.168.1.101\r\n    - 10.1.1.101\r\n    - 10.200.200.1\r\n    - 10.100.100.1\r\n    - 10.255.0.254\r\n    ansible_net_all_ipv6_addresses: []\r\n    ansible_net_filesystems:\r\n    - 'bootflash:'\r\n    ansible_net_filesystems_info:\r\n      'bootflash:':\r\n        spacefree_kb: 6881148\r\n        spacetotal_kb: 7712284\r\n    ansible_net_gather_subset:\r\n    - hardware\r\n    - default\r\n    - interfaces\r\n    ansible_net_hostname: rtr1\r\n    ansible_net_image: boot:packages.conf\r\n    ansible_net_interfaces:\r\n      GigabitEthernet1:\r\n        bandwidth: 1000000\r\n        description: null\r\n        duplex: Full\r\n        ipv4:\r\n        - address: 172.16.172.61\r\n          subnet: '16'\r\n        lineprotocol: 'up '\r\n        macaddress: 0ae8.0c21.1954\r\n        mediatype: Virtual\r\n        mtu: 1500\r\n        operstatus: up\r\n        type: CSR vNIC\r\n      Loopback0:\r\n        bandwidth: 8000000\r\n        description: null\r\n        duplex: null\r\n        ipv4:\r\n        - address: 192.168.1.101\r\n          subnet: '24'\r\n        lineprotocol: 'up '\r\n        macaddress: null\r\n        mediatype: null\r\n        mtu: 1514\r\n        operstatus: up\r\n        type: null\r\n      Loopback1:\r\n        bandwidth: 8000000\r\n        description: null\r\n        duplex: null\r\n        ipv4:\r\n        - address: 10.1.1.101\r\n          subnet: '24'\r\n        lineprotocol: 'up '\r\n        macaddress: null\r\n        mediatype: null\r\n        mtu: 1514\r\n        operstatus: up\r\n        type: null\r\n      Tunnel0:\r\n        bandwidth: 100\r\n        description: null\r\n        duplex: null\r\n        ipv4:\r\n        - address: 10.100.100.1\r\n          subnet: '24'\r\n        lineprotocol: 'up '\r\n        macaddress: null\r\n        mediatype: null\r\n        mtu: 9976\r\n        operstatus: up\r\n        type: null\r\n      Tunnel1:\r\n        bandwidth: 100\r\n        description: null\r\n        duplex: null\r\n        ipv4:\r\n        - address: 10.200.200.1\r\n          subnet: '24'\r\n        lineprotocol: 'up '\r\n        macaddress: null\r\n        mediatype: null\r\n        mtu: 9976\r\n        operstatus: up\r\n        type: null\r\n      Tunnel2:\r\n        bandwidth: 100\r\n        description: null\r\n        duplex: null\r\n        ipv4:\r\n        - address: 10.255.0.254\r\n          subnet: '24'\r\n        lineprotocol: 'up '\r\n        macaddress: null\r\n        mediatype: null\r\n        mtu: 9972\r\n        operstatus: up\r\n        type: null\r\n      VirtualPortGroup0:\r\n        bandwidth: 750000\r\n        description: null\r\n        duplex: null\r\n        ipv4:\r\n        - address: 192.168.35.101\r\n          subnet: '24'\r\n        lineprotocol: 'up '\r\n        macaddress: 001e.e6ae.75bd\r\n        mediatype: null\r\n        mtu: 1500\r\n        operstatus: up\r\n        type: Virtual Port Group\r\n    ansible_net_memfree_mb: 1873821\r\n    ansible_net_memtotal_mb: 2169814\r\n    ansible_net_model: CSR1000V\r\n    ansible_net_serialnum: 9IJ6CG5FV5L\r\n    ansible_net_version: 16.10.01b\r\nok: [rtr2] =&gt; changed=false \r\n  ansible_facts:\r\n    ansible_net_all_ipv4_addresses:\r\n    - 192.168.35.101\r\n\u30fb\r\n\u30fb\r\n\u30fb\r\nok: [rtr4] =&gt; changed=false \r\n  ansible_facts:\r\n    ansible_net_all_ipv4_addresses:\r\n    - 10.101.101.4\r\n\u30fb\r\n\u30fb\r\n\u30fb\r\n    ansible_net_model: CSR1000V\r\n    ansible_net_serialnum: 9VCVJK8PRGW\r\n    ansible_net_version: 16.10.01b\r\n\r\nPLAY RECAP *********************************************************************\r\nrtr1                       : ok=1    changed=0    unreachable=0    failed=0   \r\nrtr2                       : ok=1    changed=0    unreachable=0    failed=0   \r\nrtr3                       : ok=1    changed=0    unreachable=0    failed=0   \r\nrtr4                       : ok=1    changed=0    unreachable=0    failed=0   \r\n\r\n[student24@ansible networking-workshop]$ \r\n<\/code><\/pre>\n<p>\u5728\u201cgather_ios_data.yml\u201d\u4e2d\u6dfb\u52a0\u4e86\u4e24\u4e2a\u4efb\u52a1\uff08iOS\u7248\u672c\u786e\u8ba4\u548c\u5e8f\u5217\u53f7\u786e\u8ba4\uff09\u4ee5\u53ca\u8c03\u8bd5\u6a21\u5757\u3002<\/p>\n<pre class=\"post-pre\"><code>[student24@ansible networking-workshop]$ vim gather_ios_data.yml \r\n---\r\n- name: GATHER INFORMATION FROM ROUTERS\r\n  hosts: cisco\r\n  connection: network_cli\r\n  gather_facts: no\r\n\r\n  tasks:\r\n    - name: GATHER ROUTER FACTS\r\n      ios_facts:\r\n\r\n    - name: DISPLAY VERSION\r\n      debug:\r\n        msg: \"The IOS version is: {{ ansible_net_version }}\"\r\n\r\n    - name: DISPLAY SERIAL NUMBER\r\n      debug:\r\n        msg: \"The serial number is:{{ ansible_net_serialnum }}\"\r\n<\/code><\/pre>\n<p>\u6267\u884cPlaybook\u201cgather_ios_data.yml\u201d<br \/>\n&#8211; \u4e0d\u4f7f\u7528\u9009\u9879\u201c-v\u201d\uff0c\u6536\u96c6\u7f51\u7edc\u8bbe\u5907\u7684\u7248\u672c\u548c\u5e8f\u5217\u53f7\uff0c\u5e76\u8fd4\u56de\u7ed3\u679c<br \/>\n\u786e\u8ba4\u6240\u6709\u4e09\u4e2a\u4efb\u52a1\u90fd\u5df2\u5b8c\u6210\u3002<\/p>\n<pre class=\"post-pre\"><code>[student24@ansible networking-workshop]$ ansible-playbook -i lab_inventory\/hosts gather_ios_data.yml \r\n\r\nPLAY [GATHER INFORMATION FROM ROUTERS] *****************************************\r\n\r\nTASK [GATHER ROUTER FACTS] *****************************************************\r\nok: [rtr1]\r\nok: [rtr3]\r\nok: [rtr2]\r\nok: [rtr4]\r\n\r\nTASK [DISPLAY VERSION] *********************************************************\r\nok: [rtr2] =&gt; \r\n  msg: 'The IOS version is: 16.10.01b'\r\nok: [rtr1] =&gt; \r\n  msg: 'The IOS version is: 16.10.01b'\r\nok: [rtr4] =&gt; \r\n  msg: 'The IOS version is: 16.10.01b'\r\nok: [rtr3] =&gt; \r\n  msg: 'The IOS version is: 16.10.01b'\r\n\r\nTASK [DISPLAY SERIAL NUMBER] ***************************************************\r\nok: [rtr3] =&gt; \r\n  msg: The serial number is:9S0KV8XIOT8\r\nok: [rtr1] =&gt; \r\n  msg: The serial number is:9IJ6CG5FV5L\r\nok: [rtr4] =&gt; \r\n  msg: The serial number is:9VCVJK8PRGW\r\nok: [rtr2] =&gt; \r\n  msg: The serial number is:9VVVYS8CAML\r\n\r\nPLAY RECAP *********************************************************************\r\nrtr1                       : ok=3    changed=0    unreachable=0    failed=0   \r\nrtr2                       : ok=3    changed=0    unreachable=0    failed=0   \r\nrtr3                       : ok=3    changed=0    unreachable=0    failed=0   \r\nrtr4                       : ok=3    changed=0    unreachable=0    failed=0   \r\n\r\n[student24@ansible networking-workshop]$ \r\n<\/code><\/pre>\n<p>\u7ec3\u4e60 1.2 &#8211; \u6a21\u5757\u6587\u6863\u7684\u786e\u8ba4\u65b9\u6cd5\u3001\u8f93\u51fa\u7ed3\u679c\u7684\u6ce8\u518c\u65b9\u6cd5\u3001\u6807\u7b7e\u7684\u4f7f\u7528\uff1a<br \/>\n\u4f7f\u7528 ios_command \u6a21\u5757\uff1a<br \/>\n&#8211; \u53ef\u4ee5\u50cf\u624b\u52a8\u64cd\u4f5c\u4e00\u6837\u83b7\u53d6 show \u547d\u4ee4\u7684\u6267\u884c\u7ed3\u679c\u3002<br \/>\n&#8211; \u4ece show run \u4e2d\u83b7\u53d6\u4e3b\u673a\u540d\u3002<br \/>\n&#8211; \u83b7\u53d6\u63a5\u53e3\u7684\u7b80\u8981\u4fe1\u606f\u3002<\/p>\n<pre class=\"post-pre\"><code>[student24@ansible networking-workshop]$ vim gather_ios_data.yml \r\n---\r\n- name: GATHER INFORMATION FROM ROUTERS\r\n  hosts: cisco\r\n  connection: network_cli\r\n  gather_facts: no\r\n\r\n  tasks:\r\n    - name: GATHER ROUTER FACTS\r\n      ios_facts:\r\n\r\n    - name: DISPLAY VERSION\r\n      debug:\r\n        msg: \"The IOS version is: {{ ansible_net_version }}\"\r\n\r\n    - name: DISPLAY SERIAL NUMBER\r\n      debug:\r\n        msg: \"The serial number is:{{ ansible_net_serialnum }}\"\r\n\r\n    - name: COLLECT OUTPUT OF SHOW COMMANDS\r\n      ios_command:\r\n        commands:\r\n          - show run | i hostname\r\n          - show ip interface brief\r\n      tags: show\r\n<\/code><\/pre>\n<p>\u518d\u6b21\u6267\u884cPlaybook\u201cgather_ios_data.yml\u201d\u3002<br \/>\n&#8211; \u4e5f\u53ef\u4ee5\u4f7f\u7528\u6807\u7b7e\u6709\u9009\u62e9\u5730\u83b7\u53d6\u4fe1\u606f\u3002<\/p>\n<pre class=\"post-pre\"><code>[student24@ansible networking-workshop]$ ansible-playbook -i lab_inventory\/hosts gather_ios_data.yml --tags=show -v\r\nUsing \/home\/student24\/.ansible.cfg as config file\r\n\r\nPLAY [GATHER INFORMATION FROM ROUTERS] *****************************************\r\n\r\nTASK [COLLECT OUTPUT OF SHOW COMMANDS] *****************************************\r\nok: [rtr2] =&gt; changed=false \r\n  stdout:\r\n  - hostname rtr2\r\n  - |-\r\n    Interface              IP-Address      OK? Method Status                Protocol\r\n    GigabitEthernet1       172.17.175.108  YES DHCP   up                    up\r\n    Loopback0              192.168.2.102   YES manual up                    up\r\n    Loopback1              10.2.2.102      YES manual up                    up\r\n    Tunnel0                10.101.101.2    YES manual up                    up\r\n    Tunnel1                10.200.200.2    YES manual up                    up\r\n    VirtualPortGroup0      192.168.35.101  YES TFTP   up                    up\r\n  stdout_lines: &lt;omitted&gt;\r\nok: [rtr1] =&gt; changed=false \r\n  stdout:\r\n  - hostname rtr1\r\n  - |-\r\n    Interface              IP-Address      OK? Method Status                Protocol\r\n    GigabitEthernet1       172.16.172.61   YES DHCP   up                    up\r\n    Loopback0              192.168.1.101   YES manual up                    up\r\n    Loopback1              10.1.1.101      YES manual up                    up\r\n    Tunnel0                10.100.100.1    YES manual up                    up\r\n    Tunnel1                10.200.200.1    YES manual up                    up\r\n    Tunnel2                10.255.0.254    YES manual up                    up\r\n    VirtualPortGroup0      192.168.35.101  YES TFTP   up                    up\r\n  stdout_lines: &lt;omitted&gt;\r\nok: [rtr4] =&gt; changed=false \r\n  stdout:\r\n  - hostname rtr4\r\n  - |-\r\n    Interface              IP-Address      OK? Method Status                Protocol\r\n    GigabitEthernet1       172.17.55.218   YES DHCP   up                    up\r\n    Loopback0              192.168.4.104   YES manual up                    up\r\n    Loopback1              10.4.4.104      YES manual up                    up\r\n    Tunnel0                10.101.101.4    YES manual up                    up\r\n    VirtualPortGroup0      192.168.35.101  YES TFTP   up                    up\r\n  stdout_lines: &lt;omitted&gt;\r\nok: [rtr3] =&gt; changed=false \r\n  stdout:\r\n  - hostname rtr3\r\n  - |-\r\n    Interface              IP-Address      OK? Method Status                Protocol\r\n    GigabitEthernet1       172.16.184.46   YES DHCP   up                    up\r\n    Loopback0              192.168.3.103   YES manual up                    up\r\n    Loopback1              10.3.3.103      YES manual up                    up\r\n    Tunnel0                10.100.100.3    YES manual up                    up\r\n    VirtualPortGroup0      192.168.35.101  YES TFTP   up                    up\r\n  stdout_lines: &lt;omitted&gt;\r\n\r\nPLAY RECAP *********************************************************************\r\nrtr1                       : ok=1    changed=0    unreachable=0    failed=0   \r\nrtr2                       : ok=1    changed=0    unreachable=0    failed=0   \r\nrtr3                       : ok=1    changed=0    unreachable=0    failed=0   \r\nrtr4                       : ok=1    changed=0    unreachable=0    failed=0   \r\n\r\n[student24@ansible networking-workshop]$ \r\n<\/code><\/pre>\n<h4>\u7b2c02\u7bc0 &#8211; \u5b9e\u8df5\u4f7f\u7528Ansible\u8fdb\u884c\u914d\u7f6e\u5907\u4efd\u548c\u6062\u590d<\/h4>\n<p>\u8fdb\u884c\u8005\u52a8\u4f5c2.0 &#8211; \u5c1d\u8bd5\u66f4\u65b0\u8def\u7531\u5668\u7684\u914d\u7f6e<\/p>\n<p>\u8fd9\u6b21\u521b\u5efaPlaybook &#8220;router_config.yml&#8221;\u3002<br \/>\n\u4f7f\u7528ios_config\u6a21\u5757\uff0c\u6dfb\u52a0\u4ee5\u4e0b\u914d\u7f6e\uff1a<br \/>\n&#8211; snmp-server community ansible-public RO<br \/>\n&#8211; snmp-server community ansible-private RW<\/p>\n<pre class=\"post-pre\"><code>[student24@ansible networking-workshop]$ vim router_configs.yml\r\n---\r\n- name: SNMP RO\/RW STRING CONFIGURATION\r\n  hosts: cisco\r\n  gather_facts: no\r\n  connection: network_cli\r\n\r\n  tasks:\r\n\r\n    - name: ENSURE THAT THE DESIRED SNMP STRINGS ARE PRESENT\r\n      ios_config:\r\n        commands:\r\n          - snmp-server community ansible-public RO\r\n          - snmp-server community ansible-private RW\r\n<\/code><\/pre>\n<p>\u6267\u884cPlaybook\u201crouter_configs.yml\u201d\u3002<\/p>\n<pre class=\"post-pre\"><code>[student24@ansible networking-workshop]$ ansible-playbook -i lab_inventory\/hosts router_configs.yml \r\n<\/code><\/pre>\n<p>\u786e\u4fdd\u5728Router rtr1\u7684\u914d\u7f6e\u4e2d\u5b9e\u9645\u4e0a\u6dfb\u52a0\u4e86\u8bbe\u7f6e<\/p>\n<pre class=\"post-pre\"><code>rtr1#show running-config | include snmp\r\nsnmp-server community ansible-public RO\r\nsnmp-server community ansible-private RW\r\nrtr1#\r\n<\/code><\/pre>\n<p>\u521b\u5efa secure_router.cfg<\/p>\n<pre class=\"post-pre\"><code>[student24@ansible networking-workshop]$ vim secure_router.cfg\r\nline con 0\r\n exec-timeout 5 0\r\nline vty 0 4\r\n exec-timeout 5 0\r\n transport input ssh\r\nip ssh time-out 60\r\nip ssh authentication-retries 5\r\nservice password-encryption\r\nservice tcp-keepalives-in\r\nservice tcp-keepalives-out\r\n<\/code><\/pre>\n<p>\u5728\u5267\u672c\u201crouter_configs.yml\u201d\u4e2d\u6dfb\u52a0\u201cHARDEN IOS ROUTERS\u201d\u3002<\/p>\n<pre class=\"post-pre\"><code>[student24@ansible networking-workshop]$ vim router_configs.yml\r\n---\r\n- name: UPDATE THE SNMP RO\/RW STRINGS\r\n  hosts: cisco\r\n  gather_facts: no\r\n  connection: network_cli\r\n\r\n  tasks:\r\n\r\n    - name: ENSURE THAT THE DESIRED SNMP STRINGS ARE PRESENT\r\n      ios_config:\r\n        commands:\r\n          - snmp-server community ansible-public RO\r\n          - snmp-server community ansible-private RW\r\n          - snmp-server community ansible-test RO\r\n\r\n\r\n- name: HARDEN IOS ROUTERS\r\n  hosts: cisco\r\n  gather_facts: no\r\n  connection: network_cli\r\n\r\n  tasks:\r\n\r\n    - name: ENSURE THAT ROUTERS ARE SECURE\r\n      ios_config:\r\n        src: secure_router.cfg\r\n<\/code><\/pre>\n<p>\u5728\u6267\u884cPlaybook\u201crouter_config.yml\u201d\u4e4b\u524d\uff0cRouter rtr1\u7684\u914d\u7f6e\u3002<\/p>\n<pre class=\"post-pre\"><code>rtr1#show running-config | include line\r\nline con 0\r\nline vty 0 4\r\nrtr1#\r\nrtr1#show running-config | include ssh \r\nip ssh rsa keypair-name ssh-key\r\nip ssh version 2\r\nip ssh pubkey-chain\r\n   key-hash ssh-rsa 2998C6AEB4C6351B5E0D2A894F084D99 ec2-user\r\n transport input ssh\r\nrtr1#\r\nrtr1#show running-config | include service\r\nservice timestamps debug datetime msec\r\nservice timestamps log datetime msec\r\nservice call-home\r\nrtr1#\r\n<\/code><\/pre>\n<p>\u6267\u884c\u201cPlaybok\u201d\u8def\u7531\u5668_config.yml\u201d<\/p>\n<pre class=\"post-pre\"><code>[student24@ansible networking-workshop]$ ansible-playbook -i lab_inventory\/hosts router_configs.yml\r\n\r\nPLAY [SNMP RO\/RW STRING CONFIGURATION] *****************************************\r\n\r\nTASK [ENSURE THAT THE DESIRED SNMP STRINGS ARE PRESENT] ************************\r\nok: [rtr1]\r\nok: [rtr3]\r\nok: [rtr2]\r\nok: [rtr4]\r\n\r\nPLAY [HARDEN IOS ROUTERS] ******************************************************\r\n\r\nTASK [ENSURE THAT ROUTERS ARE SECURE] ******************************************\r\nchanged: [rtr1]\r\nchanged: [rtr3]\r\nchanged: [rtr4]\r\nchanged: [rtr2]\r\n\r\nPLAY RECAP *********************************************************************\r\nrtr1                       : ok=2    changed=1    unreachable=0    failed=0   \r\nrtr2                       : ok=2    changed=1    unreachable=0    failed=0   \r\nrtr3                       : ok=2    changed=1    unreachable=0    failed=0   \r\nrtr4                       : ok=2    changed=1    unreachable=0    failed=0   \r\n\r\n[student24@ansible networking-workshop]$ \r\n<\/code><\/pre>\n<p>\u8bf7\u5728Router rtr1\u4e0a\u786e\u8ba4\u6267\u884c\u7ed3\u679c\u3002<\/p>\n<pre class=\"post-pre\"><code>rtr1#\r\nrtr1#show running-config | include line\r\nline con 0\r\nline vty 0 4\r\nrtr1#show running-config | include service\r\nservice tcp-keepalives-in\r\nservice tcp-keepalives-out\r\nservice timestamps debug datetime msec\r\nservice timestamps log datetime msec\r\nservice password-encryption\r\nservice call-home\r\nrtr1#\r\nrtr1#\r\nrtr1#show running-config | include ssh    \r\nip ssh time-out 60\r\nip ssh authentication-retries 5\r\nip ssh rsa keypair-name ssh-key\r\nip ssh version 2\r\nip ssh pubkey-chain\r\n   key-hash ssh-rsa 2998C6AEB4C6351B5E0D2A894F084D99 ec2-user\r\n transport input ssh\r\nrtr1#\r\n<\/code><\/pre>\n<p>\u7ec3\u4e602.1 &#8211; \u8bd5\u5907\u4efd\u8def\u7531\u5668\u914d\u7f6e<br \/>\n\u521b\u5efaplaybook\u201cbackup.yml\u201d<br \/>\n&#8211; \u521b\u5efa\u7528\u4e8e\u5907\u4efdCisco\u8def\u7531\u5668\u914d\u7f6e\u7684playbook\u3002\u4f7f\u7528ios_config\u6a21\u5757\u3002<\/p>\n<pre class=\"post-pre\"><code>[student24@ansible networking-workshop]$ vim backup.yml\r\n---\r\n- name: BACKUP ROUTER CONFIGURATIONS\r\n  hosts: cisco\r\n  connection: network_cli\r\n  gather_facts: no\r\n\r\n  tasks:\r\n    - name: BACKUP THE CONFIG\r\n      ios_config:\r\n        backup: yes\r\n      register: config_output\r\n<\/code><\/pre>\n<p>\u6267\u884c\u5907\u4efd.yml \u7684playbook<\/p>\n<pre class=\"post-pre\"><code>[student24@ansible networking-workshop]$ ansible-playbook -i lab_inventory\/hosts backup.yml\r\n\r\nPLAY [BACKUP ROUTER CONFIGURATIONS] ********************************************\r\n\r\nTASK [BACKUP THE CONFIG] *******************************************************\r\nok: [rtr2]\r\nok: [rtr1]\r\nok: [rtr3]\r\nok: [rtr4]\r\n\r\nPLAY RECAP *********************************************************************\r\nrtr1                       : ok=1    changed=0    unreachable=0    failed=0   \r\nrtr2                       : ok=1    changed=0    unreachable=0    failed=0   \r\nrtr3                       : ok=1    changed=0    unreachable=0    failed=0   \r\nrtr4                       : ok=1    changed=0    unreachable=0    failed=0   \r\n\r\n[student24@ansible networking-workshop]$ \r\n<\/code><\/pre>\n<p>\u786e\u8ba4\u5df2\u6210\u529f\u521b\u5efa\u4e86\u540d\u4e3a\u201c\u5907\u4efd\u201d\u7684\u76ee\u5f55\u3002<\/p>\n<pre class=\"post-pre\"><code>[student24@ansible networking-workshop]$ ls -l backup\r\n\u5408\u8a08 36\r\n-rw-rw-r--. 1 student24 student24 8801  5\u6708 14 11:35 rtr1_config.2019-05-14@11:35:53\r\n-rw-rw-r--. 1 student24 student24 8083  5\u6708 14 11:35 rtr2_config.2019-05-14@11:35:53\r\n-rw-rw-r--. 1 student24 student24 7536  5\u6708 14 11:35 rtr3_config.2019-05-14@11:35:53\r\n-rw-rw-r--. 1 student24 student24 7544  5\u6708 14 11:35 rtr4_config.2019-05-14@11:35:53\r\n[student24@ansible networking-workshop]$ \r\n[student24@ansible networking-workshop]$ ls\r\nREADME.ja.md  backup.yml           lab_inventory       secure_router.cfg\r\nREADME.md     exercises            parsers             templates\r\nbackup        gather_ios_data.yml  router_configs.yml\r\n[student24@ansible networking-workshop]$ \r\n<\/code><\/pre>\n<p>\u5728 &#8220;Playbook&#8221; \u7684 &#8220;backup.yml&#8221; \u6587\u4ef6\u4e2d\u6dfb\u52a0 &#8220;copy&#8221; \u6a21\u5757\u3002<\/p>\n<pre class=\"post-pre\"><code>[student24@ansible networking-workshop]$ vim backup.yml\r\n---\r\n- name: BACKUP ROUTER CONFIGURATIONS\r\n  hosts: cisco\r\n  connection: network_cli\r\n  gather_facts: no\r\n\r\n  tasks:\r\n    - name: BACKUP THE CONFIG\r\n      ios_config:\r\n        backup: yes\r\n      register: config_output\r\n\r\n    - name: RENAME BACKUP\r\n      copy:\r\n        src: \"{{config_output.backup_path}}\"\r\n        dest: \".\/backup\/{{inventory_hostname}}.config\"\r\n<\/code><\/pre>\n<p>\u518d\u6b21\u8fd0\u884c&#8221;backup.yml&#8221;\u7684Playbook<\/p>\n<pre class=\"post-pre\"><code>student24@ansible networking-workshop]$ ansible-playbook -i lab_inventory\/hosts backup.yml\r\n\r\nPLAY [BACKUP ROUTER CONFIGURATIONS] ********************************************\r\n\r\nTASK [BACKUP THE CONFIG] *******************************************************\r\nok: [rtr1]\r\nok: [rtr2]\r\nok: [rtr3]\r\nok: [rtr4]\r\n\r\nTASK [RENAME BACKUP] ***********************************************************\r\nchanged: [rtr3]\r\nchanged: [rtr4]\r\nchanged: [rtr1]\r\nchanged: [rtr2]\r\n\r\nPLAY RECAP *********************************************************************\r\nrtr1                       : ok=2    changed=1    unreachable=0    failed=0   \r\nrtr2                       : ok=2    changed=1    unreachable=0    failed=0   \r\nrtr3                       : ok=2    changed=1    unreachable=0    failed=0   \r\nrtr4                       : ok=2    changed=1    unreachable=0    failed=0   \r\n\r\n[student24@ansible networking-workshop]$ \r\n<\/code><\/pre>\n<p>\u786e\u8ba4\u5df2\u4fdd\u5b58\u53e6\u4e00\u4e2a\u5907\u4efd\u7684\u914d\u7f6e\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code>[student24@ansible networking-workshop]$ ls -l backup\r\n\u5408\u8a08 72\r\n-rw-rw-r--. 1 student24 student24 8801  5\u6708 14 11:41 rtr1.config\r\n-rw-rw-r--. 1 student24 student24 8801  5\u6708 14 11:41 rtr1_config.2019-05-14@11:41:22\r\n-rw-rw-r--. 1 student24 student24 8083  5\u6708 14 11:41 rtr2.config\r\n-rw-rw-r--. 1 student24 student24 8083  5\u6708 14 11:41 rtr2_config.2019-05-14@11:41:22\r\n-rw-rw-r--. 1 student24 student24 7536  5\u6708 14 11:41 rtr3.config\r\n-rw-rw-r--. 1 student24 student24 7536  5\u6708 14 11:41 rtr3_config.2019-05-14@11:41:22\r\n-rw-rw-r--. 1 student24 student24 7544  5\u6708 14 11:41 rtr4.config\r\n-rw-rw-r--. 1 student24 student24 7544  5\u6708 14 11:41 rtr4_config.2019-05-14@11:41:23\r\n[student24@ansible networking-workshop]$ \r\n<\/code><\/pre>\n<p>\u7ec3\u4e602.2 &#8211; \u5c1d\u8bd5\u4f7f\u7528\u5907\u4efd\u7684\u914d\u7f6e\u6587\u4ef6\u6765\u6062\u590d\u8def\u7531\u5668<br \/>\n\u786e\u4fdd\u5907\u4efd\u6587\u4ef6\u88ab\u5b58\u50a8\u5728\u5907\u4efd\u76ee\u5f55\u4e2d\u3002<\/p>\n<pre class=\"post-pre\"><code>[student24@ansible networking-workshop]$ tree backup\r\nbackup\r\n\u251c\u2500\u2500 rtr1.config\r\n\u251c\u2500\u2500 rtr1_config.2019-05-14@11:45:08\r\n\u251c\u2500\u2500 rtr2.config\r\n\u251c\u2500\u2500 rtr2_config.2019-05-14@11:45:08\r\n\u251c\u2500\u2500 rtr3.config\r\n\u251c\u2500\u2500 rtr3_config.2019-05-14@11:45:09\r\n\u251c\u2500\u2500 rtr4.config\r\n\u2514\u2500\u2500 rtr4_config.2019-05-14@11:45:09\r\n\r\n0 directories, 8 files\r\n[student24@ansible networking-workshop]$ \r\n<\/code><\/pre>\n<p>\u5728\u8def\u7531\u5668rtr1\u4e0a\u521b\u5efa\u56de\u73af\u63a5\u53e3101\u3002<\/p>\n<pre class=\"post-pre\"><code>rtr1#show running-config interface loopback 101\r\nBuilding configuration...\r\n\r\nCurrent configuration : 67 bytes\r\n!\r\ninterface Loopback101\r\n ip address 169.1.1.1 255.255.255.255\r\nend\r\n\r\nrtr1#\r\n<\/code><\/pre>\n<p>\u6267\u884c\u201cresore_config.yml\u201dPlaybook\u3002\uff08\u90e8\u5206\u5931\u8d25\uff09<\/p>\n<pre class=\"post-pre\"><code>student24@ansible networking-workshop]$ ansible-playbook -i lab_inventory\/hosts resore_config.yml\r\n\r\nPLAY [RESTORE CONFIGURATION] ***************************************************\r\n\r\nTASK [COPY RUNNING CONFIG TO ROUTER] *******************************************\r\nchanged: [rtr1]\r\n\r\n\u30fb\r\n\u30fb\r\n\u30fb\r\nPLAY RECAP *********************************************************************\r\nrtr1                       : ok=1    changed=1    unreachable=0    failed=0   \r\nrtr2                       : ok=0    changed=0    unreachable=0    failed=1   \r\nrtr3                       : ok=0    changed=0    unreachable=0    failed=1   \r\nrtr4                       : ok=0    changed=0    unreachable=0    failed=1   \r\n\r\n[student24@ansible networking-workshop]$\r\n<\/code><\/pre>\n<p>\u5728\u8def\u7531\u5668rtr1\u4e0a\u786e\u8ba4\u6587\u4ef6\u5df2\u88ab\u590d\u5236<\/p>\n<pre class=\"post-pre\"><code>rtr1#dir \r\nDirectory of bootflash:\/\r\n\r\n   11  drwx            16384  Jan 31 2019 20:11:12 +00:00  lost+found\r\n   12  -rw-        407131164  Jan 31 2019 20:12:39 +00:00  csr1000v-mono-universalk9.16.10.01b.SPA.pkg\r\n   13  -rw-         41893330  Jan 31 2019 20:12:40 +00:00  csr1000v-rpboot.16.10.01b.SPA.pkg\r\n   14  -rw-             1967  Jan 31 2019 20:12:40 +00:00  packages.conf\r\n105665  drwx             4096  May 13 2019 08:54:12 +00:00  .installer\r\n48769  drwx             4096  May 13 2019 08:54:11 +00:00  core\r\n   15  -rw-              128  May 13 2019 08:54:04 +00:00  iid_check.log\r\n203201  drwx             4096  May 13 2019 08:54:05 +00:00  .prst_sync\r\n32513  drwx             4096  May 13 2019 08:54:11 +00:00  .rollback_timer\r\n40641  drwx             8192  May 14 2019 11:54:32 +00:00  tracelogs\r\n65025  drwx             4096  May 13 2019 08:55:34 +00:00  .dbpersist\r\n138177  drwx             4096  May 13 2019 08:54:20 +00:00  virtual-instance\r\n   16  -rw-               30  May 13 2019 08:55:11 +00:00  throughput_monitor_params\r\n   17  -rw-             6078  May 13 2019 08:55:32 +00:00  cvac.log\r\n   18  -rw-                1  May 13 2019 08:55:21 +00:00  .cvac_version\r\n   19  -rw-               16  May 13 2019 08:55:21 +00:00  ovf-env.xml.md5\r\n   20  -rw-              209  May 13 2019 08:55:21 +00:00  csrlxc-cfg.log\r\n170689  drwx             4096  May 13 2019 08:55:21 +00:00  onep\r\n398273  drwx             4096  May 14 2019 10:58:45 +00:00  syslog\r\n414529  drwx             4096  May 13 2019 08:55:48 +00:00  iox\r\n   21  -rw-             8740  May 14 2019 11:53:53 +00:00  rtr1.config\r\n\r\n7897378816 bytes total (7046279168 bytes free)\r\nrtr1# \r\nrtr1#\r\nrtr1#show clo\r\n*11:57:52.110 UTC Tue May 14 2019\r\nrtr1#\r\n<\/code><\/pre>\n<p>\u5728Playbook\u7684\u201cresore_config.yml\u201d\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u7684\u4efb\u52a1\u3002<\/p>\n<pre class=\"post-pre\"><code>[student24@ansible networking-workshop]$ vim resore_config.yml\r\n---\r\n- name: RESTORE CONFIGURATION\r\n  hosts: cisco\r\n  connection: network_cli\r\n  gather_facts: no\r\n\r\n  tasks:\r\n    - name: COPY RUNNING CONFIG TO ROUTER\r\n      command: scp .\/backup\/{{inventory_hostname}}.config {{inventory_hostname}}:\/{{inventory_hostname}}.config\r\n\r\n    - name: CONFIG REPLACE\r\n      ios_command:\r\n        commands:\r\n          - config replace flash:{{inventory_hostname}}.config force\r\n<\/code><\/pre>\n<p>\u6267\u884cPlaybook\u201cresore_config.yml\u201d\uff08\u90e8\u5206\u6267\u884c\u5931\u8d25\uff09\u3002<\/p>\n<pre class=\"post-pre\"><code>[student24@ansible networking-workshop]$ ansible-playbook -i lab_inventory\/hosts resore_config.yml \r\n\r\nPLAY [RESTORE CONFIGURATION] ***************************************************\r\n\r\nTASK [COPY RUNNING CONFIG TO ROUTER] *******************************************\r\nchanged: [rtr2]\r\nchanged: [rtr1]\r\n\u30fb\r\n\u30fb\r\n\u30fb\r\nTASK [CONFIG REPLACE] **********************************************************\r\nok: [rtr1]\r\nok: [rtr2]\r\n\r\nPLAY RECAP *********************************************************************\r\nrtr1                       : ok=2    changed=1    unreachable=0    failed=0   \r\nrtr2                       : ok=2    changed=1    unreachable=0    failed=0   \r\nrtr3                       : ok=0    changed=0    unreachable=0    failed=1   \r\nrtr4                       : ok=0    changed=0    unreachable=0    failed=1   \r\n\r\n[student24@ansible networking-workshop]$ \r\n<\/code><\/pre>\n<p>\u4f7f\u7528\u5907\u4efd\u6587\u4ef6\uff0c\u786e\u8ba4\u521a\u624d\u5728Router rtr1\u4e0a\u521b\u5efa\u7684\u56de\u73af101\u5df2\u88ab\u5220\u9664\u3002<\/p>\n<pre class=\"post-pre\"><code>rtr1#sh ip interface brief \r\nInterface              IP-Address      OK? Method Status                Protocol\r\nGigabitEthernet1       172.16.172.61   YES DHCP   up                    up      \r\nLoopback0              192.168.1.101   YES manual up                    up      \r\nLoopback1              10.1.1.101      YES manual up                    up      \r\nTunnel0                10.100.100.1    YES manual up                    up      \r\nTunnel1                10.200.200.1    YES manual up                    up      \r\nTunnel2                10.255.0.254    YES manual up                    up      \r\nVirtualPortGroup0      192.168.35.101  YES TFTP   up                    up      \r\nrtr1#\r\nrtr1#\r\nrtr1#\r\nrtr1#show running-config interface loopback 101\r\n                                            ^\r\n% Invalid input detected at '^' marker.\r\n\r\nrtr1#\r\n<\/code><\/pre>\n<h1>\u6240\u6709\u4eba\u5171\u4eab\u3002<\/h1>\n<h4>\u7b2c\u4e00\u4e2a\u4eba\u83b7\u5f97\u5171\u4eab\u7684\u6210\u679c\u3002<\/h4>\n<p>\u6211\u5df2\u7ecf\u5b8c\u6210\u4e861.0\u52303.1\u7684\u90e8\u5206\u3002<br \/>\n\u6700\u8fd1\uff0cAnsible\u4e5f\u5f00\u59cb\u5728\u6211\u7684\u5de5\u4f5c\u4e2d\u4f7f\u7528\u3002<br \/>\n\u6700\u540e\u7531\u4e8e\u6709\u989d\u5916\u7684\u65f6\u95f4\uff0c\u6211\u8fd8\u5728QA\u7684\u65b9\u5411\u4e0a\u63d0\u4e86\u4e00\u4e9b\u95ee\u9898\u3002<br \/>\n\u7531\u4e8eSCP\u7684\u652f\u6301\u4e0d\u597d\uff0c\u6700\u540e\u4e0d\u5f97\u4e0d\u8fdb\u884c\u4e86\u7f51\u7edc\u6545\u969c\u6392\u9664\u3002<\/p>\n<h4>\u7b2c\u4e8c\u4e2a\u4eba\u7684\u6210\u679c\u662f\u5171\u6709\u7684\u3002<\/h4>\n<p>\u5728\u516c\u53f8\u5f00\u59cb\u4f7f\u7528Ansible\u5df2\u7ecf\u67094\u4e2a\u6708\u4e86\u3002<br \/>\n\u867d\u7136\u5e73\u65f6\u5f88\u5c11\u78b0\u7f51\u7edc\u8bbe\u5907\uff0c\u4f46\u8fd8\u662f\u53ef\u4ee5\u50cf\u64cd\u4f5c\u4e2d\u95f4\u4ef6\u4e00\u6837\u8f7b\u677e\u5730\u8fdb\u884c\u64cd\u4f5c\u3002<\/p>\n<h1>\u603b\u7ed3<\/h1>\n<p>\u30fb\u611f\u8c22\u60a8\u521b\u5efa\u4e86\u4e00\u4e2a\u65b9\u4fbf\u63a5\u89e6Ansible\u7684\u73af\u5883\u548c\u673a\u4f1a\uff0c\u771f\u7684\u975e\u5e38\u611f\u6fc0\u3002<br \/>\n\u30fb\u867d\u7136\u6ca1\u6709\u4ec0\u4e48\u9ad8\u6548\u7684\u65b9\u6cd5\uff0c\u4f46\u662f\u6309\u7167\u6307\u793a\u6216\u8005\u6309\u7167\u6240\u5199\u7684\u65b9\u5f0f\u4f7f\u7528Ansible\uff0c\u4e00\u904d\u53c8\u4e00\u904d\u5730\u5c1d\u8bd5\uff0c\u8001\u5b9e\u8bf4\u65e0\u6cd5\u5c06\u7406\u89e3\u7ec6\u8282\u7eb3\u5165\u5176\u4e2d\u3002\u56de\u5230\u5bb6\u540e\u4f1a\u518d\u6b21\u5c1d\u8bd5\u4f7f\u7528Ansible\u3002<br \/>\n\u6b64\u5916\uff0c\u867d\u7136\u6709\u673a\u4f1a\u5728\u73b0\u573a\u63d0\u95ee\uff0c\u4f46\u662f\u65e0\u6cd5\u53c2\u52a0QA\u652f\u6301\uff0c\u4e0b\u6b21\u4f1a\u66f4\u52a0\u4ece\u5bb9\u5730\u5e94\u5bf9\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d4e2437434c4406cbfde7\/94-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2019-05-16 21.35.09.png\" \/><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u6211\u53c2\u52a0\u4e86Ansible\u793e\u7fa4\u7684\u5de5\u4f5c\u574a\u3002 \u4eca\u5e74\u4e00\u6708\u4efd\u5728 Network Automation with Ansib [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-42681","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>\u7b2c\u4e00\u6b21\u7684Ansible\u81ea\u6211\u60a0\u95f2\u5c0f\u805a - 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\/\u7b2c\u4e00\u6b21\u7684ansible\u81ea\u6211\u60a0\u95f2\u5c0f\u805a\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u7b2c\u4e00\u6b21\u7684Ansible\u81ea\u6211\u60a0\u95f2\u5c0f\u805a\" \/>\n<meta property=\"og:description\" content=\"\u6211\u53c2\u52a0\u4e86Ansible\u793e\u7fa4\u7684\u5de5\u4f5c\u574a\u3002 \u4eca\u5e74\u4e00\u6708\u4efd\u5728 Network Automation with Ansib [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u7b2c\u4e00\u6b21\u7684ansible\u81ea\u6211\u60a0\u95f2\u5c0f\u805a\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-04-08T10:35:25+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-05-03T22:19:06+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d4e2437434c4406cbfde7\/3-0.png\" \/>\n<meta name=\"author\" content=\"\u79d1, \u96c5\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u79d1, \u96c5\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 \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\/%e7%ac%ac%e4%b8%80%e6%ac%a1%e7%9a%84ansible%e8%87%aa%e6%88%91%e6%82%a0%e9%97%b2%e5%b0%8f%e8%81%9a\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e7%ac%ac%e4%b8%80%e6%ac%a1%e7%9a%84ansible%e8%87%aa%e6%88%91%e6%82%a0%e9%97%b2%e5%b0%8f%e8%81%9a\/\",\"name\":\"\u7b2c\u4e00\u6b21\u7684Ansible\u81ea\u6211\u60a0\u95f2\u5c0f\u805a - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-04-08T10:35:25+00:00\",\"dateModified\":\"2024-05-03T22:19:06+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e7%ac%ac%e4%b8%80%e6%ac%a1%e7%9a%84ansible%e8%87%aa%e6%88%91%e6%82%a0%e9%97%b2%e5%b0%8f%e8%81%9a\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e7%ac%ac%e4%b8%80%e6%ac%a1%e7%9a%84ansible%e8%87%aa%e6%88%91%e6%82%a0%e9%97%b2%e5%b0%8f%e8%81%9a\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e7%ac%ac%e4%b8%80%e6%ac%a1%e7%9a%84ansible%e8%87%aa%e6%88%91%e6%82%a0%e9%97%b2%e5%b0%8f%e8%81%9a\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u7b2c\u4e00\u6b21\u7684Ansible\u81ea\u6211\u60a0\u95f2\u5c0f\u805a\"}]},{\"@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\/41e222757cdd2a3365361328bd79970a\",\"name\":\"\u79d1, \u96c5\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g\",\"caption\":\"\u79d1, \u96c5\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/keya\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e7%ac%ac%e4%b8%80%e6%ac%a1%e7%9a%84ansible%e8%87%aa%e6%88%91%e6%82%a0%e9%97%b2%e5%b0%8f%e8%81%9a\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u7b2c\u4e00\u6b21\u7684Ansible\u81ea\u6211\u60a0\u95f2\u5c0f\u805a - 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\/\u7b2c\u4e00\u6b21\u7684ansible\u81ea\u6211\u60a0\u95f2\u5c0f\u805a\/","og_locale":"zh_CN","og_type":"article","og_title":"\u7b2c\u4e00\u6b21\u7684Ansible\u81ea\u6211\u60a0\u95f2\u5c0f\u805a","og_description":"\u6211\u53c2\u52a0\u4e86Ansible\u793e\u7fa4\u7684\u5de5\u4f5c\u574a\u3002 \u4eca\u5e74\u4e00\u6708\u4efd\u5728 Network Automation with Ansib [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u7b2c\u4e00\u6b21\u7684ansible\u81ea\u6211\u60a0\u95f2\u5c0f\u805a\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-04-08T10:35:25+00:00","article_modified_time":"2024-05-03T22:19:06+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d4e2437434c4406cbfde7\/3-0.png"}],"author":"\u79d1, \u96c5","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u79d1, \u96c5","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"12 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e7%ac%ac%e4%b8%80%e6%ac%a1%e7%9a%84ansible%e8%87%aa%e6%88%91%e6%82%a0%e9%97%b2%e5%b0%8f%e8%81%9a\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e7%ac%ac%e4%b8%80%e6%ac%a1%e7%9a%84ansible%e8%87%aa%e6%88%91%e6%82%a0%e9%97%b2%e5%b0%8f%e8%81%9a\/","name":"\u7b2c\u4e00\u6b21\u7684Ansible\u81ea\u6211\u60a0\u95f2\u5c0f\u805a - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-04-08T10:35:25+00:00","dateModified":"2024-05-03T22:19:06+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e7%ac%ac%e4%b8%80%e6%ac%a1%e7%9a%84ansible%e8%87%aa%e6%88%91%e6%82%a0%e9%97%b2%e5%b0%8f%e8%81%9a\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e7%ac%ac%e4%b8%80%e6%ac%a1%e7%9a%84ansible%e8%87%aa%e6%88%91%e6%82%a0%e9%97%b2%e5%b0%8f%e8%81%9a\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e7%ac%ac%e4%b8%80%e6%ac%a1%e7%9a%84ansible%e8%87%aa%e6%88%91%e6%82%a0%e9%97%b2%e5%b0%8f%e8%81%9a\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u7b2c\u4e00\u6b21\u7684Ansible\u81ea\u6211\u60a0\u95f2\u5c0f\u805a"}]},{"@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\/41e222757cdd2a3365361328bd79970a","name":"\u79d1, \u96c5","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g","caption":"\u79d1, \u96c5"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/keya\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e7%ac%ac%e4%b8%80%e6%ac%a1%e7%9a%84ansible%e8%87%aa%e6%88%91%e6%82%a0%e9%97%b2%e5%b0%8f%e8%81%9a\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/42681","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\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=42681"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/42681\/revisions"}],"predecessor-version":[{"id":96627,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/42681\/revisions\/96627"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=42681"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=42681"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=42681"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}