Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
############################################################

GLOBAL_RHEL_PACKAGES="rhel-system-roles rhel-system-roles-sap expect"
GLOBAL_GALAXY_COLLECTIONS="ibm.power_linux_sap:>=3.0.0,<4.0.0"
GLOBAL_GALAXY_COLLECTIONS="ibm.power_linux_sap:>=3.0.0,<4.0.0 ibm.power_aix:>=2.0.0,<3.0.0"

############################################################
# Start functions
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#!/bin/bash

### Using input variables from terraform
ansible_playbook=${ansible_playbook_file}
ansible_log_path=${ansible_log_path}
ansible_inventory=${ansible_inventory}
ansible_private_key_file=${ansible_private_key_file}

# Create ansible.cfg file
ansible_playbook_name=$(basename $${ansible_playbook})
echo -e "[defaults]\nhost_key_checking=False" >ansible.cfg
export ANSIBLE_LOG_PATH=$${ansible_log_path}/$${ansible_playbook_name}.$(date "+%Y.%m.%d-%H.%M.%S").log
export ANSIBLE_PRIVATE_KEY_FILE=$${ansible_private_key_file}

#Execute ansible playbook
unbuffer ansible-playbook -i $${ansible_inventory} $${ansible_playbook}
if [ $? -ne 0 ]; then
rm -rf $${ansible_private_key_file}
exit 1
fi
echo \"Playbook command successful\"
rm -rf $${ansible_private_key_file}
Original file line number Diff line number Diff line change
@@ -0,0 +1,266 @@
---
- name: AIX Configuration (configure proxy, configure NTP, extend rootvg, create data filesystem, install curl, configure NFS)
hosts: all
gather_facts: no

vars:
EXTEND_ROOT_VOLUME_WWN: "${EXTEND_ROOT_VOLUME_WWN}"
DATA_VOLUME_WWN: "${DATA_VOLUME_WWN}"
DATA_VOLUME_MOUNT_PATH: "${DATA_VOLUME_MOUNT_PATH}"
DATAVG: "${DATAVG}"
DATALV: "${DATALV}"
PROXY_IP_PORT: "${PROXY_IP_PORT}"
NO_PROXY: "${NO_PROXY}"
NFS_ENABLE: "${NFS_ENABLE}"
NFS_MOUNT_POINT: "${NFS_MOUNT_POINT}"
NFS_HOST_OR_PATH: "${NFS_HOST_OR_PATH}"
NTP_ENABLE: "${NTP_ENABLE}"
NTP_SERVER: "${NTP_SERVER}"
# Hardcoded values (Terraform can override)
NFS_DOMAIN: "${NFS_DOMAIN}"
NFS_HOSTNAME: "${NFS_HOSTNAME}"
ansible_shell_executable: /usr/bin/ksh
ansible_shell_type: sh

tags:
- rootvg
- data
- proxy
- curl
- ntp
- nfs

tasks:

- name: Set proxy environment variables in /etc/profile
ansible.builtin.blockinfile:
path: /etc/profile
marker: "# {mark} PROXY SETTINGS"
block: |
export http_proxy=http://{{ PROXY_IP_PORT }}
export https_proxy=http://{{ PROXY_IP_PORT }}
export HTTP_PROXY=http://{{ PROXY_IP_PORT }}
export HTTPS_PROXY=http://{{ PROXY_IP_PORT }}
export no_proxy={{ NO_PROXY }}
tags: proxy

- name: Export proxy variables for current session
ansible.builtin.shell: |
export http_proxy=http://{{ PROXY_IP_PORT }}
export https_proxy=http://{{ PROXY_IP_PORT }}
export HTTP_PROXY=http://{{ PROXY_IP_PORT }}
export HTTPS_PROXY=http://{{ PROXY_IP_PORT }}
export no_proxy={{ NO_PROXY }}
changed_when: false
tags: proxy

##############################################################
# Configure NTP
##############################################################
- name: Ensure NTP server entry is in /etc/ntp.conf
ansible.builtin.lineinfile:
path: /etc/ntp.conf
line: "server {{ NTP_SERVER }}"
state: present
when: NTP_ENABLE | bool
tags: ntp

