文档章节

ansible基本模块使用

eddy_linux
 eddy_linux
发布于 2015/11/18 13:57
字数 2080
阅读 1005
收藏 2
-a MODULE_ARGS, --args=MODULE_ARGS
-m MODULE_NAME, --module-name=MODULE_NAME

1.测试ping
[root@eddy ~]# ansible all -m ping
eddy | success >> {
    "changed": false,
    "ping": "pong"
}

[root@eddy ~]# ansible all -m ping -u eddy
#以用户eddy去ping所有主机

[root@eddy ~]# ansible all -m ping -u eddy --sudo
#以用户eddy用root身份去ping所有主机

2.查看模块帮助
可以通过ansible-doc进行查看

[root@eddy ~]# ansible-doc  shell
less 436
Copyright (C) 1984-2009 Mark Nudelman

less comes with NO WARRANTY, to the extent permitted by law.
For information about the terms of redistribution,
see the file named README in the less distribution.
Homepage: http://www.greenwoodsoftware.com/less
> SHELL

  The [shell] module takes the command name followed by a list of
  space-delimited arguments. It is almost exactly like the [command]
  module but runs the command through a shell (`/bin/sh') on the
  remote node.

Options (= is mandatory):

- chdir
        cd into this directory before running the command [Default:
        None]

- creates
        a filename, when it already exists, this step will *not* be
        run. [Default: None]

- executable
        change the shell used to execute the command. Should be an
        absolute path to the executable. [Default: None]

= free_form
        The shell module takes a free form command to run, as a
        string.  There's not an actual option named "free form".  See
        the examples! [Default: None]

- removes
        a filename, when it does not exist, this step will *not* be
        run. [Default: None]

- warn
        if command warnings are on in ansible.cfg, do not warn about
        this particular line if set to no/false. [Default: True]

Notes:  If you want to execute a command securely and predictably, it may be
        better to use the [command] module instead. Best practices
        when writing playbooks will follow the trend of using
        [command] unless [shell] is explicitly required. When running
        ad-hoc commands, use your best judgement. To sanitize any
        variables passed to the shell module, you should use "{{ var |
        quote }}" instead of just "{{ var }}" to make sure they don't
        include evil things like semicolons.

EXAMPLES:
# Execute the command in remote shell; stdout goes to the specified
# file on the remote.
- shell: somescript.sh >> somelog.txt

# Change the working directory to somedir/ before executing the command.
- shell: somescript.sh >> somelog.txt chdir=somedir/

# You can also use the 'args' form to provide the options. This command
# will change the working directory to somedir/ and will only run when
# somedir/somelog.txt doesn't exist.
- shell: somescript.sh >> somelog.txt
  args:
    chdir: somedir/
    creates: somelog.txt




3.并行性和shell命令
[root@eddy ~]# ansible eddy -a '/sbin/reboot' -f 10 重启eddy组下的所有主机10次 默认情况下使用command模块,但不支持管道和shell变量,shell模块支持

[root@eddy ~]# ansible eddy -m shell -a 'echo $PATH'

[root@eddy ~]# ansible eddy -m command -a 'uptime'
eddy | success | rc=0 >>
 11:34:27 up 17 days, 22:43,  2 users,  load average: 0.08, 0.02, 0.01
等价于
[root@eddy ~]# ansible eddy  -a 'uptime'
eddy | success | rc=0 >>
 11:34:44 up 17 days, 22:43,  2 users,  load average: 0.06, 0.02, 0.00

4.传输文件
[root@eddy ~]# ansible eddy -m copy -a 'src=/etc/hosts dest=/opt/hosts'
eddy | success >> {
    "changed": true,
    "checksum": "4cd5e5c28fa400e428c592f89b05e2d3feadb3e0",
    "dest": "/opt/hosts",
    "gid": 0,
    "group": "root",
    "md5sum": "6acaf54c3f3c419e70ce09e6dc7956f7",
    "mode": "0644",
    "owner": "root",
    "size": 152,
    "src": "/root/.ansible/tmp/ansible-tmp-1447823306.59-157076705372231/source",
    "state": "file",
    "uid": 0
}

5.修改权限
[root@eddy ~]# ll /opt/hosts
-rw-r--r-- 1 root root 152 Nov 18 13:08 /opt/hosts
[root@eddy ~]# ansible eddy -m file -a 'dest=/opt/hosts mode=600'
eddy | success >> {
    "changed": true,
    "gid": 0,
    "group": "root",
    "mode": "0600",
    "owner": "root",
    "path": "/opt/hosts",
    "size": 152,
    "state": "file",
    "uid": 0
}
[root@eddy ~]# ll /opt/hosts
-rw------- 1 root root 152 Nov 18 13:08 /opt/hosts

创建目录
[root@eddy ~]# ansible eddy -m file -a 'dest=/opt/eddy/yys/linux mode=755 owner=eddy group=eddy state=directory'
eddy | success >> {
    "changed": true,
    "gid": 500,
    "group": "eddy",
    "mode": "0755",
    "owner": "eddy",
    "path": "/opt/eddy/yys/linux",
    "size": 4096,
    "state": "directory",
    "uid": 500
}

删除文件或者目录
[root@eddy ~]# ansible eddy -m file -a 'dest=/opt/eddy/yys/linux state=absent'
eddy | success >> {
    "changed": true,
    "path": "/opt/eddy/yys/linux",
    "state": "absent"
}
[root@eddy ~]# ansible eddy -m file -a 'dest=/opt/hosts state=absent'
eddy | success >> {
    "changed": true,
    "path": "/opt/hosts",
    "state": "absent"
}



6.管理软件包
EXAMPLES:
- name: install the latest version of Apache
  yum: name=httpd state=latest

- name: remove the Apache package
  yum: name=httpd state=absent

- name: install the latest version of Apache from the testing repo
  yum: name=httpd enablerepo=testing state=present

- name: install one specific version of Apache
  yum: name=httpd-2.2.29-1.4.amzn1 state=present

- name: upgrade all packages
  yum: name=* state=latest

- name: install the nginx rpm from a remote repo
  yum: name=http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm state=present

- name: install nginx rpm from a local file
  yum: name=/usr/local/src/nginx-release-centos-6-0.el6.ngx.noarch.rpm state=present

- name: install the 'Development tools' package group
  yum: name="@Development tools" state=present
[root@eddy ~]# ansible eddy -m yum -a 'name=httpd state=present'
确认httpd已经安装,但不更新
[root@eddy ~]# rpm -qa|grep httpd
[root@eddy ~]# ansible eddy -m yum -a 'name=httpd state=present'
eddy | success >> {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: security\nSetting up Install Process\nResolving Dependencies\n--> Running transaction check\n---> Package httpd.x86_64 0:2.2.15-45.el6.centos will be installed\n--> Processing Dependency: httpd-tools = 2.2.15-45.el6.centos for package: httpd-2.2.15-45.el6.centos.x86_64\n--> Processing Dependency: apr-util-ldap for package: httpd-2.2.15-45.el6.centos.x86_64\n--> Running transaction check\n---> Package apr-util-ldap.x86_64 0:1.3.9-3.el6_0.1 will be installed\n---> Package httpd-tools.x86_64 0:2.2.15-45.el6.centos will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package             Arch         Version                    Repository    Size\n================================================================================\nInstalling:\n httpd               x86_64       2.2.15-45.el6.centos       centos       829 k\nInstalling for dependencies:\n apr-util-ldap       x86_64       1.3.9-3.el6_0.1            centos        15 k\n httpd-tools         x86_64       2.2.15-45.el6.centos       centos        77 k\n\nTransaction Summary\n================================================================================\nInstall       3 Package(s)\n\nTotal download size: 921 k\nInstalled size: 3.1 M\nDownloading Packages:\n--------------------------------------------------------------------------------\nTotal                                           1.1 MB/s | 921 kB     00:00     \nRunning rpm_check_debug\nRunning Transaction Test\nTransaction Test Succeeded\nRunning Transaction\n\r  Installing : httpd-tools-2.2.15-45.el6.centos.x86_64                      1/3 \n\r  Installing : apr-util-ldap-1.3.9-3.el6_0.1.x86_64                         2/3 \n\r  Installing : httpd-2.2.15-45.el6.centos.x86_64                            3/3 \n\r  Verifying  : httpd-2.2.15-45.el6.centos.x86_64                            1/3 \n\r  Verifying  : apr-util-ldap-1.3.9-3.el6_0.1.x86_64                         2/3 \n\r  Verifying  : httpd-tools-2.2.15-45.el6.centos.x86_64                      3/3 \n\nInstalled:\n  httpd.x86_64 0:2.2.15-45.el6.centos                                           \n\nDependency Installed:\n  apr-util-ldap.x86_64 0:1.3.9-3.el6_0.1                                        \n  httpd-tools.x86_64 0:2.2.15-45.el6.centos                                     \n\nComplete!\n"
    ]
}

[root@eddy ~]# rpm -qa|grep httpd
httpd-tools-2.2.15-45.el6.centos.x86_64
httpd-2.2.15-45.el6.centos.x86_64

[root@eddy ~]# ansible eddy -m yum -a 'name=httpd-2.2 state=present'
确认安装一个特定版本
ansible eddy -m yum -a 'name=httpd-2.2 state=last'
确认安装最新版本
[root@eddy ~]# ansible eddy -m yum -a 'name=httpd state=absent'
卸载一个已安装
[root@eddy ~]# ansible eddy -m yum -a 'name=httpd state=absent'
eddy | success >> {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: security\nSetting up Remove Process\nResolving Dependencies\n--> Running transaction check\n---> Package httpd.x86_64 0:2.2.15-45.el6.centos will be erased\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package      Arch          Version                        Repository      Size\n================================================================================\nRemoving:\n httpd        x86_64        2.2.15-45.el6.centos           @centos        2.9 M\n\nTransaction Summary\n================================================================================\nRemove        1 Package(s)\n\nInstalled size: 2.9 M\nDownloading Packages:\nRunning rpm_check_debug\nRunning Transaction Test\nTransaction Test Succeeded\nRunning Transaction\n\r  Erasing    : httpd-2.2.15-45.el6.centos.x86_64                            1/1 \n\r  Verifying  : httpd-2.2.15-45.el6.centos.x86_64                            1/1 \n\nRemoved:\n  httpd.x86_64 0:2.2.15-45.el6.centos                                           \n\nComplete!\n"
    ]
}

7.服务管理
root@eddy ~]# ansible eddy -m service -a 'name=nginx state=running,started,stopped,restarted,reloaded'

8.搜索系统信息
[root@eddy ~]# ansible eddy -m setup
eddy | success >> {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "10.162.61.94",
            "112.124.120.242"
        ],
        "ansible_all_ipv6_addresses": [],
        "ansible_architecture": "x86_64",
        "ansible_bios_date": "12/16/2014",
        "ansible_bios_version": "4.0.1",
        "ansible_cmdline": {
            "KEYBOARDTYPE": "pc",
            "KEYTABLE": "us",
            "LANG": "en_US.UTF-8",
            "SYSFONT": "latarcyrheb-sun16",
            "quiet": true,
            "rd_NO_DM": true,
            "rd_NO_LUKS": true,
            "rd_NO_LVM": true,
            "rd_NO_MD": true,
            "rhgb": true,
            "ro": true,
            "root": "UUID=94e4e384-0ace-437f-bc96-057dd64f42ee"
        },
        "ansible_date_time": {
            "date": "2015-11-18",
            "day": "18",
            "epoch": "1447825984",
            "hour": "13",
            "iso8601": "2015-11-18T05:53:04Z",
            "iso8601_micro": "2015-11-18T05:53:04.737741Z",
            "minute": "53",
            "month": "11",
            "second": "04",
            "time": "13:53:04",
            "tz": "CST",
            "tz_offset": "+0800",
            "weekday": "Wednesday",
            "year": "2015"
        },
        "ansible_default_ipv4": {
            "address": "X.X.X.X",
            "alias": "eth1",
            "gateway": "X.X.X.X",
            "interface": "eth1",
            "macaddress": "00:16:3e:00:40:1c",
            "mtu": 1500,
            "netmask": "X.X.X.X",
            "network": "X.X.X.X",
            "type": "ether"
        },
        "ansible_default_ipv6": {},
        "ansible_devices": {
            "xvda": {
                "holders": [],
                "host": "",
                "model": null,
                "partitions": {
                    "xvda1": {
                        "sectors": "41940992",
                        "sectorsize": 512,
                        "size": "20.00 GB",
                        "start": "2048"
                    }
                },
                "removable": "0",
                "rotational": "0",
                "scheduler_mode": "cfq",
                "sectors": "41943040",
                "sectorsize": "512",
                "size": "20.00 GB",
                "support_discard": "0",
                "vendor": null
            }
        },
        "ansible_distribution": "CentOS",
        "ansible_distribution_major_version": "6",
        "ansible_distribution_release": "Final",
        "ansible_distribution_version": "6.5",
        "ansible_domain": "",
        "ansible_env": {
            "CVS_RSH": "ssh",
            "G_BROKEN_FILENAMES": "1",
            "HOME": "/root",
            "LANG": "C",
            "LC_CTYPE": "C",
            "LESSOPEN": "|/usr/bin/lesspipe.sh %s",
            "LOGNAME": "root",
            "MAIL": "/var/mail/root",
            "PATH": "/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin",
            "PWD": "/root",
            "SHELL": "/bin/bash",
            "SHLVL": "2",
            "SSH_CLIENT": "X.X.X.X 44220 XXXX",
            "SSH_CONNECTION": "X.X.X.X 44220 X.X.X.X XXXX",
            "USER": "root",
            "_": "/usr/bin/python"
        },
        "ansible_eth0": {
            "active": true,
            "device": "eth0",
            "ipv4": {
                "address": "X.X.X.X",
                "netmask": "X.X.X.X",
                "network": "X.X.X.X"
            },
            "macaddress": "00:16:3e:00:0f:62",
            "module": "xen_netfront",
            "mtu": 1500,
            "promisc": false,
            "type": "ether"
        },
        "ansible_eth1": {
            "active": true,
            "device": "eth1",
            "ipv4": {
                "address": "X.X.X.X",
                "netmask": "X.X.X.X",
                "network": "X.X.X.X"
            },
            "macaddress": "00:16:3e:00:40:1c",
            "module": "xen_netfront",
            "mtu": 1500,
            "promisc": false,
            "type": "ether"
        },
        "ansible_fips": false,
        "ansible_form_factor": "Other",
        "ansible_fqdn": "eddy",
        "ansible_hostname": "eddy",
        "ansible_interfaces": [
            "lo",
            "eth1",
            "eth0"
        ],
        "ansible_kernel": "2.6.32-431.23.3.el6.x86_64",
        "ansible_lo": {
            "active": true,
            "device": "lo",
            "ipv4": {
                "address": "X.X.X.X",
                "netmask": "X.X.X.X",
                "network": "X.X.X.X"
            },
            "mtu": 16436,
            "promisc": false,
            "type": "loopback"
        },
        "ansible_lsb": {
            "codename": "Final",
            "description": "CentOS release 6.5 (Final)",
            "id": "CentOS",
            "major_release": "6",
            "release": "6.5"
        },
        "ansible_machine": "x86_64",
        "ansible_memfree_mb": 138,
        "ansible_memory_mb": {
            "nocache": {
                "free": 761,
                "used": 233
            },
            "real": {
                "free": 138,
                "total": 994,
                "used": 856
            },
            "swap": {
                "cached": 0,
                "free": 0,
                "total": 0,
                "used": 0
            }
        },
        "ansible_memtotal_mb": 994,
        "ansible_mounts": [
            {
                "device": "/dev/xvda1",
                "fstype": "ext4",
                "mount": "/",
                "options": "rw,barrier=0",
                "size_available": 17495089152,
                "size_total": 21136797696,
                "uuid": "94e4e384-0ace-437f-bc96-057dd64f42ee"
            }
        ],
        "ansible_nodename": "eddy",
        "ansible_os_family": "RedHat",
        "ansible_pkg_mgr": "yum",
        "ansible_processor": [
            "GenuineIntel",
            "Intel(R) Xeon(R) CPU E5-2630 0 @ 2.30GHz"
        ],
        "ansible_processor_cores": 1,
        "ansible_processor_count": 1,
        "ansible_processor_threads_per_core": 1,
        "ansible_processor_vcpus": 1,
        "ansible_product_name": "HVM domU",
        "ansible_product_serial": "8ffbe0b4-0f8e-4341-af50-6166468d70f6",
        "ansible_product_uuid": "8FFBE0B4-0F8E-4341-AF50-6166468D70F6",
        "ansible_product_version": "4.0.1",
        "ansible_python_version": "2.6.6",
        "ansible_selinux": false,
        "ansible_ssh_host_key_dsa_public": "AAAAB3NzaC1kc3MAAACBAJKuO5QUWmpOv5tVL24HJWQkASwuLnqxISxLZlfUakbUtOOzZPqJCdyRCjrs+8CtE5yfrq2BdIA4KRmXNJiz7attp6HHz0zDzAeBbUO/ttt3SpeIhEzX1e5pUorinoIpD5K1DghLaDk9s1nY+pHyxFkI5hrtPF35PbKZDP38WtRvAAAAFQDvcLJa2GAhGoGmcVfi9F0lnkgGtwAAAIBZCo1E/LL5SBPpy2gcCH00/VXyvWkRKuHpcTJc6YSlvaWttOLqQf21an80EoTGvVJxThKKjIOf1lXFqtrqkS2EVIc2cuDOVszC70NqNw0ou8L9VOiLDXHuXAElar/Ic3sgQhPpzzUWDzMIBB6YLqyWKfYorMSEAWP0/bSNSJYB9gAAAIA2qLHzF52/scTIscC60RCgE2K3YYPCI4p61YNmYuNgyjGeSVH+4vD1JI4czbxKbLZHqpnbN3LrMuQg/6MjfFkUeH5X5RmtUCd5hlPsky06Si29ltrFyDVXnykr4/g+g6P7T7U8ojgRnA8mvrcQthizZG9aflk3OzgYhVQSUJiAbA==",
        "ansible_ssh_host_key_rsa_public": "AAAAB3NzaC1yc2EAAAABIwAAAQEAprbgXfwUE2ZIQ1GsO9fOFb46oZGJ4V1+7nthfFvof8dbS1ll8cTxzvC6RPbSmZFwwbA47jt6wf2fTlTW7iHcR7atx6SPj5l0BODFqw6+2q4PxebCN65XuigX8p+gphGhe5exh9i6sPl7zRGGPeKdLNnZp17DyqumnsB6zRiWU24QmFMepldlgDvK8ETVYHAD+/GjKYrqfJYb6u5+F8VR7FsCfuNGTC41dVt4vGx8xdIboRbDnrzODm16rWpDGf1cNmfjjaCVuR9bF1ZmS89Y94BTVkwXgpICYmL7uUS2TaDHtM9MJ5Az+j/k+YnSnS0a8LcTljXIhqi5HgFH3U61Nw==",
        "ansible_swapfree_mb": 0,
        "ansible_swaptotal_mb": 0,
        "ansible_system": "Linux",
        "ansible_system_vendor": "Xen",
        "ansible_user_dir": "/root",
        "ansible_user_gecos": "root",
        "ansible_user_gid": 0,
        "ansible_user_id": "root",
        "ansible_user_shell": "/bin/bash",
        "ansible_user_uid": 0,
        "ansible_userspace_architecture": "x86_64",
        "ansible_userspace_bits": "64",
        "ansible_virtualization_role": "guest",
        "ansible_virtualization_type": "xen",
        "module_setup": true
    },
    "changed": false
}
[root@eddy ~]# ansible eddy -m setup --tree /tmp/facts
把信息以主机名的方式存储到/tmp/facts目录下
[root@eddy ~]# ansible eddy -m setup -a 'filter=ansible_*_mb'
搜索内存信息
eddy | success >> {
    "ansible_facts": {
        "ansible_memfree_mb": 136,
        "ansible_memory_mb": {
            "nocache": {
                "free": 760,
                "used": 234
            },
            "real": {
                "free": 136,
                "total": 994,
                "used": 858
            },
            "swap": {
                "cached": 0,
                "free": 0,
                "total": 0,
                "used": 0
            }
        },
        "ansible_memtotal_mb": 994,
        "ansible_swapfree_mb": 0,
        "ansible_swaptotal_mb": 0
    },
    "changed": false
}

[root@eddy ~]# ansible eddy -m setup -a 'filter=ansible_eth[0-9]'
搜索网卡信息
eddy | success >> {
    "ansible_facts": {
        "ansible_eth0": {
            "active": true,
            "device": "eth0",
            "ipv4": {
                "address": "X.X.X.X",
                "netmask": "X.X.X.X",
                "network": "X.X.X.X"
            },
            "macaddress": "00:16:3e:00:0f:62",
            "module": "xen_netfront",
            "mtu": 1500,
            "promisc": false,
            "type": "ether"
        },
        "ansible_eth1": {
            "active": true,
            "device": "eth1",
            "ipv4": {
                "address": "X.X.X.X",
                "netmask": "X.X.X.X",
                "network": "X.X.X.X"
            },
            "macaddress": "00:16:3e:00:40:1c",
            "module": "xen_netfront",
            "mtu": 1500,
            "promisc": false,
            "type": "ether"
        }
    },
    "changed": false
}


© 著作权归作者所有

共有 人打赏支持
eddy_linux
粉丝 21
博文 135
码字总数 188789
作品 0
成都
程序员
私信 提问
python之ansible基本架构

ansible的介绍以及运行原理 目前比较流行的自动化运维工具有下面2款 1.saltstack 基于python开发,采用c/s架构(服务端和客户端)配置语法用的是YMAL,使用脚本配置非常简单 2.ansible 基于p...

铁扇公主1
2017/10/07
32
0
ansible及ansible-palybook使用详解

ansible是一个综合的强大的管理工具,他可以对多台主机安装操作系统,并为这些主机安装不同的应用程序,也可以通知指挥这些主机完成不同的任务.查看多台主机的各种信息的状态等,ansible都可以通...

vdm12315
2018/06/27
0
0
自动化运维工具Ansible实战(三)常用的配置和相关命令

Ansible默认安装好后有一个配置文件/etc/ansible/ansible.cfg,该配置文件中定义了ansible的主机的默认配置部分,如默认是否需要输入密码、是否开启sudo认证、action_plugins插件的位置、hos...

lqbyz
2017/09/01
0
0
使用 Ansible 管理 CoreOS

文章作者: Roman Shtylman 这篇文章是关于使用 Ansible 管理 CoreOS 的基础技术。如果你熟悉 Ansible 和一些基本的 CoreOS知识有助于更好的理解下文 。 什么是Ansible? 引自 Ansible Docume...

oschina
2015/05/25
3.7K
2
ansible 安装与基本功能的使用

实验环境: centos6.6 IP 192.168.38.152 (安装ansible) centos6.6 IP 192.168.38.155(hostname: web155.com,实验用的客户机) 安装方法: 利用yum 安装ansible,要求系统的python要是2.6以上...

hello_cjq
2017/02/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

vue 对对象的属性进行修改时,不能渲染页面 vue.$set()

我在vue里的方法里给一个对象添加某个属性时,我console.log出来的是已经更改的object ,但是页面始终没有变化 原因如下: **受现代 JavaScript 的限制 (而且 Object.observe 也已经被废弃),...

Js_Mei
今天
2
0
开始看《Java学习笔记》

虽然书买了很久,但一直没看。这其中也写过一些Java程序,但都是基于IDE的帮助和对C#的理解来写的,感觉不踏实。 林信良的书写得蛮好的,能够帮助打好基础,看得出作者是比较用心的。 第1章概...

max佩恩
昨天
12
0
Redux 三大原则

1.单一数据源 在传统的MVC架构中,我们可以根据需要创建无数个Model,而Model之间可以互相监听、触发事件甚至循环或嵌套触发事件,这些在Redux中都是不被允许的。 因为在Redux的思想里,一个...

wenxingjun
昨天
8
0
跟我学Spring Cloud(Finchley版)-12-微服务容错三板斧

至此,我们已实现服务发现、负载均衡,同时,使用Feign也实现了良好的远程调用——我们的代码是可读、可维护的。理论上,我们现在已经能构建一个不错的分布式应用了,但微服务之间是通过网络...

周立_ITMuch
昨天
5
0
XML

学习目标  能够说出XML的作用  能够编写XML文档声明  能够编写符合语法的XML  能够通过DTD约束编写XML文档  能够通过Schema约束编写XML文档  能够通过Dom4j解析XML文档 第1章 xm...

stars永恒
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部