Ansible 学习笔记1

07/06/2017 | | Post a Comment

1、Ansible的安装

可以选择源码安装和rpm 安装,个人建议使用rpm安装,因为本人源码安装的时候报错,使用源码安装得到的命令报了一些莫名其妙的错误,索性就换成rpm,也没有细究报错的原因。当然,我也写下如何源码安装:

源码安装:

无论源码安装还是rpm安装都需要安装这几个依赖包:

[root@node3 ~]# yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto

Installed:
ansible.noarch 0:2.3.1.0-1.el6

Dependency Installed:
python-crypto2.6.x86_64 0:2.6.1-2.el6 python-httplib2.noarch 0:0.7.7-1.el6 python-jinja2-26.noarch 0:2.6-3.el6
python-keyczar.noarch 0:0.71c-1.el6 python-pyasn1.noarch 0:0.0.12a-1.el6 python-simplejson.x86_64 0:2.0.9-3.1.el6
python-six.noarch 0:1.9.0-2.el6 sshpass.x86_64 0:1.06-1.el6

Complete!

  • 源码安装,得到源码包,下载链接:http://releases.ansible.com/ansible/;

[root@node3 ~]# tar xf ansible-2.2.1.0.tar.gz -C /usr/local/
[root@node3 ~]# cd /usr/local/ansible-2.2.1.0/
[root@node3 ansible-2.2.1.0]# ls
ansible build contrib dist examples Makefile packaging README.md setup.py
bin CHANGELOG.md COPYING docs lib MANIFEST.in PKG-INFO setup.cfg VERSION
[root@node3 ansible-2.2.1.0]# python setup.py build
[root@node3 ansible-2.2.1.0]# python setup.py install

[root@node3 ansible-2.2.1.0]# mkdir /etc/ansible

[root@node3 ansible-2.2.1.0]# cp examples/* /etc/ansible

  • rpm安装,得到epel源,下载链接:http://dl.fedoraproject.org/pub/epel/6/x86_64/

找到和ansible相关rpm包,在本机安装之后,执行yum install ansible 即可;

2、Ansible的使用

Ansible的使用我这里只介绍简单最基本的使用方法,Ansible的功能很强大,使用方法也很多样,详细请参考官方文档,或者网上其他相关博客。

首先要确定管理主机的范围,我们在hosts文件里创建一个名为testserver的主机群组,之后的实验使用这个群组.

[root@localhost ~]# tail -5 /etc/ansible/hosts

[testserver]
10.64.13.141
10.64.13.142
10.64.13.116

ansible语法:

ansible <host-pattern> [-f forks] [-m module_name] [-a args]  //  -m module:默认为command

主要命令

[root@localhost ~]# ansible-doc -l

//通过这个命令可以查看Ansible主要支持的模块选项,选项众多,根据自己需要进行查找选择

[root@localhost ~]# ansible-doc -s Module_Name

//找到自己所需要的模块之后,可以根据这个命令对模块的使用方法进行查看

示例:

1、检查hosts文件里的主机是否在线:

[root@localhost ~]# ansible all -m ping
10.64.13.142 | SUCCESS => {
“changed”: false,
“ping”: “pong”
}
10.64.13.141 | SUCCESS => {
“changed”: false,
“ping”: “pong”
}
10.64.13.116 | SUCCESS => {
“changed”: false,
“ping”: “pong”
}

2、检查testserver群组里主机的时间是否一致:

[root@localhost ~]# ansible testserver -a ‘date’
10.64.13.142 | SUCCESS | rc=0 >>
Wed Jul 5 13:59:46 CST 2017

10.64.13.141 | SUCCESS | rc=0 >>
Wed Jul 5 13:59:46 CST 2017

10.64.13.116 | SUCCESS | rc=0 >>
Wed Jul 5 13:59:47 CST 2017

3、与时间服务器同步时间:

[root@localhost ~]# ansible testserver -a ‘ntpdate time.windows.com’
10.64.13.141 | SUCCESS | rc=0 >>
5 Jul 14:01:13 ntpdate[25234]: step time server 13.65.245.138 offset 0.515832 sec

10.64.13.142 | SUCCESS | rc=0 >>
5 Jul 14:01:13 ntpdate[7969]: step time server 13.65.245.138 offset 0.508768 sec

10.64.13.116 | SUCCESS | rc=0 >>
5 Jul 14:01:19 ntpdate[38077]: adjust time server 13.65.245.138 offset -0.016024 sec

4、为testserver添加mysql系统组://-m 省略时默认为 -m command

