This post contains step by step instructions for creating an Ansible role acfssetup to setup Oracle ASM Cluster Filesystem (ACFS) on multiple nodes of a cluster. This assumes that Grid Infrastructure 12.1.0.2.0 is already installed on the nodes, and ASM is working fine. This also assumes that there already is Ansible installed on some controller host with ssh equivalency setup between root and Oracle users.
Step 1: Create directory structure for the role acfssetup:
$ cd /etc/ansible/roles
$ mkdir acfssetup
$ mkdir files handlers meta templates tasks vars
Step 2: Create the Tasks (/etc/ansible/roles/acfssetup/tasks/main.yml):
---
- name: Install ACFS/ADVM modules on the nodes
become_user: "{{ superuser }}"
environment: "{{ asm_instance }}"
shell:"{ gi_home_path }}/bin/acfsroot install"
tags:acfs
- name: Start and enable the ACFS modules on the nodes
become_user: "{{ superuser }}"
environment: "{{ asm_instance }}"
shell:"{ gi_home_path }}/bin/acfsload start"
shell:"{ gi_home_path }}/bin/acfsroot enable"
tags:acfs
- name: As oracle user, create an ASM volume for ACFS on first node
when: inventory_hostname in groups['node1']
become_user: "{{ gi_owner }}"
environment: "{{ asm_instance }}"
shell:"{ gi_home_path }}/bin/asmcmd volcreate -G {{ asm_dg_name }} -s {{ acfs_vol_size }} {{ acfs_vol_name }}"
shell:"{ gi_home_path }}/bin/asmcmd volinfo -G {{ asm_dg_name }} {{ acfs_vol_name }} | grep Device | sed 's/.*://'"
register: {{ device_name }}
tags:acfs
- name: As oracle user, create the filesystem on the volume which was just created
become_user: "{{ gi_owner }}"
environment: "{{ asm_instance }}"
shell:"/sbin/mkfs -t acfs {{ device_name }}.stdout"
tags:acfs
- name: As root, create an empty directory which will house the file system
become_user: "{{ superuser }}"
environment: "{{ asm_instance }}"
shell:"mkdir -p /{{ acfs_mount_name }}/{{ acfs_vol_name }}; chown root:oinstall /{{ acfs_mount_name }}; chmod 770 /{{ acfs_mount_name }}; chown -R oracle:oinstall /{{ acfs_mount_name }}/{{ acfs_vol_name }}; chmod 775 /{{ acfs_mount_name }}/{{ acfs_vol_name }}"
tags:acfs
- name: As root, setup the file system to be auto mounted by clusterware
become_user: "{{ superuser }}"
environment: "{{ asm_instance }}"
shell:"{ gi_home_path }}/bin/srvctl add volume -volume {{ acfs_vol_name }} -diskgroup {{ asm_dg_name }} -device {{ device_name }}.stdout; { gi_home_path }}/bin/srvctl add filesystem -device {{ device_name }}.stdout -path {{ acfs_mount_name }}/{{ acfs_vol_name }} -diskgroup {{ asm_dg_name }} -user {{ gi_owner }} -fstype ACFS -description \"ACFS General Purpose Mount\""
tags:acfs
Step 3: Create the Variables (/etc/ansible/roles/acfssetup/vars/main.yml):
ver: "12.1.0.2.0"
superuser: root
asm_instance: +ASM
asm_dg_name: DATA
acfs_vol_name: ACFSVOL1
acfs_vol_size: 10G
acfs_mount_name: acfsmounts
device_name: default([])
gi_owner: oracle
gi_group: oinstall
gi_base_path: "/u01/app/oracle"
gi_home_path: "{{ gi_base_path }}/product/{{ ver |
regex_replace('^(.*)\\.(.*)\\.(.*)\\.(.*)$', '\\1.\\2.\\3') }}/grid"
gi_home_name: "OraGI{{ ver | regex_replace('^(.*)\\.(.*)\\.(.*)\\.(.*)$', '\\1\\2')}}"
Step 4: Configure Ansible host file (/etc/ansible/hosts)
node1 ansible_host=node1.foo.com
node2 ansible_host=node2.foo.com
Step 5: Create the skeleton Playbook (/etc/ansible/acfs.yml):
---
- hosts: all
become: true
roles:
- acfssetup
Step 6: Run the playbook
$ ansible-playbook acfs.yml
Step 1: Create directory structure for the role acfssetup:
$ cd /etc/ansible/roles
$ mkdir acfssetup
$ mkdir files handlers meta templates tasks vars
Step 2: Create the Tasks (/etc/ansible/roles/acfssetup/tasks/main.yml):
---
- name: Install ACFS/ADVM modules on the nodes
become_user: "{{ superuser }}"
environment: "{{ asm_instance }}"
shell:"{ gi_home_path }}/bin/acfsroot install"
tags:acfs
- name: Start and enable the ACFS modules on the nodes
become_user: "{{ superuser }}"
environment: "{{ asm_instance }}"
shell:"{ gi_home_path }}/bin/acfsload start"
shell:"{ gi_home_path }}/bin/acfsroot enable"
tags:acfs
- name: As oracle user, create an ASM volume for ACFS on first node
when: inventory_hostname in groups['node1']
become_user: "{{ gi_owner }}"
environment: "{{ asm_instance }}"
shell:"{ gi_home_path }}/bin/asmcmd volcreate -G {{ asm_dg_name }} -s {{ acfs_vol_size }} {{ acfs_vol_name }}"
shell:"{ gi_home_path }}/bin/asmcmd volinfo -G {{ asm_dg_name }} {{ acfs_vol_name }} | grep Device | sed 's/.*://'"
register: {{ device_name }}
tags:acfs
- name: As oracle user, create the filesystem on the volume which was just created
become_user: "{{ gi_owner }}"
environment: "{{ asm_instance }}"
shell:"/sbin/mkfs -t acfs {{ device_name }}.stdout"
tags:acfs
- name: As root, create an empty directory which will house the file system
become_user: "{{ superuser }}"
environment: "{{ asm_instance }}"
shell:"mkdir -p /{{ acfs_mount_name }}/{{ acfs_vol_name }}; chown root:oinstall /{{ acfs_mount_name }}; chmod 770 /{{ acfs_mount_name }}; chown -R oracle:oinstall /{{ acfs_mount_name }}/{{ acfs_vol_name }}; chmod 775 /{{ acfs_mount_name }}/{{ acfs_vol_name }}"
tags:acfs
- name: As root, setup the file system to be auto mounted by clusterware
become_user: "{{ superuser }}"
environment: "{{ asm_instance }}"
shell:"{ gi_home_path }}/bin/srvctl add volume -volume {{ acfs_vol_name }} -diskgroup {{ asm_dg_name }} -device {{ device_name }}.stdout; { gi_home_path }}/bin/srvctl add filesystem -device {{ device_name }}.stdout -path {{ acfs_mount_name }}/{{ acfs_vol_name }} -diskgroup {{ asm_dg_name }} -user {{ gi_owner }} -fstype ACFS -description \"ACFS General Purpose Mount\""
tags:acfs
Step 3: Create the Variables (/etc/ansible/roles/acfssetup/vars/main.yml):
ver: "12.1.0.2.0"
superuser: root
asm_instance: +ASM
asm_dg_name: DATA
acfs_vol_name: ACFSVOL1
acfs_vol_size: 10G
acfs_mount_name: acfsmounts
device_name: default([])
gi_owner: oracle
gi_group: oinstall
gi_base_path: "/u01/app/oracle"
gi_home_path: "{{ gi_base_path }}/product/{{ ver |
regex_replace('^(.*)\\.(.*)\\.(.*)\\.(.*)$', '\\1.\\2.\\3') }}/grid"
gi_home_name: "OraGI{{ ver | regex_replace('^(.*)\\.(.*)\\.(.*)\\.(.*)$', '\\1\\2')}}"
Step 4: Configure Ansible host file (/etc/ansible/hosts)
node1 ansible_host=node1.foo.com
node2 ansible_host=node2.foo.com
Step 5: Create the skeleton Playbook (/etc/ansible/acfs.yml):
---
- hosts: all
become: true
roles:
- acfssetup
Step 6: Run the playbook
$ ansible-playbook acfs.yml
No comments:
Post a Comment