In this post, we will install pgAdmin 4 on a CentOS 7 server using ansible.
Prerequisites
In this post, we will assume that we have access to CentOS 7 machine/VM with proper credentials that can be fed to ansible through inventory. Most of the steps will also assume that we have SELinux set to enforcing.
Installing Apache web server
Before we can start installing pgAdmin, we need to install and configure
Apache that will serve the application. On CentOS 7, we need to install
httpd and mod_wsgi packages and then start the server. Ansible tasks that
achieve this would look something like this:
- name: Install Apache
  package:
    name: "{{ item }}"
  with_items:
    - httpd
    - mod_wsgi
- name: Start Apache
  service:
    name: httpd
    enabled: yes
    state: started
Running this through ansible will install and start the server that can be used to serve static files and wsgi apps. But by default, wsgi applications will not be allowed to connect to database, which means that we need to fix some SELinux stuff.
Fortunately for us, fixing this error just means setting
httpd_can_network_connect_db SELinux boolean to true. And in ansible
language, this means adding the following task to the playbook:
- name: Allow apache to access db
  seboolean:
    name: httpd_can_network_connect_db
    state: yes
    persistent: yes
Note that we marked the boolean flag change as persistent in order to, well, persist it;) This way the flag setting will not be lost during system reboot.
Now we are ready to install the pgAdmin onto this server.
Installing pgAdmin
We start the installation by adding PostgreSQL 10 yum repository. Please note that the version in the next task was latest stable at the time of the post creation. Always use the latest stable version from the PostgreSQL RPM build project in order to keep your installation secure.
- name: Add PostgreSQL 10 repo
  package:
    name: https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-centos10-10-2.noarch.rpm
pgAdmin will also require some packages that are only available in EPEL repo, so we will go ahead and add that repository too:
- name: Add EPEL
  yum:
    name: epel-release
Now we can actually install pgAdmin web package that contains the wsgi application our Apache will serve:
- name: Install pgAdmin4
  yum:
    name: pgadmin4-v2-web
Before we can start using the pgAdmin, we must create the required folder
layout on disk and add first admin user. pgAdmin comes bundled with setup.py
script that does this for us, all we have to do is run it with proper
environment variables set.
- name: Initialize pgAdmin4
  command: python /usr/lib/python2.7/site-packages/pgadmin4-web/setup.py
  args:
    creates: /var/lib/pgadmin/pgadmin4.db
  environment:
    PGADMIN_SETUP_EMAIL: [email protected]
    PGADMIN_SETUP_PASSWORD: correct horse battery staple
Please do note that we used creates argument for the command ansible module
here in order to avoid inadvertently running over the existing pgAdmin
configuration. This does not matter much for the initial installation, but we
should try getting into a habit of always thinking about our end-users and how
not to delete their data.
All that is left for us to do now is inform Apache about our latest and greatest pgAdmin installation. And thanks to the pgAdmin authors and packagers that prepared Apache configuration for us, we can do this with a simple copy command:
- name: Install pgAdmin4 site config
  copy:
    src: /etc/httpd/conf.d/pgadmin4-v2.conf.sample
    dest: /etc/httpd/conf.d/pgadmin4-v2.conf
    remote_src: yes
  notify: Restart apache
Taking care of the notify stuff is left as an exercise for the reader. And
we are done, right? Wrong. Navigating to the webserver.name/pgAdmin4, we
will be greeted by big fat Internal Server Error. We need to fix
permissions for the pgAdmin runtime stuff. And here is how we do this:
- name: Fix pgAdmin permissions
  file:
    path: "{{ item }}"
    setype: httpd_sys_content_rw_t
    owner: apache
    group: apache
    recurse: yes
  with_items:
    - /var/log/pgadmin
    - /var/lib/pgadmin
Note that we are fixing two problems at once here:
- we are setting the ownership bits to something that will allow Apache to read and write those files, and
 - notifying SELinux that it is OK to let Apache write to those files.
 
And now we are done. Stay sharp and see you next time.



