当前位置: 首页 > news >正文

闽侯县住房和城乡建设网站wordpress内容清空

闽侯县住房和城乡建设网站,wordpress内容清空,品牌网站模板,用wordpress做企业网站视频教程目录 【任务 3】私有云运维开发[10 分] 【题目 1】Ansible 服务部署#xff1a;部署 MariaDB 集群[2 分] 【题目 2】Ansible 服务部署#xff1a;部署ELK 集群服务[2 分] 【题目 3】Python 运维开发#xff1a;基于OpenStack Restful API 实现镜像上传[1 分] 【题目 4】Pyth…目录 【任务 3】私有云运维开发[10 分] 【题目 1】Ansible 服务部署部署 MariaDB 集群[2 分] 【题目 2】Ansible 服务部署部署ELK 集群服务[2 分] 【题目 3】Python 运维开发基于OpenStack Restful API 实现镜像上传[1 分] 【题目 4】Python 运维开发基于 Openstack Python SDK 实现云主机创建[1 分] 【题目 5】Python 运维开发云主机类型管理的命令行工具开发[2 分] 【题目 6】Python 运维开发用户管理的命令行工具开发[2 分] 【任务 3】私有云运维开发[10 分] 【题目 1】Ansible 服务部署部署 MariaDB 集群[2 分] 使用OpenStack 私有云平台创建 4 台系统为centos7.9 的云主机其中一台作为 Ansible 的母机并命名为 ansible另外三台云主机命名为 node1、node2、node3使用这一台母机编写 Ansible 脚本在/root 目录下创建 example 目录作为 Ansible 工作目录部署的入口文件命名为 cscc_install.yaml 对其他三台云主机进行安装高可用数据库集群 MariaDB_Galera_cluster数据库密码设置为 123456的操作所需的安装包在 HTTP 服务中。完成后提交 Ansible 节点的用户名、密码和 IP 地址到答题框。考试系统会连接到你的Ansible 节点去执行 Ansible 脚本请准备好 Ansible 运行环境以便考试系统访问 1环境准备 节点 地址 ansible 192.168.100.10 node1 192.168.100.20 node2 192.168.100.30 node3 192.168.100.40 2环境配置 [rootlocalhost ~]# hostnamectl set-hostname ansible [rootlocalhost ~]# su [rootansible ~]# [rootlocalhost ~]# hostnamectl set-hostname node1 [rootlocalhost ~]# su [rootnode1 ~]# [rootlocalhost ~]# hostnamectl set-hostname node2 [rootlocalhost ~]# su [rootnode2 ~]# [rootlocalhost ~]# hostnamectl set-hostname node3 [rootlocalhost ~]# su [rootnode3 ~]# 将ip地址映射成主机名(其他3台节点配置一样,此处省略) [rootansible ~]# vi /etc/hosts 192.168.100.10 ansible 192.168.100.20 node1 192.168.100.30 node2 192.168.100.40 node3 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 #关闭防火墙和selinux(其他3台节点配置一样,此处省略) [rootansible ~]# systemctl stop firewalld setenforce 0 ansible节点部署ansible服务(通过CRT远程工具将提供的ansible软件包上传到ansible节点) [rootansible ~]# tar -xvf ansible.tar.gz #删除centos自带的源并配置本地yum源安装ansible服务 [rootansible ~]# mv /etc/yum.repos.d/* /home/ [rootansible ~]# vi /etc/yum.repos.d/local.repo [ansible] nameansible baseurlfile:///root/ansible gpgcheck0 enabled1 [rootansible ~]# yum install ansible -y #检查是否安装完成 [rootansible ~]# ansible --version ansible 2.9.10 config file /etc/ansible/ansible.cfg configured module search path [u’/root/.ansible/plugins/modules’, u’/usr/share/ansible/plugins/modules’] ansible python module location /usr/lib/python2.7/site-packages/ansible executable location /usr/bin/ansible python version 2.7.5 (default, Oct 14 2020, 14:45:30) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] 3设置免密 [rootansible ~]# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: SHA256:svV0oqhTRNGB/tH37Xi49/OUgAFu2XlxcKhsyXmwI rootansible The key’s randomart image is: ±–[RSA 2048]---- | .… . | | o . o o | | o . . .o| | o . .oo…| | …S.o o | | ..Eo*.o o| | .o . .… .| | … …oo| | … .o| ±—[SHA256]----- [rootansible ~]# ssh-copy-id rootnode1 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: “/root/.ssh/id_rsa.pub” The authenticity of host ‘node1 (192.168.100.20)’ can’t be established. ECDSA key fingerprint is SHA256:sGY4R7darwNovS7pGeQNm9FzQjanFFmnwJHO5PRo0RE. ECDSA key fingerprint is MD5:fa:5d:85:af:69:0d:63:78:ac:4e:9a:5b:c1:a6:b2:60. Are you sure you want to continue connecting (yes/no)? yes /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed – if you are prompted now it is to install the new keys rootnode1’s password: Number of key(s) added: 1 Now try logging into the machine, with: “ssh ‘rootnode1’” and check to make sure that only the key(s) you wanted were added. [rootansible ~]# ssh-copy-id rootnode2 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: “/root/.ssh/id_rsa.pub” The authenticity of host ‘node2 (192.168.100.30)’ can’t be established. ECDSA key fingerprint is SHA256:sGY4R7darwNovS7pGeQNm9FzQjanFFmnwJHO5PRo0RE. ECDSA key fingerprint is MD5:fa:5d:85:af:69:0d:63:78:ac:4e:9a:5b:c1:a6:b2:60. Are you sure you want to continue connecting (yes/no)? yes /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed – if you are prompted now it is to install the new keys rootnode2’s password: Number of key(s) added: 1 Now try logging into the machine, with: “ssh ‘rootnode2’” and check to make sure that only the key(s) you wanted were added. [rootansible ~]# ssh-copy-id rootnode3 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: “/root/.ssh/id_rsa.pub” The authenticity of host ‘node3 (192.168.100.40)’ can’t be established. ECDSA key fingerprint is SHA256:sGY4R7darwNovS7pGeQNm9FzQjanFFmnwJHO5PRo0RE. ECDSA key fingerprint is MD5:fa:5d:85:af:69:0d:63:78:ac:4e:9a:5b:c1:a6:b2:60. Are you sure you want to continue connecting (yes/no)? yes /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed – if you are prompted now it is to install the new keys rootnode3’s password: Number of key(s) added: 1 Now try logging into the machine, with: “ssh ‘rootnode3’” and check to make sure that only the key(s) you wanted were added. 4修改ansible文件配置组 [rootansible ~]# vi /etc/ansible/hosts [node] node1 node2 node3 [node1] node1 [node2] node2 [node3] node3 #解压mariadb.tar软件包将mariadb-repo源拷贝到node1,node2,node3节点的/root目录下 [rootansible ~]# tar -xvf mariadb.tar mariadb/ mariadb/mariadb-repo.tar.gz mariadb/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz mariadb/schema.xml [rootansible ~]# tar -xvf mariadb/mariadb-repo.tar.gz [rootansible ~]# scp -r mariadb-repo/ rootnode1:/root [rootansible ~]# scp -r mariadb-repo/ rootnode2:/root [rootansible ~]# scp -r mariadb-repo/ rootnode3:/root 5创建ansible执行的工作目录编写执行playbook剧本的相关文件 [rootansible ~]# mkdir cscc_galera应该是example目录 [rootansible ~]# cd cscc_galera/ #创建local.repo文件 [rootansible cscc_galera]# vi local.repo [centos] namecentos baseurlfile:///opt/centos #自行挂载centos7.9镜像到/opt目录 gpgcheck0 enabled1 [mariadb] namemariadb baseurlfile:///root/mariadb-repo gpgcheck0 enabled1 #创建server.cnf文件 [rootansible cscc_galera]# vi server.cnf [server] [mysqld] [galera] wsrep_onON wsrep_provider/usr/lib64/galera/libgalera_smm.so wsrep_cluster_addressgcomm://node1,node2,node3 binlog_formatrow default_storage_engineInnoDB innodb_autoinc_lock_mode2 bind-address0.0.0.0 wsrep_slave_threads1 innodb_flush_log_at_trx_commit0 [embedded] [mariadb] [mariadb-10.3] #创建playbook剧本文件 [rootansible cscc_galera]# vi install_galera.yaml应该是cscc_install.yaml hosts: all remote_user: root tasks: name: rm repo shell: rm -rf /etc/yum.repos.d/*name: copy repo copy: srclocal.repo dest/etc/yum.repos.d/name: install mariadb yum: namemariadb-servername: start mariadb service: namemariadb statestarted enabledyesname: init_mysql shell: mysqladmin -uroot password 123456name: stop mariadb service: namemariadb statestoppedname: copy server.cnf copy: srcserver.cnf dest/etc/my.cnf.d/server.cnf hosts: node1 remote_user: root tasks: name: start mariadb shell: /usr/sbin/mysqld --wsrep-new-cluster -u root hosts: node2,node3 remote_user: root tasks: name: start mariadb shell: systemctl start mariadb 6执行入口文件 [rootansible cscc_galera]# ansible-playbook install_galera.yaml [WARNING]: Found both group and host with same name: node1 [WARNING]: Found both group and host with same name: node3 [WARNING]: Found both group and host with same name: node2 PLAY [all] ******************************************************************************************************* TASK [Gathering Facts] ******************************************************************************************* ok: [node3] ok: [node2] ok: [node1] TASK [rm repo] *************************************************************************************************** [WARNING]: Consider using the file module with stateabsent rather than running ‘rm’. If you need to use command because file is insufficient you can add ‘warn: false’ to this command task or set ‘command_warningsFalse’ in ansible.cfg to get rid of this message. changed: [node2] changed: [node3] changed: [node1] TASK [copy repo] ************************************************************************************************* changed: [node3] changed: [node2] changed: [node1] TASK [install mariadb] ******************************************************************************************* changed: [node2] changed: [node3] changed: [node1] TASK [start mariadb] ********************************************************************************************* changed: [node1] changed: [node2] changed: [node3] TASK [init_mysql] ************************************************************************************************ changed: [node2] changed: [node1] changed: [node3] TASK [stop mariadb] ********************************************************************************************** changed: [node1] changed: [node2] changed: [node3] TASK [copy server.cnf] ********************************************************************************************** changed: [node1] changed: [node2] changed: [node3] PLAY [node1] ***************************************************************************************************** TASK [Gathering Facts] ******************************************************************************************* ok: [node1] TASK [start mariadb] ********************************************************************************************* changed: [node1] PLAY [node2,node3] *********************************************************************************************** TASK [Gathering Facts] ******************************************************************************************* ok: [node2] ok: [node3] TASK [start mariadb] ********************************************************************************************* changed: [node2] changed: [node3] PLAY RECAP ******************************************************************************************************* node1 : ok9 changed7 unreachable0 failed0 skipped0 rescued0 ignored0 node2 : ok9 changed7 unreachable0 failed0 skipped0 rescued0 ignored0 node3 : ok9 changed7 unreachable0 failed0 skipped0 rescued0 ignored0 [rootansible cscc_galera]# 7验证,检查wsrep_cluster_size的值是否为3/wsrep_ready的状态是否为ON [rootansible cscc_galera]# ssh node1 Last login: Fri Aug 26 05:01:52 2022 from 192.168.100.1 [rootnode1 ~]# mysql -uroot -p123456 Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 10 Server version: 10.3.23-MariaDB MariaDB Server Copyright © 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement. MariaDB [(none)] show status like ‘wsrep_cluster_size’; ±-------------------±------ | Variable_name | Value | ±-------------------±------ | wsrep_cluster_size | 3 | ±-------------------±------ 1 row in set (0.001 sec) MariaDB [(none)] show status like ‘wsrep_ready’; ±--------------±------ | Variable_name | Value | ±--------------±------ | wsrep_ready | ON | ±--------------±------ 1 row in set (0.001 sec) MariaDB [(none)] 1.执行yaml 文件正确计 0.5 分 2.检查数据库集群部署正确计 1 分 3.检查数据库集群数量为 3 正确计 0.5 分 【题目 2】Ansible 服务部署部署ELK 集群服务[2 分] 使用赛项提供的OpenStack 私有云平台创建三台 CentOS7.9 系统的云主机分别命名为elk-1、elk-2 和elk-3Ansible 主机可以使用上一题的环境。要求Ansible 节点编写剧本执行 Ansible 剧本可以在这三个节点部署 ELK 集群服务在/root 目录下创建 install_elk 目录作为 ansible 工作目录部署的入口文件命名为 install_elk.yaml。具体要求为三个节点均安装Elasticserach 服务并配置为 Elasticserach 集群kibana 安装在第一个节点Logstash 安装在第二个节点。需要用到的软件包在 HTTP 服务下完成后提交 ansible 节点的用户名、密码和 IP 地址到答题框。考试系统会连接到 ansible 节点执行 ansible 脚本准备好环境 以便考试系统访问 1.执行yaml 文件正确计 0.5 分 2.检查 ELK 服务部署正确计 1.5 分 1配置主机映射 修改当前节点主机名为ansible并修改ansible节点主机映射命令如下 [rootlocalhost ~]# hostnamectl set-hostname ansible [rootlocalhost ~]# bash [rootansible ~]# cat /etc/hosts 172.128.11.162 ansible 172.128.11.217 node1 172.128.11.170 node2 172.128.11.248 node3 配置免密访问虚拟机root用户密码为000000命令如下考试的时候命名为elk-1、elk-2 和elk-3 [rootansible ~]# ssh-keygen [rootansible ~]# ssh-copy-id node1 [rootansible ~]# ssh-copy-id node2 [rootansible ~]# ssh-copy-id node3 将ansible节点的域名解析文件复制给安装Elasticsearch集群服务的三个节点命令如下 [rootansible ~]# scp /etc/hosts node1:/etc/ [rootansible ~]# scp /etc/hosts node2:/etc/ [rootansible ~]# scp /etc/hosts node3:/etc/ 关闭ansible节点的防火墙和Selinux配置如已关闭则不需要操作命令如下 [rootansible ~]# setenforce 0 2软件包下载及yum源配置 将提供的Elasticsearch、Kibana以及Logstash软件包下载至ansible节点/root目录下并将相应服务的软件包拷贝至不同节点。 [rootansible ~]# curl -O http://mirrors.douxuedu.com/competition/Ansible.tar.gz [rootansible ~]# tar -zxvf Ansible.tar.gz 将Elasticsearch软件包拷贝至三个节点将Kibana软件包拷贝至node1节点将Logstash软件包拷贝至node2节点命令如下 [rootansible ~]# scp elasticsearch-6.0.0.rpm node1:/root/ [rootansible ~]# scp elasticsearch-6.0.0.rpm node2:/root/ [rootansible ~]# scp elasticsearch-6.0.0.rpm node3:/root/ [rootansible ~]# scp kibana-6.0.0-x86_64.rpm node1:/root/ [rootansible ~]# scp kibana-6.0.0-x86_64.rpm node2:/root/ [rootansible ~]# scp kibana-6.0.0-x86_64.rpm node3:/root/ [rootansible ~]# scp logstash-6.0.0.rpm node1:/root/ [rootansible ~]# scp logstash-6.0.0.rpm node2:/root/ [rootansible ~]# scp logstash-6.0.0.rpm node3:/root/ 将软件包ansible.tar.gz上传至ansible节点配置本地yum源并安装Ansible [rootansible ~]# tar -zxvf ansible.tar.gz -C /opt/ [rootansible ~]# mv /etc/yum.repos.d/* /media/ [rootansible ~]# vi /etc/yum.repos.d/local.repo [ansible] nameansible baseurlfile:///opt/ansible gpgcheck0 enabled1 [rootansible ~]# yum -y install ansible 3配置Ansible主机映射 创建示例目录并配置Ansible主机映射。 [rootansible ~]# mkdir example [rootansible ~]# cd example [rootansible example]# vi /etc/ansible/hosts [node1] 172.128.11.217 [node2] 172.128.11.170 [node3] 172.128.11.248 使用CentOS-7-x86_64-DVD-2009.iso镜像文件作为安装库将镜像挂载至/opt/centos编写yum源文件安装vsftpd服务用于给远程主机安装Java。命令如下 [rootansible example]# curl -O http://mirrors.douxuedu.com/competition/CentOS-7-x86_64-DVD-2009.iso [rootansible example]# mkdir /opt/centos [rootansible example]# mount CentOS-7-x86_64-DVD-2009.iso /opt/centos/ [rootansible example]# vi /etc/yum.repos.d/local.repo [ansible] nameansible baseurlfile:///opt/ansible gpgcheck0 enabled1 [centos] namecentos baseurlfile:///opt/centos gpgcheck0 enabled1 [rootansible example]# yum install -y vsftpd [rootansible example]# vi /etc/vsftpd/vsftpd.conf anon_root/opt [rootansible example]# systemctl restart vsftpd [rootansible example]# vi ftp.repo [centos] namecentos baseurlftp://172.128.11.162/centos/ gpgcheck0 enabled1 4安装Elasticsearch获取配置文件 安装Elasticsearch服务并编写node1节点配置文件命令如下 [rootansible example]# rpm -ivh /root/elasticsearch-6.0.0.rpm [rootansible example]# cp -rf /etc/elasticsearch/elasticsearch.yml elk1.yml [rootansible example]# cat elk1.yml | grep -Ev “^KaTeX parse error: Expected group after ^ at position 2: |^̲# cluster.name…|^#” cluster.name: ELK node.name: node2 node.master: false node.data: true path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch network.host: 172.128.11.170 http.port: 9200 discovery.zen.ping.unicast.hosts: [“node1”,“node2”,“node3”] 编写node3节点配置文件命令如下 [rootansible example]# cp elk1.yml elk3.yml [rootansible example]# cat elk3.yml | grep -Ev “$|#” cluster.name: ELK node.name: node3 node.master: false node.data: true path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch network.host: 172.128.11.248 http.port: 9200 discovery.zen.ping.unicast.hosts: [“node1”,“node2”,“node3”] 5安装Kibana获取配置文件 安装Kibana服务并编写配置文件命令如下 [rootansible example]# rpm -ivh /root/kibana-6.0.0-x86_64.rpm [rootansible example]# cp -rf /etc/kibana/kibana.yml . [rootansible example]# cat kibana.yml |grep -v ^# server.port: 5601 server.host: “172.128.11.217” elasticsearch.url: “http://172.128.11.217:9200” 6安装Logstash获取配置文件 安装Logstash服务并获取配置文件命令如下 [rootansible example]# rpm -ivh /root/logstash-6.0.0.rpm [rootansible example]# cp -rf /etc/logstash/logstash.yml . [rootansible example]# vi logstash.yml http.host: “172.128.11.170” 新建日志输出文件内容如下 [rootansible example]# vi syslog.conf input { file { path “/var/log/messages” #指定文件的路径 type “systemlog” #定义日志类型可自定义 start_position “beginning” #指定何时开始收集 stat_interval “3” } } output { if [type] “systemlog” { elasticsearch { hosts [“172.128.11.217:9200”] #这里的地址为node1主机地址 index “system-log-%{YYYY.MM.dd}” } } } 7编写剧本文件 安编写Playbook剧本文件命令如下 [rootansible example]# vi cscc_install.yaml hosts: all remote_user: root tasks: name: rm repo shell: rm -rf /etc/yum.repos.d/*name: copy repo copy: srcftp.repo dest/etc/yum.repos.d/name: install java shell: yum -y install java-1.8.0-*name: install elk shell: rpm -ivh elasticsearch-6.0.0.rpm hosts: node1 remote_user: root tasks: name: copy config copy: srcelk1.yml dest/etc/elasticsearch/elasticsearch.ymlname: daemon-reload shell: systemctl daemon-reloadname: start elk shell: systemctl start elasticsearch systemctl enable elasticsearchname: install kibana shell: rpm -ivh kibana-6.0.0-x86_64.rpmname: copy config template: srckibana.yml dest/etc/kibana/kibana.ymlname: start kibana shell: systemctl start kibana systemctl enable kibana hosts: node2 remote_user: root tasks: name: copy config copy: srcelk2.yml dest/etc/elasticsearch/elasticsearch.ymlname: daemon-reload shell: systemctl daemon-reloadname: start elk shell: systemctl start elasticsearch systemctl enable elasticsearchname: install logstash shell: rpm -ivh logstash-6.0.0.rpmname: copy config copy: srclogstash.yml dest/etc/logstash/logstash.ymlname: copy config copy: srcsyslog.conf dest/etc/logstash/conf.d/syslog.conf hosts: node3 remote_user: root tasks: name: copy config copy: srcelk3.yml dest/etc/elasticsearch/elasticsearch.ymlname: daemon-reload shell: systemctl daemon-reloadname: start elk shell: systemctl start elasticsearch systemctl enable elasticsearch 执行Playbook完成ELK集群的部署命令如下 [rootansible example]# ansible-playbook cscc_install.yaml 执行结果如图2所示 图2 执行结果 浏览器访问node1节点5601端口http://172.128.11.217:5601/如图3所示 图3 部署成功 【题目 3】Python 运维开发基于OpenStack Restful API 实现镜像上传[1 分] 使用OpenStack all-in-one 镜像创建 OpenStack Python 运维开发环境。云主机的用户/ 密码为“root/Abc1234”OpenStack 的域名/账号/密码为“demo/admin/000000”。 提示说明python 脚本文件头建议加入“#encoding:utf-8”避免编码错误测试脚本代码用 python3 命令执行与测试。 在 controller 节点的/root 目录下创建api_image_manager.py 脚本编写 python 代码对接OpenStack API完成镜像的创建与上传。创建之前查询是否存在“同名镜像”如果存在先删除该镜像。 1创建镜像要求在 OpenStack 私有云平台中上传镜像cirros-0.3.4-x86_64-disk.img名字为 cirros001disk_format 为 qcow2container_format 为bare。 2查询镜像查询 cirros001 的详细信息并以 json 格式文本输出到控制台。 完成后提交 OpenStack Python 运维开发环境Controller 节点的 IP 地址用户名和密码提交。 1.执行api_image_manager.py 脚本,成功创建镜像计 0.5 分 2.检查镜像状态正确计 0.5 分 1基础环境准备安装python3已经需要的依赖 安装工具包 yum install gcc -y yum install libffi-devel -y yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make 安装python3 tar -xzvf Python-3.6.8.tgz cd Python-3.6.8 ./configure make # 编译 make install # 编译安装 验证 [rootcontroller ~]# python3 Python 3.6.8 (default, Oct 29 2023, 22:01:11) [GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux Type “help”, “copyright”, “credits” or “license” for more information. [root controller ~]# python3 --version Python 3.6.8 安装文件依赖包 安装setuptools tar -zxvf setuptools-41.1.0.post1.tar.gz cd setuptools-41.1.0.post1/ python3 setup.py install 安装pip tar -zxvf pip-19.2.2.tar.gz cd pip-19.2.2 python3 setup.py install 验证pip [rootcontroller pip-19.2.2]# pip -V pip 19.2.2 from /usr/local/lib/python3.6/site-packages/pip-19.2.2-py3.6.egg/pip (python 3.6) #使用提供的whl文件安装依赖 [rootcontroller ~]# cd Python-api [rootcontroller ~]# pip3 install certifi-2019.11.28-py2.py3-none-any.whl [rootcontroller ~]# pip3 install urllib3-1.25.11-py3-none-any.whl [rootcontroller ~]# pip3 install idna-2.8-py2.py3-none-any.whl [rootcontroller ~]# pip3 install chardet-3.0.4-py2.py3-none-any.whl [rootcontroller ~]# pip3 install requests-2.24.0-py2.py3-none-any.whl 2代码实现 [rootcontroller ~]# vi api_image_manager.py #encoding:utf-8 import requests,json,time def get_auth_token(controller_ip,domain,name,password): url fhttp://{controller_ip}:5000/v3/auth/tokens body { “auth”: { “identity”: { “methods”: [‘password’], “password”: { “user”: { “domain”: {“name”: domain}, “name”: name, “password”: password, } } }, “scope”: { “project”: { “domain”: {“name”: domain}, “name”: name } } } } headers { “Content-Type”: “application/json” } token requests.post(url,headersheaders,datajson.dumps(body)).headers[‘X-Subject-Token’] headers { “X-Auth-Token”: token } print(ftoken值为:{token}) return headers class image_manager: def init(self,handers:dict,resUrl): self.headers handers self.resUrl resUrl def create_image(self,image_name,disk_format,container_format):body {name: image_name,disk_format: disk_format,container_format: container_format,}req requests.post(self.resUrl,headersself.headers,datajson.dumps(body)).textprint(f创建镜像的信息为:{req})return reqdef get_image_id(self,name):req json.loads(requests.get(self.resUrl,headersself.headers).text)for image in req[images]:if image[name] name:return image[id]return NONEdef upload_image(self,id,file_path:str):url self.resUrl / id /fileself.headers[Content-Type] application/octet-streamreq requests.put(url,headersself.headers,dataopen(file_path,rb).read())if req.status_code 204:print(上传镜像成功,req.status_code)else:print(上传镜像失败,req.status_code)print(f镜像上传信息:{req})return reqdef get_image(self,id):url self.resUrl / idreq json.loads(requests.get(self.resUrl,headersself.headers).text)print(f获取到的镜像信息为:{req})return reqdef delete_image(self,id):url self.resUrl / idreq requests.delete(url,headersself.headers)print(f删除信息:{req})return reqif name “main”: controller_ip “192.168.100.10” domain “demo” name “admin” password “000000” headers get_auth_token(controller_ip, domain, name, password) print(headers) image_m image_manager(headers,fhttp://{controller_ip}:9292/v2/images) #create create_image image_m.create_image(cirros001,qcow2,bare)#get id get_id image_m.get_image_id(cirros001) print(fcirros001镜像ID为:{get_id})#upload upload_image image_m.upload_image(get_id,/root/cirros-0.3.0-x86_64-disk.img )#get image get_image image_m.get_image(get_id) with open(image_demo.json,w)as outfile:json.dump(get_image,outfile,indent4)【题目 4】Python 运维开发基于 Openstack Python SDK 实现云主机创建[1 分] 使 用 已 建 好 的 OpenStack Python 运 维 开 发 环 境 在 /root 目 录 下 创 建sdk_server_manager.py 脚本使用 python-openstacksdk Python 模块完成云主机的创建和查询。创建之前查询是否存在“同名云主机”如果存在先删除该镜像。 1创建 1 台云主机云主机信息如下 云主机名称如下server001 镜像文件cirros-0.3.4-x86_64-disk.img 云主机类型m1.tiny 网络等必要信息自己补充。 2查询云主机查询云主机 server001 的详细信息并以 json 格式文本输出到控制台。 完成后提交 OpenStack Python 运维开发环境 Controller 节点的 IP 地址用户名和密码提交。 1.执行 sdk_server_manager.py 脚本,成功创建云主机计 0.5 分 2.检查创建的云主机状态正确计 0.5 分 1代码实现 创建云主机所需的镜像、类型、网络是用name来识别的需要提前创建好 [rootcontainer ~]# vi sdk_server_manager.py #encoding:utf-8 import json,logging import openstack #文档地址 https://docs.openstack.org/openstacksdk/latest/user/index.html def create_connection(auth_url, user_domain_name, username, password): “” 建立连接 “” return openstack.connect( auth_urlauth_url, user_domain_nameuser_domain_name, usernameusername, passwordpassword, ) #user Manager 参见文档 https://docs.openstack.org/openstacksdk/latest/user/guides/identity.html #openstack.connection.Connection #云主机管理 class server_manager: def __init__(self, connect):self.connect connectdef list_servers(self):查询所有云主机.#to jsonitems self.connect.compute.servers()server_jsons {}for server in items:server_jsons[server[name]] server# return return items# json.dumps(server_jsons,indent2,skipkeysTrue)def create_server(self, server_name, image_name, flavor_name,networ_name):image self.connect.compute.find_image(image_name)flavor self.connect.compute.find_flavor(flavor_name)network self.connect.network.find_network(networ_name)server self.connect.compute.create_server(nameserver_name, image_idimage.id, flavor_idflavor.id,networks[{uuid: network.id}])result self.connect.compute.wait_for_server(server)return result#json.dumps(result,indent2,skipkeysTrue)def delete_server(self, server_name):删除云主机server self.connect.compute.find_server(server_name)result self.connect.compute.delete_server(server)return json.dumps(result, indent2, skipkeysTrue)def get_server(self, server_name):获取云主机server self.connect.compute.find_server(server_name)if server:return json.dumps(server, indent2, skipkeysTrue)else:return Noneclass image_manager: def __init__(self, connect):self.connect connectdef list_images(self):查询所有镜像#to jsonitems self.connect.compute.images()images_jsons {}for image in items:images_jsons[image[name]] imagereturn json.dumps(images_jsons,indent2)def get_image(self, image_name:str):查询镜像#to jsonimage self.connect.compute.find_image(image_name)return json.dumps(image,indent2)class flavor_manager: def __init__(self, connect):self.connect connectdef list_flavors(self):查询所有云主机类型#to jsonitems self.connect.compute.flavors()flavors_jsons {}for flavor in items:flavors_jsons[flavor[name]] flavorreturn json.dumps(flavors_jsons,indent2)def get_flavor(self, flavor_name:str):根据名称获取云主机类.#to jsonflavor self.connect.compute.find_flavor(flavor_name)return json.dumps(flavor,indent2)class network_manager: def __init__(self, connect):self.connect connectdef list_networks(self):查询所有网络.#to jsonitems self.connect.network.networks()items_jsons {}for network in items:items_jsons[network[name]] networkreturn json.dumps(items_jsons,indent2)def get_network(self, network_name:str):跟名称查询网络.#to jsonflavor self.connect.compute.find_network(network_name)return json.dumps(flavor,indent2)if name ‘main’: # Initialize connection(通过配置文件 # controller_ip 10.24.2.22 controller_ip controller auth_url http://controller:5000/v3/ username admin password 000000 user_domain_name democonn create_connection(auth_url, user_domain_name, username, password)sdk_m server_manager(conn) server sdk_m.get_server(server001) if server:result sdk_m.delete_server(server001)print(servers:, result)#2 创建云主机 print(creat server--------) servers sdk_m.create_server(server001,cirros001,m1.tiny,net) print(servers:, servers)#6 查询云主机 server_info sdk_m.get_server(server001)print(server_info) 创建网络命令如下 [rootcontroller ~]# source /etc/keystone/admin-openrc.sh [rootcontroller ~]# openstack network create --provider-network-type vlan --provider-physical-network provider --provider-segment 10 --project admin net [rootcontroller ~]# NET“111.111.10.0/24” [rootcontroller ~]# ID$(openstack network list --project admin |grep -v ID |grep net |awk -F | {‘print $2’}) [rootcontroller ~]# openstack subnet create --project admin --subnet-range $NET --dhcp --network $ID ext-subnet 执行sdk_server_manager.py文件 [rootcontroller ~]# python3 sdk_server_manager.py -----------------------------------------执行结果----------------------------- #创建云主机的信息为{“server”: {“security_groups”: [{“name”: “default”}], “OS-DCF:diskConfig”: “MANUAL”, “id”: “f295eb8d-52a0-4e21-ba86-6 4ba8c3e6359”, “links”: [{“href”: “http://192.168.106.10:8774/v2.1/servers/f295eb8d-52a0-4e21-ba86-64ba8c3e6359”, “rel”: “self”}, {“href”: “http://192.168.106.10:8774/servers/f295eb8d-52a0-4e21-ba86-64ba8c3e6359”, “rel”: “bookmark”}], “adminPass”: “oTs5jHFwkbWy”}} 【题目 5】Python 运维开发云主机类型管理的命令行工具开发[2 分] 使用已建好的 OpenStack Python 运维开发环境在/root 目录下创建 flavor_manager.py 脚本完成云主机类型的管理flavor_manager.py 程序支持命令行参数执行。提示说明Python 标准库argparse 模块可以提供命令行参数的解析。要求如下 1程序支持根据命令行参数创建 1 个多云主机类型。返回 response。位置参数“create”表示创建 参数“-n”支持指定 flavor 名称数据类型为字符串类型 参数“-m”支持指定内存大小数据类型为 int单位 M 参数“-v”支持指定虚拟 cpu 个数数据类型为 int 参数“-d”支持磁盘大小内存大小类型为 int单位 G 参数“-id”支持指定 ID类型为字符串。 参考运行实例 python3 flavor_manager.py create -n flavor_small -m 1024 -v 1 -d 10 -id 100000 2程序支持查询目前 admin 账号下所有的云主机类型。位置参数“getall”表示查询所有云主机类型 查询结果以 json 格式输出到控制台。参考执行实例如下 python3 flavor_manager.py getall 3支持查询给定具体名称的云主机类型查询。位置参数“get”表示查询 1 个云主机类型 参数“-id”支持指定 ID 查询类型为 string。 控制台以 json 格式输出创建结果。 参考执行实例如下 python3 flavor_manager.py get -id 100000 4支持删除指定的 ID 云主机类型。 位置参数“delete”表示删除一个云主机类型 参数“-id”支持指定 ID 查询返回 response控制台输出response。参考执行实例如下 python3 flavor_manager.py delete -id 100001 暂无 1.执行 flavor_manager.py 脚本指定 create 和配置参数成功创建 1 个云主机类型计 0.5 分 2.执行 flavor_manager.py 脚本指定 getall 参数成功查询所有云主机类型计 0.5 分 3.执行 flavor_manager.py 脚本指定 get 和配置参数成功查询具体名称的云主机类型计 0.5 分 4.执行 flavor_manager.py 脚本指定 delete 和配置参数成功删除指定 ID 云主机类型计 0.5 分。 api_flavor_manager.py import requests,json,time import logging #-----------logger----------- #get logger logger logging.getLogger(name) level logger.setLevel(logging.DEBUG) format format logging.Formatter(‘%(asctime)s %(message)s’) to console stream_handler logging.StreamHandler() stream_handler .setFormatter(format) logger.addHandler(stream_handler ) #-----------logger----------- def get_auth_token(controller_ip, domain, user, password): try:url fhttp://{controller_ip}:5000/v3/auth/tokensbody {auth: {identity: {methods: [password],password: {user: {domain: {name: domain},name: user,password: password}}},scope: {project: {domain: {name: domain},name: user}}}}headers {Content-Type: application/json,}print(body)Token requests.post(url, datajson.dumps(body), headersheaders).headers[X-Subject-Token]headers {X-Auth-Token: Token}logger.debug(f获取Token值{str(Token)})return headers except Exception as e:logger.error(f获取Token值失败请检查访问云主机控制节点IP是否正确输出错误信息如下{str(e)})exit(0)class flavor_manager: def __init__(self,handers:dict,resUrl:str):self.headershandersself.resUrlresUrl #创建flavor类型 def create_flavor(self,flavor_name:str,ram,vcpus,disk,id):self.headers[Content-Type]application/jsonbody{flavor:{name:flavor_name,ram:ram,vcpus:vcpus,disk:disk,id:id,}}logger.debug(f创建flavor请求body:{str(body)})status_code requests.post(self.resUrl, datajson.dumps(body), headersself.headers).textlogger.debug(f返回状态:{str(status_code)})return status_code#获取all flavors def get_flavors(self):result json.loads(requests.get(self.resUrl,headersself.headers).text)logger.debug(f返回信息:{str(result)})return result# 获取flavor_iddef get_flavor(self, id:str):api_url self.resUrl /idresult json.loads(requests.get(api_url, headersself.headers).text)logger.debug(f返回信息:{str(result)})return resultdef delete_flavor(self, id:str):api_url self.resUrl /idresponse requests.delete(api_url, headersself.headers)#Normal response codes: 202 without return textif response.status_code 202:return {itemDeletedSuccess: response.status_code}result json.loads(response.text)logger.debug(f返回信息:{str(result)})return result#http://192.168.200.226:8774/v2.1/ get apis version infomation. def update_flavor_desc(self, id: str, desc:str):# 特别注意This API is available starting with microversion 2.55.self.headers[X-OpenStack-Nova-API-Version] 2.55self.headers[Content-Type] application/jsonbody {flavor: {description: desc}}api_url self.resUrl / idresponse requests.put(api_url, datajson.dumps(body), headersself.headers)# Normal response codes: 202 without return textif response.status_code 202:return {itemUpdateSuccess: response.status_code}result json.loads(response.text)logger.debug(f返回信息:{str(result)})return resultif name ‘main’: controller_ip “controller” domain “demo” user “admin” password “000000” headers get_auth_token(controller_ip, domain, user, password) flavor_m flavor_manager(headers, fhttp://{controller_ip}:8774/v2.1/flavors) #1 查所有 flavors flavor_m.get_flavors()print(“查询所有flavors:”, flavors) flavor_manager.py #encoding:utf-8 import argparse import api_flavor_manager 1. openstack allinone controller ) credentials host ip address controller_ip “10.24.2.22” controller_ip “controller” domain name domain “demo” user name user “admin” user password password “000000” headers api_flavor_manager.get_auth_token(controller_ip,domain,user,password) print(“headers:”, headers) #. get token flavor_m api_flavor_manager.flavor_manager(headers, “http://controller:8774/v2.1/flavors”) def define_args(parser): “” 定义程序支持的args :return: “” # parser argparse.ArgumentParser() #增加控制命令(postion 位置参数必须 parser.add_argument(command,helpResource command name,typestr) # parser.add_argument(delete, # helpdelete a resource, # typestr) #可选参数可有可无 parser.add_argument(-n, --name, # 可选参数,删除的名称helpThe Name of the resource, # 输入-h展示typestr) parser.add_argument(-o, --output, # 可选参数,删除的名称helpThe output file path , # 输入-h展示typestr) parser.add_argument(-m, --memory, # 可选参数,删除的名称helpThe Name of the resource, # 输入-h展示typestr) parser.add_argument(-v, --vcpu, # 可选参数,删除的名称helpThe Name of the resource, # 输入-h展示typestr) parser.add_argument(-d, --disk, # 可选参数,删除的名称helpThe Name of the resource, # 输入-h展示typestr) parser.add_argument(-id, --id, # 可选参数,删除的名称helpThe Name of the resource, # 输入-h展示typestr)def parse_args(parser): args parser.parse_args() if args.command:if args.command create:print(create some thing)create_flavor(args)elif args.command getall:print(getall some thing)getall_flavor(args)elif args.command get:print(get some thing)get_flavor(args)elif args.command delete:print(delete some thing)delete_flavor(args)else:print(Note support command name!)def create_flavor(args): print(‘Provided command value is %r.’ % args.command) print(‘Provided name value is %r.’ % args.name) print(‘Provided memory value is %r.’ % args.memory) print(‘Provided vcpu value is %r.’ % args.vcpu) print(‘Provided disk value is %r.’ % args.disk) print(‘Provided id value is %r.’ % args.id) result flavor_m.create_flavor(args.name,args.memory,args.vcpu,args.disk,args.id) print(result) def delete_flavor(args): print(‘Provided command value is %r.’ % args.command) print(‘Provided id value is %r.’ % args.id) result flavor_m.delete_flavor(args.id) print(result) def getall_flavor(args): print(‘Provided command value is %r.’ % args.command) result flavor_m.get_flavors() print(result) def get_flavor(args): print(‘Provided command value is %r.’ % args.command) print(‘Provided id value is %r.’ % args.id) result flavor_m.get_flavor(args.id) print(result) if name ‘main’: parser argparse.ArgumentParser() define_args(parser) parse_args(parser) -------------------------------------------执行结果-------------------------------- {‘auth’: {‘identity’: {‘methods’: [‘password’], ‘password’: {‘user’: {‘domain’: {‘name’: ‘demo’}, ‘name’: ‘admin’, ‘password’: ‘000000’}}}, ‘scope’: {‘project’: {‘domain’: {‘name’: ‘demo’}, ‘name’: ‘admin’}}}} 【题目 6】Python 运维开发用户管理的命令行工具开发[2 分] 使用已建好的OpenStack Python 运维开发环境在/root 目录下创建 user_manager.py 脚本完成用户管理功能开发user_manager.py 程序支持命令行带参数执行。 提示说明Python 标准库argparse 模块可以提供命令行参数的解析。 1程序支持根据命令行参数创建 1 个用户。位置参数“create”表示创建 参数“-i 或–input”格式为 json 格式文本用户数据。查询结果以 json 格式输出到控制台。 参考执行实例如下 python3 user_manager.py create --input { “name”: “user01”, “password”: “000000”, “description”: “description” } ’ 2支持查询给定具体名称的用户查询。 位置参数“get”表示查询 1 个用户 参数“-n 或 --name”支持指定名称查询类型为 string。 参数“-o 或 output”支持查询该用户信息输出到文件格式为json 格式。参考执行实例如下 python3 user_manager.py get --name user01-o user.json 3程序支持查询目前 admin 账号下所有的用户。位置参数“getall”表示查询所有用户 参数“-o 或–output”支持输出到文件格式为 yaml 格式。参考执行实例如下 python3 user_manager.py getall -o openstack_all_user.yaml 4支持删除指定的名称的用户。 位置参数“delete”表示删除一个用户返回 response通过控制台输出。参数“-n 或–name”支持指定名称查询类型为 string。 参考执行实例如下 python3 user_manager.py delete -name user01 暂无 1.执行user_manager.py 脚本指定 create 和配置参数成功创建 1 个用户计 0.5 分 2.执行user_manager.py 脚本指定 get 和配置参数成功查询具体名称的用户计 0.5 分 3.执行user_manager.py 脚本指定 getall 和配置参数成功查询 admin 账号下的所有用户 计 0.5 分 4.执行user_manager.py 脚本指定 delete 和配置参数成功删除指定名称的用户计 0.5 分 api_user_manager.py encoding:utf-8 import requests, json, time import logging -----------logger----------- get logger logger logging.getLogger(name) level logger.setLevel(logging.DEBUG) format format logging.Formatter(‘%(asctime)s %(message)s’) to console stream_handler logging.StreamHandler() stream_handler.setFormatter(format) logger.addHandler(stream_handler) -----------logger----------- def get_auth_token(controller_ip, domain, user, password): ‘’’ :param controller_ip: openstack master ip address :param domain: current user’s domain :param user: user name :param password: user password :return: keystoen auth Token for current user. ‘’’ try:url http://controller:5000/v3/auth/tokensbody {auth: {identity: {methods: [password],password: {user: {domain: {name: domain},name: user,password: password}}},scope: {project: {domain: {name: domain},name: user}}}}headers {Content-Type: application/json,}print(body)Token requests.post(url, datajson.dumps(body), headersheaders).headers[X-Subject-Token]headers {X-Auth-Token: Token}logger.debug(f获取Token值{str(Token)})return headers except Exception as e:logger.error(f获取Token值失败请检查访问云主机控制节点IP是否正确输出错误信息如下{str(e)})exit(0)用户管理 https://docs.openstack.org/api-ref/identity/v3/index.html#users class user_manager: def init(self, handers: dict, resUrl: str): self.headers handers self.resUrl resUrl # POST /v3/users Create user def create_users(self, user_name, password: str, desc: str):create a user with name and password and description.body {user: {name: user_name,password: password,description: desc,}}status_code requests.post(self.resUrl, datajson.dumps(body), headersself.headers).textlogger.debug(f返回状态:{str(status_code)})return status_code# /v3/users # List all users def get_users(self):get userstatus_code requests.get(self.resUrl, headersself.headers).textlogger.debug(f返回状态:{str(status_code)})return status_codedef get_user_id(self, user_name):get user id by name.result json.loads(requests.get(self.resUrl, headersself.headers).text)user_name user_namefor item in result[users]:if item[name] user_name:return item[id]return NONEdef get_user(self, id: str):get a flavor by id.api_url self.resUrl / idresult json.loads(requests.get(api_url, headersself.headers).text)logger.debug(f返回信息:{str(result)})return resultdef delete_user(self, name: str):delete a user by id.id self.get_user_id(name)api_url self.resUrl / idresponse requests.delete(api_url, headersself.headers)# 204 - No Content The server has fulfilled the request.if response.status_code 204:return {User itemDeletedSuccess: response.status_code}result json.loads(response.text)logger.debug(f返回信息:{str(result)})return result# http://192.168.200.226:8774/v2.1/ get apis version infomation.def update_User_password(self, id: str, original_password: str, new_password: str):update a flavor desc by id.self.headers[Content-Type] application/jsonbody {user: {password: new_password,original_password: original_password}}api_url self.resUrl / id /passwordresponse requests.post(api_url, datajson.dumps(body), headersself.headers)# Normal response codes: 204 without return textif response.status_code 204:return {item Update Password Success: response.status_code}result json.loads(response.text)logger.debug(f返回信息:{str(result)})return resultif name ‘main’: # 1. openstack allinone controller ) credentials # host ip address # controller_ip “10.24.2.22” controller_ip “controller” # controller_ip “10.24.2.22” # domain name domain “demo” # user name user “admin” # user password password “000000” headers get_auth_token(controller_ip, domain, user, password) print(“headers:”, headers) # get all user user_m user_manager(headers, “http://controller:5000/v3/users”) # 1 查询所有 users user_m.get_users() print(“查询所有users:”, users) user_manager.py #encoding:utf-8 import argparse import api_user_manager import json import csv import yaml 1. openstack allinone controller ) credentials host ip address controller_ip “10.24.2.22” controller_ip “controller” controller_ip “10.24.2.22” domain name domain “demo” user name user “admin” user password password “000000” headers api_user_manager.get_auth_token(controller_ip, domain, user, password) print(“headers:”, headers) get all user user_m api_user_manager.user_manager(headers, “http://controller:5000/v3/users”) print(“-----------begin-----------------”) def define_args(parser): “” 定义程序支持的args :return: “” # parser argparse.ArgumentParser() #增加控制命令(postion 位置参数必须 parser.add_argument(command,helpResource command name,typestr) # parser.add_argument(delete, # helpdelete a resource, # typestr) #可选参数可有可无 parser.add_argument(-n, --name, # 可选参数,删除的名称helpThe Name of the resource, # 输入-h展示typestr) parser.add_argument(-i, --input, # 可选参数,删除的名称helpThe input json format text , # 输入-h展示typestr) parser.add_argument(-o, --output, # 可选参数,删除的名称helpThe output file path , # 输入-h展示typestr)def parse_args(parser): args parser.parse_args() if args.command: if args.command “create”: print(“create some thing”) create_user(args) elif args.command “getall”: print(“getall some thing”) getall_users(args) elif args.command “get”: print(“get some thing”) get_user(args) elif args.command “delete”: print(“delete some thing”) delete_user(args) else: print(“Note support command name!”) def create_user(args): print(‘Provided command value is %r.’ % args.command) print(‘Provided input value is %r.’ % args.input) print(‘Provided output value is %r.’ % args.output) output_file args.output # user_name, password: str, desc: str): user_dict json.loads(args.input) result user_m.create_users(user_dict[“name”],user_dict[“password”],user_dict[“description”]) # 写出json文件 print(--------write to json---------:, result) print(result)def delete_user(args): print(‘Provided command value is %r.’ % args.command) print(‘Provided input value is %r.’ % args.input) print(‘Provided output value is %r.’ % args.output) result user_m.delete_user(args.name) print(result) def getall_users(args): print(‘Provided command value is %r.’ % args.command) print(‘Provided input value is %r.’ % args.input) print(‘Provided output value is %r.’ % args.output) print(type(args.input)) result user_m.get_users() output_file args.output # 写出json文件 print(“--------result---------”) print(result) configuration json.loads(result) # 写出yaml (dict) with open(output_file, ‘w’) as yaml_file: yaml.dump(configuration, yaml_file) print(result)def get_user(args): print(‘Provided command value is %r.’ % args.command) print(‘Provided input value is %r.’ % args.input) print(‘Provided output value is %r.’ % args.output) id user_m.get_user_id(args.name) result user_m.get_user(id) output_file args.output # 写出json文件 with open(output_file, ‘w’) as jsonfile: json.dump(result, jsonfile, indent4) print(result) if name ‘main’: import sys print(sys.argv) parser argparse.ArgumentParser() define_args(parser) parse_args(parser) ----------------------------------------------执行结果------------------------------------ [rootcontroller python]# python3 user_manager.py create --input { “name”: “user01”, “password”: “000000”, “description”: “description” } ’ {‘auth’: {‘identity’: {‘methods’: [‘password’], ‘password’: {‘user’: {‘domain’: {‘name’: ‘demo’}, ‘name’: ‘admin’, ‘password’: ‘000000’}}}, ‘scope’: {‘project’: {‘domain’: {‘name’: ‘demo’}, ‘name’: ‘admin’}}}} 2022-10-11 17:39:22,843 获取Token值gAAAAABjRTnKtdV9oDS_VfNDp8qtRC_sEElsQwJGqJTST8LHtqJUahTJtf8MVDa2Nplrjwo6_18D_Hm85j99D9G1TMq7jKEPqAynBx5nGkTXggQWJ-WJdPxad_e3qsrwfeL3JOqDK3RSHEkhZ1k1EQKWl3nxgMBhycHDs_3-CA4Cyfcmi9S15pQ headers: {‘X-Auth-Token’: ‘gAAAAABjRTnKtdV9oDS_VfNDp8qtRC_sEElsQwJGqJTST8LHtqJUahTJtf8MVDa2Nplrjwo6_18D_Hm85j99D9G1TMq7jKEPqAynBx5nGkTXggQWJ-WJdPxad_e3qsrwfeL3JOqDK3RSHEkhZ1k1EQKWl3nxgMBhycHDs_3-CA4Cyfcmi9S15pQ’} -----------begin----------------- [‘user_manager.py’, ‘create’, ‘–input’, { “name”: “user01”, “password”: “000000”, “description”: “description” } ] create some thing Provided command value is ‘create’. Provided input value is { “name”: “user01”, “password”: “000000”, “description”: “description” } . Provided output value is None. 2022-10-11 17:39:23,137 返回状态:{“user”: {“description”: “description”, “name”: “user01”, “domain_id”: “default”, “enabled”: true, “links”: {“self”: “http://controller:5000/v3/users/01eebcdbcbf24bc4a5435f1dcd0949a7”}, “options”: {}, “id”: “01eebcdbcbf24bc4a5435f1dcd0949a7”, “password_expires_at”: null}} --------write to json---------: {“user”: {“description”: “description”, “name”: “user01”, “domain_id”: “default”, “enabled”: true, “links”: {“self”: “http://controller:5000/v3/users/01eebcdbcbf24bc4a5435f1dcd0949a7”}, “options”: {}, “id”: “01eebcdbcbf24bc4a5435f1dcd0949a7”, “password_expires_at”: null}} {“user”: {“description”: “description”, “name”: “user01”, “domain_id”: “default”, “enabled”: true, “links”: {“self”: “http://controller:5000/v3/users/01eebcdbcbf24bc4a5435f1dcd0949a7”}, “options”: {}, “id”: “01eebcdbcbf24bc4a5435f1dcd0949a7”, “password_expires_at”: null}}
http://www.pierceye.com/news/989613/

