Ansible 学习笔记2–自动完成Oracle EM13c Agent安装前的主机配置工作

Ansible 学习笔记2–自动完成Oracle EM13c Agent安装前的主机配置工作

前言

我觉得学习一个工具,能够边学边用是最幸运的,因为这样印象深刻,如果用不上,只是学习网上的例子,估计过几天也就忘了。

Oracle Enterprise Manager 12c,13c在部署agent时,可以使用”push”方式进行,简单说,就是从EM Console发起一个任务,”push”软件介质,安装、配置全部自动完成。听起来挺不错,但是实际上,为了能够自动化、批量化完成这个agent deploy的工作,在需要安装agent的主机上还是要做一些琐碎的准备工作的,以前一直觉得机器多了很麻烦,但是也没啥好办法,现在学了ansible,就想试试看看用ansible能不能自动完成agent安装前的那些配置工作。

我们先看看为了安装agent,主机具体需要做哪些工作:

  1. 创建用户和组,一般组是dba,用户是oracle,如果主机已经部署了Oracle软件,这些应该都已经有了,但是很多时候,我们可能是在部署Oracle软件之前就要部署agent(比如使用EM13c自动部署Oracle软件的场景)
  2. 修改/etc/sudoers文件,修改其中的两个选项,并把安装agent的用户加进去,一般是oracle
  3. 关掉防火墙或增加防火墙规则
  4. 修改/etc/hosts,让OMS和agent所在的机器互相可以用主机名访问

下面我们就看一下使用ansible怎么完成这些工作,为了研究这个问题,我准备的环境是这样的:

主机IP地址 主机名 主机OS &Version 安装的软件
192.168.0.39 “em13c.hthorizon.com” Oracle Enterprise Linux 6.5 EM13cR2 OMS,Ansible
192.168.0.40 “ol71vmta.hthorizon.com” Oracle Enterprise Linux 7.1 EM Agent 13cR2 (准备安装)
192.168.0.41 “ol71vm1.hthorizon.com” Oracle Enterprise Linux 7.1 EM Agent 13cR2 (准备安装)

192.168.0.40和192.168.0.41都是新安装,除了在安装时配置的主机名和ip地址,其他都是缺省设置,安装软件选择的是:

Ansible playbook介绍

使用ansible命令行一条一条执行命令,被称为adhoc方式,也就是即席方式,而使用playbook就是将多条命令按一定的语法组合成一个集合,除了将命令组合在一起按顺序执行外,playbook还提供了更加复杂的功能,比如按一定的条件执行,比如使用变量,playbook就是ansible特有的脚本语言,通过playbook,可以完成很多复杂的工作。

具体的介绍可以参考:http://ansible-tran.readthedocs.io/en/latest/docs/playbooks_intro.html

我们前面提到的事情,从某种程度上将,是使用adhoc完成不了的,或者说不能自动化完成,所以我们必须学习playbook。

Playbook是YAML格式的文本文件,最基本的构成:主机,用户,任务

比如:

- hosts: mygroup
  remote_user: root
  tasks:
    - name: disable selinux
      command: /sbin/setenforce 0

hosts: 后面给出的是目标主机的名字或inventory文件中的主机组名,remote_user就是使用哪个用户执行task,tasks是任务列表,形式一般是名字+具体任务。

具体任务一般是模块名+模块参数,比如上面例子中command就是一个模块,ansible预先定义了很多使用的模块,具体列表和条用方法可以参见:

http://docs.ansible.com/ansible/list_of_all_modules.html

用户也可以自己写模块,我们后续再研究吧,一口没法吃成胖子啊。

playbook执行的方法:# ansible-playbook <playbook文件名>

Playbook的理论只是还有很多,其实有很多人都已经写过相关的文章,大家可以baidu或google,最权威的介绍:

http://docs.ansible.com/ansible/playbooks.html

prepare_emagent.yml

为了满足前面提到的需求,学习研究了好久,写成了这个playbook文件:

# cat prepare_emagent.yml 
- name: prepare em agent 
  hosts: mygroup
  remote_user: root
  gather_facts: yes
  vars:
     mypassword: '$6$rounds=656000$GgYWhqVPEO30bj9k$pANNLPscsN5rOxlG8gTvfiv.kGAb3EgUgkTPeGMWBTM3u.P5MhKQTTZtuSVIbtCb2Y2b2RE9kq/eaUPapLC.G1'
  tasks:
   - name: modify requiretty in sudoers
     lineinfile: dest=/etc/sudoers regexp='^Defaults(\s+)requiretty' line='Defaults   !requiretty' backrefs=yes state=present
   - name: modify visiblepw in sudoers
     lineinfile: dest=/etc/sudoers regexp='^Defaults(\s+)!visiblepw' line='Defaults   visiblepw' backrefs=yes state=present
   - name: add oracle to sudoers
     lineinfile: dest=/etc/sudoers line='oracle ALL=(ALL) ALL' state=present
   - name: disable firewalld
     raw: systemctl disable firewalld
   - name: stop firewalld
     raw: systemctl stop firewalld
   - name: create dba group
     group: name=dba state=present
   - name: create oracle user
     user: name=oracle password={{mypassword}} group=dba
   - name: add self name in /etc/hosts
     lineinfile: dest=/etc/hosts line='{{ansible_default_ipv4.address}}\t{{ansible_hostname}}.hthorizon.com\t{{ansible_hostname}}'
   - name: add OMS name in /etc/hosts
     lineinfile: dest=/etc/hosts line='192.168.0.39\tem13c.hthorizon.com\tem13c' state=present

