4.2. 带有 Ruby 的 API 请求
本节概述了如何将 Ruby 与 Satellite API 搭配使用来执行各种任务。
重要
以下是脚本和命令示例。确保您在使用前仔细检查这些脚本,并替换任何变量、用户名、密码和其他信息,以适应您自己的部署。
4.2.1. 使用 Ruby 创建对象 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
此脚本连接到红帽卫星 6 API 并创建一个组织,然后在组织中创建三个环境。如果组织已存在,该脚本将使用该组织。如果组织中已存在任何环境,该脚本将引发错误并退出。
Performs a GET using the passed URL location Performs a POST and passes the data to the URL location Creates a hash with ids mapping to names for an array of records Get list of existing organizations Get list of organization's lifecycle environments Exit the script if at least one life cycle environment already exists
#!/usr/bin/ruby
require 'rest-client'
require 'json'
url = 'https://satellite.example.com/api/v2/'
katello_url = "#{url}/katello/api/v2/"
$username = 'admin'
$password = 'changeme'
org_name = "MyOrg"
environments = [ "Development", "Testing", "Production" ]
# Performs a GET using the passed URL location
def get_json(location)
response = RestClient::Request.new(
:method => :get,
:url => location,
:user => $username,
:password => $password,
:headers => { :accept => :json,
:content_type => :json }
).execute
JSON.parse(response.to_str)
end
# Performs a POST and passes the data to the URL location
def post_json(location, json_data)
response = RestClient::Request.new(
:method => :post,
:url => location,
:user => $username,
:password => $password,
:headers => { :accept => :json,
:content_type => :json},
:payload => json_data
).execute
JSON.parse(response.to_str)
end
# Creates a hash with ids mapping to names for an array of records
def id_name_map(records)
records.inject({}) do |map, record|
map.update(record['id'] => record['name'])
end
end
# Get list of existing organizations
orgs = get_json("#{katello_url}/organizations")
org_list = id_name_map(orgs['results'])
if !org_list.has_value?(org_name)
# If our organization is not found, create it
puts "Creating organization: \t#{org_name}"
org_id = post_json("#{katello_url}/organizations", JSON.generate({"name"=> org_name}))["id"]
else
# Our organization exists, so let's grab it
org_id = org_list.key(org_name)
puts "Organization \"#{org_name}\" exists"
end
# Get list of organization's lifecycle environments
envs = get_json("#{katello_url}/organizations/#{org_id}/environments")
env_list = id_name_map(envs['results'])
prior_env_id = env_list.key("Library")
# Exit the script if at least one life cycle environment already exists
environments.each do |e|
if env_list.has_value?(e)
puts "ERROR: One of the Environments is not unique to organization"
exit
end
end
# Create life cycle environments
environments.each do |environment|
puts "Creating environment: \t#{environment}"
prior_env_id = post_json("#{katello_url}/organizations/#{org_id}/environments", JSON.generate({"name" => environment, "organization_id" => org_id, "prior_id" => prior_env_id}))["id"]
end