相关文章:

  • 宁德做网站的公司长沙网站建设 芙蓉区
  • 兴平市住房和城乡建设局门户网站会员管理网站建设
  • 做seo的网站是怎么样的上饶小程序开发公司
  • 网站硬件需求建网站网站
  • 网站主机域名合肥室内装修设计培训
  • 上海网站优化网站对企业的作用
  • 哪些园林网站可以做外链网址怎么注册
  • 做网站域名服务器wordpress 互动性
  • 微信网站欣赏好看的旅游网站模版
  • 甘肃省嘉峪关建设局网站wordpress android下载
  • wordpress 调用discuzseo营销是什么
  • 广州市律师网站建设怎么样建行网站会员注册用户名
  • 免费建站哪个好asp网站没有数据库
  • 文化馆网站建设方案建设中网站首页
  • 模板网站是什么郑州网站seo公司
  • 阿里云服务器网站开发正规品牌网站设计品牌
  • 网站突然搜不到了我是做装修什么网站可以
  • 外国网站在内地做seo食品网站模板
  • 网站推广名片wordpress 数据库查询数据库
  • 自己搭建的ftp怎么做网站线上推广员
  • 网站开发设计大赛北京seo招聘信息
  • 营销型网站是什么云南网站设计流程
  • 怎么做网站效果图广西网站建设运营费用
  • 怎么自己开发app软件无锡网站推广优化公司哪家好
  • 做网站原型的简单工具深圳网站建设美橙互联
  • 免费关键词挖掘网站wordpress发多少文章卡
  • html网站建设的步骤wordpress 自定义变量
  • 网站建设的意见建站公司有哪些服务
  • 广东美景园林建设有限公司网站陕西网络公司网站建设
  • 网站关键词怎么填写南昌网站建设一般多少钱一年