下面逐条介绍:

hosts:

后面就是inventory文件中的组名,inventory文件内容:

# cat /etc/ansible/hosts
[mygroup]
192.168.0.40
192.168.0.41

gather_facts: yes

代表收集主机配置信息,这些配置信息在后面可以引用,来实现每个主机不同的任务内容。

vars:

后面是定义的变量,在这里,我只定义了一个变量,就是创建用户的passwd,为了方便,一般在使用ansible创建用户时,是直接用加密后的口令字符串更新shadow文件,当然这个是user模块完成的,我们不用操心细节。当然,为了生成这个加密的口令,我们需要按照http://docs.ansible.com/ansible/faq.html#how-do-i-generate-crypted-passwords-for-the-user-module的指示,安装passlib,下载地址:https://pypi.python.org/pypi/passlib

安装好passlib后,使用下面的命令生成加密的口令,命令会提示你输入口令,然后返回加密后的字符串。

python -c “from passlib.hash import sha512_crypt; import getpass; print sha512_crypt.encrypt(getpass.getpass())”

下面是我使用这个命令生成的加密后的口令字符串:

$6$rounds=656000$GgYWhqVPEO30bj9k$pANNLPscsN5rOxlG8gTvfiv.kGAb3EgUgkTPeGMWBTM3u.P5MhKQTTZtuSVIbtCb2Y2b2RE9kq/eaUPapLC.G1

这个也就是变量mypassword的值。

tasks:

这后面就是具体的任务了,每个任务都是name,模块名+模块参数组成。语法要求很严格,不能有没必要的空格,缩进也很关键。

具体的语法我就不解释了,在官网都能查到,我只说几个关键点:

  1. lineinfile: dest=/etc/sudoers regexp=’^Defaults(\s+)requiretty’ line=’Defaults !requiretty’ backrefs=yes state=present , 这行里面regexp的正则表达式中,(\s+)代表任意多个空格符;backrefs=yes和state=present是配合使用的,如果找不到符合正则表达式的字符串,那么也不添加line后面的内容,否则当这个playbook多次执行时,因为除了第一次外,后续都找不到符合正则表达式的字符串,就会每次执行,都在文件尾部增加一行line的内容。
  2. lineinfile: dest=/etc/sudoers line=’oracle ALL=(ALL) ALL’ state=present,如果是增加行,不需要写regexp
  3. lineinfile: dest=/etc/hosts line='{{ansible_default_ipv4.address}}\t{{ansible_hostname}}.hthorizon.com\t{{ansible_hostname}}’,ansible_defualt_ipv4.address, ansible_hostname是变量,它们的值是前面gather_facts控制收集的配置信息,在这里直接引用变量,如果想得到所有配置信息及变量名,可以执行:ansible 192.168.0.40 –m setup
    另外,在这里之所以不用ansible_fqdn,而直接用ansible_hostname,是因为ansible_fqdn是由/etc/hosts文件内容决定的,我们没配置/etc/hosts文件之前,ansible_fqdn的信息是不正确的。
  4. lineinfile: dest=/etc/hosts line=’192.168.0.39\tem13c.hthorizon.com\tem13c’ state=present, \t代表tab符。

执行playbook

下面是执行这个playbook的输出:

[root@em13c ansible]# ansible-playbook prepare_emagent.yml

PLAY [prepare em agent] ********************************************************

TASK [setup] *******************************************************************
ok: [192.168.0.40]
ok: [192.168.0.41]

TASK [modify requiretty in sudoers] ********************************************
ok: [192.168.0.40]
ok: [192.168.0.41]

TASK [modify visiblepw in sudoers] *********************************************
ok: [192.168.0.41]
ok: [192.168.0.40]

TASK [add oracle to sudoers] ***************************************************
ok: [192.168.0.40]
ok: [192.168.0.41]

TASK [disable firewalld] *******************************************************
changed: [192.168.0.41]
changed: [192.168.0.40]

TASK [stop firewalld] **********************************************************
changed: [192.168.0.41]
changed: [192.168.0.40]

TASK [create dba group] ********************************************************
ok: [192.168.0.40]
ok: [192.168.0.41]

TASK [create oracle user] ******************************************************
ok: [192.168.0.40]
ok: [192.168.0.41]

TASK [add self name in /etc/hosts] *********************************************
ok: [192.168.0.41]
ok: [192.168.0.40]

TASK [add OMS name in /etc/hosts] **********************************************
ok: [192.168.0.40]
ok: [192.168.0.41]

PLAY RECAP *********************************************************************
192.168.0.40 : ok=10 changed=2 unreachable=0 failed=0
192.168.0.41 : ok=10 changed=2 unreachable=0 failed=0

因为多次执行,状态changed代表配置/修改完成,状态 ok代表修改已经做过了,所以就不重复做了,

“推送” EM13c agent

不详细解释了,直接上图:

Comments are closed.