
Ansible 学习笔记2–自动完成Oracle EM13c Agent安装前的主机配置工作
前言
我觉得学习一个工具,能够边学边用是最幸运的,因为这样印象深刻,如果用不上,只是学习网上的例子,估计过几天也就忘了。
Oracle Enterprise Manager 12c,13c在部署agent时,可以使用”push”方式进行,简单说,就是从EM Console发起一个任务,”push”软件介质,安装、配置全部自动完成。听起来挺不错,但是实际上,为了能够自动化、批量化完成这个agent deploy的工作,在需要安装agent的主机上还是要做一些琐碎的准备工作的,以前一直觉得机器多了很麻烦,但是也没啥好办法,现在学了ansible,就想试试看看用ansible能不能自动完成agent安装前的那些配置工作。
我们先看看为了安装agent,主机具体需要做哪些工作:
-
创建用户和组,一般组是dba,用户是oracle,如果主机已经部署了Oracle软件,这些应该都已经有了,但是很多时候,我们可能是在部署Oracle软件之前就要部署agent(比如使用EM13c自动部署Oracle软件的场景)
-
修改/etc/sudoers文件,修改其中的两个选项,并把安装agent的用户加进去,一般是oracle
-
关掉防火墙或增加防火墙规则
-
修改/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,模块名+模块参数组成。语法要求很严格,不能有没必要的空格,缩进也很关键。
具体的语法我就不解释了,在官网都能查到,我只说几个关键点:
-
lineinfile: dest=/etc/sudoers regexp=’^Defaults(\s+)requiretty’ line=’Defaults !requiretty’ backrefs=yes state=present , 这行里面regexp的正则表达式中,(\s+)代表任意多个空格符;backrefs=yes和state=present是配合使用的,如果找不到符合正则表达式的字符串,那么也不添加line后面的内容,否则当这个playbook多次执行时,因为除了第一次外,后续都找不到符合正则表达式的字符串,就会每次执行,都在文件尾部增加一行line的内容。
-
lineinfile: dest=/etc/sudoers line=’oracle ALL=(ALL) ALL’ state=present,如果是增加行,不需要写regexp
-
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的信息是不正确的。
-
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
不详细解释了,直接上图: