User Tools

Site Tools


ansible:ansible_os_deployment

This is an old revision of the document!


Ansible base OS customization

Pre task for AIX to set ansible_python_interpreter

# cat pretask.yml
---
- name: Set Python interpreter based on AIX version
  hosts: aix_hosts
  gather_facts: false  # we'll do manual version check
  become: yes

  pre_tasks:

    - name: Get AIX version
      ansible.builtin.shell: oslevel
      register: aix_version
      changed_when: false

    - name: Set Python interpreter for AIX 7.2
      ansible.builtin.set_fact:
        ansible_python_interpreter: "/opt/freeware/bin/python3"
      when: "'7.2' in aix_version.stdout"

    - name: Set Python interpreter for AIX 7.3
      ansible.builtin.set_fact:
        ansible_python_interpreter: "/opt/freeware/bin/python3_73"
      when: "'7.3' in aix_version.stdout"

  tasks:
    - name: Debug current interpreter
      ansible.builtin.debug:
        msg: "Using interpreter: {{ ansible_python_interpreter }}"

    # You can continue here with other tasks

Create filesystems

# cat inventory.ini
[aix_hosts]
aixserver1 ansible_user=root ansible_connection=ssh ansible_python_interpreter=/opt/freeware/bin/python3
# cat lv_config.json
[
  {
    "vgname": "datavg",
    "lvname": "lv_data",
    "mount_point": "/data",
    "size": "2G"
  },
  {
    "vgname": "appvg",
    "lvname": "lv_app",
    "mount_point": "/app",
    "size": "5G"
  }
]

Create filesystems

# cat create_aix_lvs.yml
---
- name: Create Logical Volumes and Filesystems on AIX
  hosts: aix_hosts
  become: yes
  vars_files:
    - lv_config.json

  tasks:

    - name: Create logical volume
      ansible.builtin.shell: |
        mklv -t jfs2 -y {{ item.lvname }} {{ item.vgname }} {{ item.size }}
      args:
        creates: "/dev/{{ item.lvname }}"
      loop: "{{ lv_config }}"

    - name: Create file system
      ansible.builtin.shell: |
        crfs -v jfs2 -d {{ item.lvname }} -m {{ item.mount_point }} -A yes
      args:
        creates: "{{ item.mount_point }}"
      loop: "{{ lv_config }}"

    - name: Create mount point directory
      ansible.builtin.file:
        path: "{{ item.mount_point }}"
        state: directory
        mode: '0755'
      loop: "{{ lv_config }}"

    - name: Mount filesystem
      ansible.builtin.shell: |
        mount {{ item.mount_point }}
      loop: "{{ lv_config }}"

    - name: Ensure filesystem is in /etc/filesystems (automount)
      ansible.builtin.shell: |
        chfs -A yes {{ item.mount_point }}
      loop: "{{ lv_config }}"

Extend filesystems if smaller than desired

# cat extend_aix_lvs.yml
---
- name: Extend filesystems on AIX if current size is smaller
  hosts: aix_hosts
  become: yes
  vars_files:
    - lv_config.json

  tasks:
    - name: Get current size of filesystem
      ansible.builtin.shell: |
        lsfs {{ item.mount_point }} | awk 'NR>1 {print $3}'
      register: current_fs_size
      changed_when: false
      loop: "{{ lv_config }}"
      loop_control:
        label: "{{ item.mount_point }}"
      delegate_to: localhost

    - name: Set fact with comparison results
      ansible.builtin.set_fact:
        fs_resize_list: >-
          {{
            fs_resize_list | default([]) +
            [{
              'mount_point': item.1.mount_point,
              'lvname': item.1.lvname,
              'vgname': item.1.vgname,
              'current_size': (item.0.stdout | trim),
              'desired_size': item.1.size
            }] if (item.0.stdout | trim is version(item.1.size, '<')) else fs_resize_list | default([])
          }}
      loop: "{{ zip(current_fs_size.results, lv_config) }}"
      loop_control:
        label: "{{ item.1.mount_point }}"

    - name: Extend filesystem only if current size is less than desired
      ansible.builtin.shell: |
        chfs -a size={{ item.desired_size }} {{ item.mount_point }}
      loop: "{{ fs_resize_list }}"
      when: fs_resize_list | length > 0

Note

AIX lsfs returns sizes in 512-byte blocks. So 4194304 blocks = 2G. You may need a helper function to normalize that if you want more accuracy.
You could replace size parsing with something like:
lsfs /data | awk 'NR>1 {printf "%.0fG\n", $3*512/1024/1024/1024}'
ansible/ansible_os_deployment.1745352811.txt.gz · Last modified: 2025/04/22 22:13 by manu