- name: Restart NTP service if not active
ansible.builtin.shell: |
stopsrc -s xntpd || true
startsrc -s xntpd
when: NTP_ENABLE | bool
changed_when: false
tags: ntp

##############################################################
# Extend rootvg
##############################################################
- name: Discover hdisk by WWN for rootvg extension (run cfgmgr first)
ansible.builtin.shell: |
cfgmgr >/dev/null 2>&1
lspv -u | tr '[:upper:]' '[:lower:]' |
awk -v w="{{ EXTEND_ROOT_VOLUME_WWN | lower }}" 'index($0,w){print $1; exit}'
register: hdisk_name
changed_when: false
tags: rootvg

- name: Get current MAX PPs per PV for rootvg
ansible.builtin.shell: "lsvg rootvg | grep 'MAX PPs per PV' | awk '{print $5}'"
register: chvg_limit
changed_when: false
tags: rootvg

- name: Update rootvg partition limit if less than 1024
ansible.builtin.shell: "chvg -t 16 rootvg"
when: chvg_limit.stdout | int < 1024
changed_when: false
tags: rootvg

- name: Mark hdisk as physical volume
ansible.builtin.command: "chdev -l {{ hdisk_name.stdout }} -a pv=yes"
when: hdisk_name.stdout != ""
changed_when: false
tags: rootvg

- name: Extend rootvg with new disk
community.general.aix_lvg:
vg: rootvg
pvs: ["{{ hdisk_name.stdout }}"]
force: true
state: present
when: hdisk_name.stdout != ""
tags: rootvg

- name: Resize filesystems
community.general.aix_filesystem:
filesystem: "{{ item.filesystem }}"
size: "{{ item.size }}"
state: present
loop:
- { filesystem: "/", size: "8G" }
- { filesystem: "/usr", size: "8G" }
- { filesystem: "/opt", size: "6G" }
- { filesystem: "/var", size: "6G" }
- { filesystem: "/tmp", size: "4G" }
tags: rootvg

##############################################################
# Install curl package
##############################################################
- name: Install curl package using dnf
ansible.builtin.shell: |
. /etc/profile && echo 'y' | /opt/freeware/bin/dnf install curl-7.53*
register: curl_install
changed_when: "'Complete!' in curl_install.stdout or 'Nothing to do.' in curl_install.stdout"
tags: curl

- name: Verify curl installation
ansible.builtin.shell: |
. /etc/profile && /opt/freeware/bin/dnf list installed curl | grep curl
register: curl_check
changed_when: false
failed_when: curl_check.rc != 0
tags: curl

##############################################################
# Configure NFS
##############################################################

- name: Configure NFS if enabled
when: NFS_ENABLE | bool
block:
- name: Set NFS domain
ansible.builtin.command: chnfsdom "{{ NFS_DOMAIN }}"
changed_when: false
tags: nfs

- name: Ensure NFS services running
ansible.builtin.command: startsrc -g nfs
changed_when: false
tags: nfs

- name: Ensure NFS server entry in /etc/hosts
ansible.builtin.lineinfile:
path: /etc/hosts
line: "{{ NFS_HOST_OR_PATH.split(':')[0] }} {{ NFS_HOSTNAME }}"
state: present
tags: nfs

- name: Create mount directory
ansible.builtin.file:
path: "{{ NFS_MOUNT_POINT }}"
state: directory
tags: nfs

- name: Check if NFS already mounted
ansible.builtin.shell: "mount | awk '{print $2}' | grep -w {{ NFS_MOUNT_POINT }} || true"
register: nfs_mount_check
changed_when: false
tags: nfs

- name: Mount NFS share (NFSv4)
ansible.builtin.command: "mount -o vers=4 {{ NFS_HOST_OR_PATH }} {{ NFS_MOUNT_POINT }}"
when: nfs_mount_check.stdout == ""
tags: nfs

- name: Show NFS mount status
ansible.builtin.command: df -g {{ NFS_MOUNT_POINT }}
register: nfs_mount_status
changed_when: false
tags: nfs