[root@localhost ~]# ansible testserver -m group -a “gid=505 name=mysql system=yes”
10.64.13.142 | SUCCESS => {
“changed”: true,
“gid”: 505,
“name”: “mysql”,
“state”: “present”,
“system”: true
}
…略

5、将本地/etc/hosts文件复制至testserver中

[root@localhost ~]# ansible testserver -m copy -a ‘src=/etc/hosts dest=/etc/hosts’
10.64.13.142 | SUCCESS => {
“changed”: false,
“checksum”: “809e82866dacc36068ccaede36caf9f89c9511c5”,
“dest”: “/etc/hosts”,
“gid”: 0,
“group”: “root”,
“mode”: “0644”,
“owner”: “root”,
“path”: “/etc/hosts”,
“secontext”: “system_u:object_r:net_conf_t:s0”,
“size”: 215,
“state”: “file”,
“uid”: 0
}
…略

6、远程安装corasync软件

[root@localhost ~]# ansible testserver -m yum -a ‘state=latest name=corosync’

//可以使用ansible-doc -s yum查询yum模块的使用方法

3、Playbooks

以下playbooks的文档是摘抄他人笔记,写的比较全面就直接复制过来了。

playbooks是由一个或多个“play”组成的列表。play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓task无非是调用ansible的一个module。将多个play组织在一个playbook中,即可以让它们联同起来按事先编排的机制同唱一台大戏。下面是一个简单示例。

注意:tasks下面的参数可以根据ansible-doc -s paramater来查询相关选项和使用方法

– hosts: webnodes
vars:
http_port: 80
max_clients: 256
remote_user: root
tasks:
– name: ensure apache is at the latest version
yum: name=httpd state=latest
– name: ensure apache is running
service: name=httpd state=started

handlers:
– name: restart apache
service: name=httpd state=restarted
可以将handlers替换为notify,通过notify调用handlers
notify:
– restart apache
handlers:
– name: restart apache
service: name=httpd state=restarted

3.1 playbook基础组件

3.1.1 Hosts和Users

playbook中的每一个play的目的都是为了让某个或某些主机以某个指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,其可以是一个或多个由冒号分隔主机组;remote_user则用于指定远程主机上的执行任务的用户。如上面示例中的
-hosts: webnodes
remote_user: root

不过,remote_user也可用于各task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户。

– hosts: webnodes
remote_user: mageedu
tasks:
– name: test connection
ping:
remote_user: mageedu
sudo: yes

5.1.2 任务列表和action

play的主体部分是task list。task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。在运行自下而下某playbook时,如果中途发生错误,所有已执行任务都将回滚,因此,在更正playbook后重新执行一次即可。

task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致。

每个task都应该有其name,用于playbook的执行结果输出,建议其内容尽可能清晰地描述任务执行步骤。如果未提供name,则action的结果将用于输出。

 

在众多模块中,只有command和shell模块仅需要给定一个列表而无需使用“key=value”格式,例如:
tasks:
– name: disable selinux
command: /sbin/setenforce 0

如果命令或脚本的退出码不为零,可以使用如下方式替代:
tasks:
– name: run this command and ignore the result
shell: /usr/bin/somecommand || /bin/true

或者使用ignore_errors来忽略错误信息:
tasks:
– name: run this command and ignore the result
shell: /usr/bin/somecommand
ignore_errors: True

3.1.3 handlers

用于当关注的资源发生变化时采取一定的操作。

“notify”这个action可用于在每个play的最后被触发,这样可以避免多次有改变发生时每次都执行指定的操作,取而代之,仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作称为handler,也即notify中调用handler中定义的操作。
– name: template configuration file
template: src=template.j2 dest=/etc/foo.conf
notify:
– restart memcached
– restart apache

handler是task列表,这些task与前述的task并没有本质上的不同。
handlers:
– name: restart memcached
service: name=memcached state=restarted
– name: restart apache
service: name=apache state=restarted

案例:
heartbeat.yaml
– hosts: hbhosts
remote_user: root
tasks:
– name: ensure heartbeat latest version
yum: name=heartbeat state=present
– name: authkeys configure file
copy: src=/root/hb_conf/authkeys dest=/etc/ha.d/authkeys
– name: authkeys mode 600
file: path=/etc/ha.d/authkeys mode=600
notify:
– restart heartbeat
– name: ha.cf configure file
copy: src=/root/hb_conf/ha.cf dest=/etc/ha.d/ha.cf
notify:
– restart heartbeat
handlers:
– name: restart heartbeat
service: name=heartbeat state=restarted

参考文档:Ansible中文权威指南

 



Want to say something? Post a comment

电子邮件地址不会被公开。 必填项已用*标注