在Ansible中安装PostgreSQL的方法
我也查找了使用Ansible安装PostgreSQL的步骤,并记在了备忘录里。这是前一次使用Puppet安装PostgreSQL的姊妹篇。
环境是
* CentOS 7.2
* Ansible 2.0.2.0
安装Ansible
据说需要Python 2.6或2.7.
# python -V
Python 2.7.5
由于Ansible软件包在EPEL中公开,因此需要安装epel-release。
# yum install epel-release
使用yum在服务器上安装Ansible。
# yum install ansible
# ansible --version
ansible 2.0.2.0
config file = /etc/ansible/ansible.cfg
configured module search path = Default w/o overrides
SSH连接的设置
由于Ansible是通过SSH连接来运行的,所以需要进行配置。这次我们将配置为SSH连接到自己的服务器。
# ssh-keygen -t rsa
# cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
# chmod 600 ~/.ssh/authorized_keys
# ssh-agent bash
# ssh-add ~/.ssh/id_rsa
在ansible的hosts文件中写下连接目标服务器的IP地址。
[dbservers]
192.168.56.101
使用ping或其他方式來確認設定是否正確。
# ansible all -m ping
192.168.56.101 | SUCCESS => {
"changed": false,
"ping": "pong"
}
# ansible all -a "/bin/echo hello"
192.168.56.101 | SUCCESS | rc=0 >>
hello
# ansible all -a "/bin/date"
192.168.56.101 | SUCCESS | rc=0 >>
2016年 5月 21日 土曜日 23:22:10 JST
创建试用Playbook
准备一个Playbook的存放位置。
# mkdir /etc/ansible/playbooks
暂时先创建一个只包含ping命令的playbook试试看。
---
- hosts: dbservers
remote_user: root
tasks:
- name: test connection
ping:
执行。
[root@localhost playbooks]# ansible-playbook postgresql.yml
PLAY [dbservers] ***************************************************************
TASK [setup] *******************************************************************
ok: [192.168.56.101]
TASK [test connection] *********************************************************
ok: [192.168.56.101]
PLAY RECAP *********************************************************************
192.168.56.101 : ok=2 changed=0 unreachable=0 failed=0
嗯,看起来进展顺利。
创建一个用于安装和启动PostgreSQL的playbook。
根据Ansible文档编写的playbook如下。
---
- hosts: dbservers
remote_user: root
tasks:
- name: test connection
ping:
- name: install yum repository
yum: name=https://download.postgresql.org/pub/repos/yum/9.5/redhat/rhel-7-x86_64/pgdg-centos95-9.5-2.noarch.rpm
- name: install postgresql server
yum: name={{ item }} state=installed
with_items:
- postgresql95
- postgresql95-server
- stat: path=/var/lib/pgsql/9.5/data/PG_VERSION
register: dbcluster
- name: initdb
shell: /usr/pgsql-9.5/bin/initdb -D /var/lib/pgsql/9.5/data --no-locale
become: yes
become_user: postgres
when: not dbcluster.stat.exists
- name: start postgresql server
service: name=postgresql-9.5 state=started
##Danger!! These below are not idempotent.
# - name: create test db
# shell: /usr/pgsql-9.5/bin/createdb test
# become: yes
# become_user: postgres
#
# - name: create pgbench tables
# shell: /usr/pgsql-9.5/bin/pgbench -i test
# become: yes
# become_user: postgres
这个指南所做的事情
我正在使用PostgreSQL公式的RPM进行安装。
有时候写起来有点麻烦,需要保持等式。因为在initdb的部分遇到了问题,所以尝试使用类似上述的方式,通过使用stat来确认DB集群只在不存在时才进行initdb。使用PG_VERSION的存在判断还有点可疑。我想要通过判断DB集群目录本身的存在来进行判断,但当只提供了一个空目录时,我不知道该怎么办,所以就这样做了。
创建数据库和表格更难确保幂等性…
如果开始使用shell命令的返回值进行检查,可能会被迫强行将正常的shell脚本转换为Ansible的语法,所以我放弃了。
如果更深入地阅读Ansible文档,也许会有更好的解决方法。
执行
# ansible-playbook postgresql.yml
PLAY [dbservers] ***************************************************************
TASK [setup] *******************************************************************
ok: [192.168.56.101]
TASK [test connection] *********************************************************
ok: [192.168.56.101]
TASK [install yum repository] **************************************************
ok: [192.168.56.101]
TASK [install postgresql server] ***********************************************
skipping: [192.168.56.101] => (item=[u'postgresql95', u'postgresql95-server', u'postgresql95-devel'])
TASK [stat] ********************************************************************
ok: [192.168.56.101]
TASK [initdb] ******************************************************************
skipping: [192.168.56.101]
TASK [start postgresql server] *************************************************
ok: [192.168.56.101]
PLAY RECAP *********************************************************************
192.168.56.101 : ok=6 changed=0 unreachable=0 failed=0
以上!
请提供更多背景资料。
-
- Ansible Documentation
- CentOS7にPostgreSQLをインストールする