aboutsummaryrefslogtreecommitdiffstats
path: root/puppet/swift-storage.yaml
blob: d36a9c179ac5013336cf722d72b380660feaf1d2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

@media only all and (prefers-color-scheme: dark) {
.highlight .hll { background-color: #49483e }
.highlight .c { color: #75715e } /* Comment */
.highlight .err { color: #960050; background-color: #1e0010 } /* Error */
.highlight .k { color: #66d9ef } /* Keyword */
.highlight .l { color: #ae81ff } /* Literal */
.highlight .n { color: #f8f8f2 } /* Name */
.highlight .o { color: #f92672 } /* Operator */
.highlight .p { color: #f8f8f2 } /* Punctuation */
.highlight .ch { color: #75715e } /* Comment.Hashbang */
.highlight .cm { color: #75715e } /* Comment.Multiline */
.highlight .cp { color: #75715e } /* Comment.Preproc */
.highlight .cpf { color: #75715e } /* Comment.PreprocFile */
.highlight .c1 { color: #75715e } /* Comment.Single */
.highlight .cs { color: #75715e } /* Comment.Special */
.highlight .gd { color: #f92672 } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gi { color: #a6e22e } /* Generic.Inserted */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #75715e } /* Generic.Subheading */
.highlight .kc { color: #66d9ef } /* Keyword.Constant */
.highlight .kd { color: #66d9ef } /* Keyword.Declaration */
.highlight .kn { color: #f92672 } /* Keyword.Namespace */
.highlight .kp { color: #66d9ef } /* Keyword.Pseudo */
.highlight .kr { color: #66d9ef } /* Keyword.Reserved */
.highlight .kt { color: #66d9ef } /* Keyword.Type */
.highlight .ld { color: #e6db74 } /* Literal.Date */
.highlight .m { color: #ae81ff } /* Literal.Number */
.highlight .s { color: #e6db74 } /* Literal.String */
.highlight .na { color: #a6e22e } /* Name.Attribute */
.highlight .nb { color: #f8f8f2 } /* Name.Builtin */
.highlight .nc { color: #a6e22e } /* Name.Class */
.highlight .no { color: #66d9ef } /* Name.Constant */
.highlight .nd { color: #a6e22e } /* Name.Decorator */
.highlight .ni { color: #f8f8f2 } /* Name.Entity */
.highlight .ne { color: #a6e22e } /* Name.Exception */
.highlight .nf { color: #a6e22e } /* Name.Function */
.highlight .nl { color: #f8f8f2 } /* Name.Label */
.highlight .nn { color: #f8f8f2 } /* Name.Namespace */
.highlight .nx { color: #a6e22e } /* Name.Other */
.highlight .py { color: #f8f8f2 } /* Name.Property */
.highlight .nt { color: #f92672 } /* Name.Tag */
.highlight .nv { color: #f8f8f2 } /* Name.Variable */
.highlight .ow { color: #f92672 } /* Operator.Word */
.highlight .w { color: #f8f8f2 } /* Text.Whitespace */
.highlight .mb { color: #ae81ff } /* Literal.Number.Bin */
.highlight .mf { color: #ae81ff } /* Literal.Number.Float */
.highlight .mh { color: #ae81ff } /* Literal.Number.Hex */
.highlight .mi { color: #ae81ff } /* Literal.Number.Integer */
.highlight .mo { color: #ae81ff } /* Literal.Number.Oct */
.highlight .sa { color: #e6db74 } /* Literal.String.Affix */
.highlight .sb { color: #e6db74 } /* Literal.String.Backtick */
.highlight .sc { color: #e6db74 } /* Literal.String.Char */
.highlight .dl { color: #e6db74 } /* Literal.String.Delimiter */
.highlight .sd { color: #e6db74 } /* Literal.String.Doc */
.highlight .s2 { color: #e6db74 } /* Literal.String.Double */
.highlight .se { color: #ae81ff } /* Literal.String.Escape */
.highlight .sh { color: #e6db74 } /* Literal.String.Heredoc */
.highlight .si { color: #e6db74 } /* Literal.String.Interpol */
.highlight .sx { color: #e6db74 } /* Literal.String.Other */
.highlight .sr { color: #e6db74 } /* Literal.String.Regex */
.highlight .s1 { color: #e6db74 } /* Literal.String.Single */
.highlight .ss { color: #e6db74 } /* Literal.String.Symbol */
.highlight .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #a6e22e } /* Name.Function.Magic */
.highlight .vc { color: #f8f8f2 } /* Name.Variable.Class */
.highlight .vg { color: #f8f8f2 } /* Name.Variable.Global */
.highlight .vi { color: #f8f8f2 } /* Name.Variable.Instance */
.highlight .vm { color: #f8f8f2 } /* Name.Variable.Magic */
.highlight .il { color: #ae81ff } /* Literal.Number.Integer.Long */
}
@media (prefers-color-scheme: light) {
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
}
# Compass4nfv Build Guide

Compass4nfv is an installer project based on open source project COMPASS, which provides automated deployment and management of OpenStack and other distributed systems.

This is a prject for run compass4nfv in OPNFV, including build OPNFV imaged-base installation ISO, deployment for OPNFV distributed system.

There are two files in this directory:

* **build**: build imaged-base installation ISO for OPNFV.
* **deploy**: deploy OPNFV distributed system base the above ISO.

## How to make a reposity for installation ISO

## How to build a ISO for OPNFV installation

## How to deploy Compass ISO in virtual machine/baremetal
href='#n346'>346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389
heat_template_version: 2015-04-30
description: 'OpenStack swift storage node configured by Puppet'
parameters:
  Flavor:
    description: Flavor for Swift storage nodes to request when deploying.
    type: string
    constraints:
      - custom_constraint: nova.flavor
  HashSuffix:
    description: A random string to be used as a salt when hashing to determine mappings
      in the ring.
    hidden: true
    type: string
  Image:
    default: overcloud-swift-storage
    type: string
  KeyName:
    default: default
    description: Name of an existing Nova key pair to enable SSH access to the instances
    type: string
  MountCheck:
    default: 'false'
    description: Value of mount_check in Swift account/container/object -server.conf
    type: boolean
  MinPartHours:
    type: number
    default: 1
    description: The minimum time (in hours) before a partition in a ring can be moved following a rebalance.
  PartPower:
    default: 10
    description: Partition Power to use when building Swift rings
    type: number
  Replicas:
    type: number
    default: 3
    description: How many replicas to use in the swift rings.
  SnmpdReadonlyUserName:
    default: ro_snmp_user
    description: The user name for SNMPd with readonly rights running on all Overcloud nodes
    type: string
  SnmpdReadonlyUserPassword:
    description: The user password for SNMPd with readonly rights running on all Overcloud nodes
    type: string
    hidden: true
  NtpServer:
    default: ''
    description: Comma-separated list of ntp servers
    type: comma_delimited_list
  EnablePackageInstall:
    default: 'false'
    description: Set to true to enable package installation via Puppet
    type: boolean
  UpdateIdentifier:
    default: ''
    type: string
    description: >
      Setting to a previously unused value during stack-update will trigger
      package update on all nodes
  ServiceNetMap:
    default: {}
    description: Mapping of service_name -> network name. Typically set
                 via parameter_defaults in the resource registry.
    type: json
  TimeZone:
    default: 'UTC'
    description: The timezone to be set on Ceph nodes.
    type: string
  Hostname:
    type: string
    default: '' # Defaults to Heat created hostname
  ExtraConfig:
    default: {}
    description: |
      Additional hiera configuration to inject into the cluster. Note
      that ObjectStorageExtraConfig takes precedence over ExtraConfig.
    type: json
  ObjectStorageExtraConfig:
    default: {}
    description: |
      Role specific additional hiera configuration to inject into the cluster.
    type: json
  NetworkDeploymentActions:
    type: comma_delimited_list
    description: >
      Heat action when to apply network configuration changes
    default: ['CREATE']
  SoftwareConfigTransport:
    default: POLL_SERVER_CFN
    description: |
      How the server should receive the metadata required for software configuration.
    type: string
    constraints:
    - allowed_values: [POLL_SERVER_CFN, POLL_SERVER_HEAT, POLL_TEMP_URL, ZAQAR_MESSAGE]
  CloudDomain:
    default: ''
    type: string
    description: >
      The DNS domain used for the hosts. This should match the dhcp_domain
      configured in the Undercloud neutron. Defaults to localdomain.
  ServerMetadata:
    default: {}
    description: >
      Extra properties or metadata passed to Nova for the created nodes in
      the overcloud. It's accessible via the Nova metadata API.
    type: json
  SchedulerHints:
    type: json
    description: Optional scheduler hints to pass to nova
    default: {}

resources:

  SwiftStorage:
    type: OS::Nova::Server
    properties:
      image: {get_param: Image}
      flavor: {get_param: Flavor}
      key_name: {get_param: KeyName}
      networks:
        - network: ctlplane
      user_data_format: SOFTWARE_CONFIG
      user_data: {get_resource: UserData}
      name: {get_param: Hostname}
      software_config_transport: {get_param: SoftwareConfigTransport}
      metadata: {get_param: ServerMetadata}
      scheduler_hints: {get_param: SchedulerHints}

  # Combine the NodeAdminUserData and NodeUserData mime archives
  UserData:
    type: OS::Heat::MultipartMime
    properties:
      parts:
      - config: {get_resource: NodeAdminUserData}
        type: multipart
      - config: {get_resource: NodeUserData}
        type: multipart

  # Creates the "heat-admin" user if configured via the environment
  # Should return a OS::Heat::MultipartMime reference via OS::stack_id
  NodeAdminUserData:
    type: OS::TripleO::NodeAdminUserData

  # For optional operator additional userdata
  # Should return a OS::Heat::MultipartMime reference via OS::stack_id
  NodeUserData:
    type: OS::TripleO::NodeUserData

  ExternalPort:
    type: OS::TripleO::SwiftStorage::Ports::ExternalPort
    properties:
      ControlPlaneIP: {get_attr: [SwiftStorage, networks, ctlplane, 0]}

  InternalApiPort:
    type: OS::TripleO::SwiftStorage::Ports::InternalApiPort
    properties:
      ControlPlaneIP: {get_attr: [SwiftStorage, networks, ctlplane, 0]}

  StoragePort:
    type: OS::TripleO::SwiftStorage::Ports::StoragePort
    properties:
      ControlPlaneIP: {get_attr: [SwiftStorage, networks, ctlplane, 0]}

  StorageMgmtPort:
    type: OS::TripleO::SwiftStorage::Ports::StorageMgmtPort
    properties:
      ControlPlaneIP: {get_attr: [SwiftStorage, networks, ctlplane, 0]}

  TenantPort:
    type: OS::TripleO::SwiftStorage::Ports::TenantPort
    properties:
      ControlPlaneIP: {get_attr: [SwiftStorage, networks, ctlplane, 0]}

  ManagementPort:
    type: OS::TripleO::SwiftStorage::Ports::ManagementPort
    properties:
      ControlPlaneIP: {get_attr: [SwiftStorage, networks, ctlplane, 0]}

  NetworkConfig:
    type: OS::TripleO::ObjectStorage::Net::SoftwareConfig
    properties:
      ControlPlaneIp: {get_attr: [SwiftStorage, networks, ctlplane, 0]}
      ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
      InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
      StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
      StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
      TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
      ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}

  NetIpMap:
    type: OS::TripleO::Network::Ports::NetIpMap
    properties:
      ControlPlaneIp: {get_attr: [SwiftStorage, networks, ctlplane, 0]}
      ExternalIp: {get_attr: [ExternalPort, ip_address]}
      InternalApiIp: {get_attr: [InternalApiPort, ip_address]}
      StorageIp: {get_attr: [StoragePort, ip_address]}
      StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]}
      TenantIp: {get_attr: [TenantPort, ip_address]}
      ManagementIp: {get_attr: [ManagementPort, ip_address]}

  NetworkDeployment:
    type: OS::TripleO::SoftwareDeployment
    properties:
      name: NetworkDeployment
      config: {get_resource: NetworkConfig}
      server: {get_resource: SwiftStorage}
      actions: {get_param: NetworkDeploymentActions}

  SwiftStorageHieraConfig:
    type: OS::Heat::StructuredConfig
    properties:
      group: os-apply-config
      config:
        hiera:
          hierarchy:
            - '"%{::uuid}"'
            - heat_config_%{::deploy_config_name}
            - object_extraconfig
            - extraconfig
            - object
            - swift_devices_and_proxy # provided by SwiftDevicesAndProxyConfig
            - all_nodes # provided by allNodesConfig
            - '"%{::osfamily}"'
            - common
          datafiles:
            common:
              raw_data: {get_file: hieradata/common.yaml}
            object_extraconfig:
              mapped_data: {get_param: ObjectStorageExtraConfig}
            extraconfig:
              mapped_data: {get_param: ExtraConfig}
            object:
              raw_data: {get_file: hieradata/object.yaml}
              mapped_data: # data supplied directly to this deployment configuration, etc
                swift::swift_hash_suffix: { get_input: swift_hash_suffix }
                tripleo::ringbuilder::part_power: { get_input: swift_part_power }
                tripleo::ringbuilder::replicas: {get_input: swift_replicas }
                # Swift
                swift::storage::all::storage_local_net_ip: {get_input: swift_management_network}
                swift_mount_check: {get_input: swift_mount_check }
                tripleo::ringbuilder::min_part_hours: { get_input: swift_min_part_hours }
                ntp::servers: {get_input: ntp_servers}
                timezone::timezone: {get_input: timezone}
                # NOTE(dprince): build_ring support is currently not wired in.
                # See: https://review.openstack.org/#/c/109225/
                tripleo::ringbuilder::build_ring: True
                snmpd_readonly_user_name: {get_input: snmpd_readonly_user_name}
                snmpd_readonly_user_password: {get_input: snmpd_readonly_user_password}
                tripleo::packages::enable_install: {get_input: enable_package_install}
                tripleo::packages::enable_upgrade: {get_input: enable_package_upgrade}


  SwiftStorageHieraDeploy:
    type: OS::Heat::StructuredDeployment
    depends_on: NetworkDeployment
    properties:
      name: SwiftStorageHieraDeploy
      server: {get_resource: SwiftStorage}
      config: {get_resource: SwiftStorageHieraConfig}
      input_values:
        local_ip: {get_attr: [SwiftStorage, networks, ctlplane, 0]}
        snmpd_readonly_user_name: {get_param: SnmpdReadonlyUserName}
        snmpd_readonly_user_password: {get_param: SnmpdReadonlyUserPassword}
        swift_hash_suffix: {get_param: HashSuffix}
        swift_mount_check: {get_param: MountCheck}
        swift_min_part_hours: {get_param: MinPartHours}
        swift_part_power: {get_param: PartPower}
        swift_replicas: { get_param: Replicas}
        ntp_servers: {get_param: NtpServer}
        timezone: {get_param: TimeZone}
        enable_package_install: {get_param: EnablePackageInstall}
        enable_package_upgrade: {get_attr: [UpdateDeployment, update_managed_packages]}
        swift_management_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, SwiftMgmtNetwork]}]}

  # Resource for site-specific injection of root certificate
  NodeTLSCAData:
    depends_on: SwiftStorageHieraDeploy
    type: OS::TripleO::NodeTLSCAData
    properties:
      server: {get_resource: SwiftStorage}

  # Hook for site-specific additional pre-deployment config,
  # applying to all nodes, e.g node registration/unregistration
  NodeExtraConfig:
    depends_on: NodeTLSCAData
    type: OS::TripleO::NodeExtraConfig
    properties:
        server: {get_resource: SwiftStorage}

  UpdateConfig:
    type: OS::TripleO::Tasks::PackageUpdate

  UpdateDeployment:
    type: OS::Heat::SoftwareDeployment
    properties:
      config: {get_resource: UpdateConfig}
      server: {get_resource: SwiftStorage}
      input_values:
        update_identifier:
          get_param: UpdateIdentifier

outputs:
  hosts_entry:
    value:
      str_replace:
        template: |
          PRIMARYIP PRIMARYHOST.DOMAIN PRIMARYHOST
          EXTERNALIP EXTERNALHOST
          INTERNAL_APIIP INTERNAL_APIHOST
          STORAGEIP STORAGEHOST
          STORAGE_MGMTIP STORAGE_MGMTHOST
          TENANTIP TENANTHOST
          MANAGEMENTIP MANAGEMENTHOST
        params:
          PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, ObjectStorageHostnameResolveNetwork]}]}
          DOMAIN: {get_param: CloudDomain}
          PRIMARYHOST: {get_attr: [SwiftStorage, name]}
          EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
          EXTERNALHOST:
            list_join:
            - '-'
            - - {get_attr: [SwiftStorage, name]}
              - external
          INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
          INTERNAL_APIHOST:
            list_join:
            - '-'
            - - {get_attr: [SwiftStorage, name]}
              - internalapi
          STORAGEIP: {get_attr: [StoragePort, ip_address]}
          STORAGEHOST:
            list_join:
            - '-'
            - - {get_attr: [SwiftStorage, name]}
              - storage
          STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
          STORAGE_MGMTHOST:
            list_join:
            - '-'
            - - {get_attr: [SwiftStorage, name]}
              - storagemgmt
          TENANTIP: {get_attr: [TenantPort, ip_address]}
          TENANTHOST:
            list_join:
            - '-'
            - - {get_attr: [SwiftStorage, name]}
              - tenant
          MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
          MANAGEMENTHOST:
            list_join:
            - '-'
            - - {get_attr: [SwiftStorage, name]}
              - management
  nova_server_resource:
    description: Heat resource handle for the swift storage server
    value:
      {get_resource: SwiftStorage}
  swift_device:
    description: Swift device formatted for swift-ring-builder
    value:
      str_replace:
        template: 'r1z1-IP:%PORT%/d1'
        params:
          IP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, SwiftMgmtNetwork]}]}
  external_ip_address:
    description: IP address of the server in the external network
    value: {get_attr: [ExternalPort, ip_address]}
  internal_api_ip_address:
    description: IP address of the server in the internal_api network
    value: {get_attr: [InternalApiPort, ip_address]}
  storage_ip_address:
    description: IP address of the server in the storage network
    value: {get_attr: [StoragePort, ip_address]}
  storage_mgmt_ip_address:
    description: IP address of the server in the storage_mgmt network
    value: {get_attr: [StorageMgmtPort, ip_address]}
  tenant_ip_address:
    description: IP address of the server in the tenant network
    value: {get_attr: [TenantPort, ip_address]}
  management_ip_address:
    description: IP address of the server in the management network
    value: {get_attr: [ManagementPort, ip_address]}
  config_identifier:
    description: identifier which changes if the node configuration may need re-applying
    value:
      list_join:
        - ','
        - - {get_attr: [SwiftStorageHieraDeploy, deploy_stdout]}
          - {get_attr: [NodeTLSCAData, deploy_stdout]}
          - {get_param: UpdateIdentifier}