##############################################################
# Create filesystem for data volume (AIX)
##############################################################
- name: Get hdisk for data volume
ansible.builtin.shell: |
lspv -u | tr '[:upper:]' '[:lower:]' |
awk -v w="{{ DATA_VOLUME_WWN | lower }}" 'index($0,w){print $1; exit}'
register: data_hdisk
changed_when: false
tags: data

- name: Fail if data hdisk not found
ansible.builtin.fail:
msg: "Error: Disk {{ DATA_VOLUME_WWN }} not found."
when: data_hdisk.stdout == ""
tags: data

- name: Create Volume Group ({{ DATAVG }}) on data hdisk
ibm.power_aix.lvg:
vg_name: "{{ DATAVG }}"
pvs: ["{{ data_hdisk.stdout }}"]
state: present
tags: data

- name: Gather LVM facts
ibm.power_aix.lvm_facts:
register: lvm_info
tags: data

- name: Calculate LV size = Free PPs × PP Size
ansible.builtin.set_fact:
datalv_size: "{{ (lvm_info.ansible_facts.LVM.VGs[DATAVG]['FREE PPs'] | regex_search('^\\d+') | int) *
(lvm_info.ansible_facts.LVM.VGs[DATAVG]['PP SIZE'] | regex_search('^\\d+') | int) }}M"
tags: data

- name: Create Logical Volume ({{ DATALV }}) in {{ DATAVG }}
ibm.power_aix.lvol:
vg: "{{ DATAVG }}"
lv: "{{ DATALV }}"
size: "{{ datalv_size }}"
state: present
when:
- "DATALV not in (lvm_info.ansible_facts.LVM.VGs[DATAVG].LVs | default({}))"
- (lvm_info.ansible_facts.LVM.VGs[DATAVG]['FREE PPs'] | regex_search('^\\d+') | int) > 0
tags: data

- name: Ensure mount path exists
ansible.builtin.file:
path: "{{ DATA_VOLUME_MOUNT_PATH }}"
state: directory
mode: '0755'
tags: data

- name: Ensure filesystem exists on LV and is mounted
ibm.power_aix.filesystem:
device: "/dev/{{ DATALV }}"
filesystem: "{{ DATA_VOLUME_MOUNT_PATH }}"
fs_type: jfs2
auto_mount: yes
permissions: rw
state: present
tags: data

- name: Ensure mount is active
ibm.power_aix.mount:
mount_dir: "{{ DATA_VOLUME_MOUNT_PATH }}"
state: mount
tags: data

- name: Verify filesystem mounted with df -g
ansible.builtin.shell: df -g | grep "{{ DATA_VOLUME_MOUNT_PATH }}"
register: df_output
changed_when: false
tags: data
2 changes: 1 addition & 1 deletion solutions/standard-plus-vsi/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ This example sets up the following infrastructure:

| Name | Source | Version |
|------|--------|---------|
| <a name="module_pi_aix_configure_services"></a> [pi\_aix\_configure\_services](#module\_pi\_aix\_configure\_services) | ../../modules/powervs-vpc-landing-zone/submodules/ansible | n/a |
| <a name="module_pi_scc_wp_agent"></a> [pi\_scc\_wp\_agent](#module\_pi\_scc\_wp\_agent) | ../../modules/powervs-vpc-landing-zone/submodules/ansible | n/a |
| <a name="module_powervs_instance"></a> [powervs\_instance](#module\_powervs\_instance) | terraform-ibm-modules/powervs-instance/ibm | 2.7.0 |
| <a name="module_standard"></a> [standard](#module\_standard) | ../../modules/powervs-vpc-landing-zone | n/a |
Expand All @@ -63,7 +64,6 @@ This example sets up the following infrastructure:

| Name | Type |
|------|------|
| [terraform_data.aix_init](https://registry.terraform.io/providers/hashicorp/terraform/latest/docs/resources/data) | resource |
| [ibm_iam_auth_token.auth_token](https://registry.terraform.io/providers/IBM-Cloud/ibm/1.82.0/docs/data-sources/iam_auth_token) | data source |

### Inputs
Expand Down
Loading