====== ansible ======
ansible是新出现的运维工具是基于Python研发的糅合了众多老牌运维工具的优点实现了批量操作系统配置、批量程序的部署、批量运行命令等功能。
----
====== 安装 ======
- yum install ansible
====== 注意事项 ======
- 被管理的服务器需要安装python2.4以上的版本。如果版本是2.5一下还需额外安装python-simplejson(centos5.x),centos6没有问题
----
====== 关键配置文件 ======
* /etc/ansible/ansible.cfg # ansible主配置文件
* /etc/ansible/hosts #主机列表
[lan] #组名
10.0.2.220 ansible_ssh_user=root #没有指定密码默认用ssh密钥登录
10.0.2.178 ansible_ssh_user=root
10.0.1.[179:180] ansible_ssh_user=root #指定ip范围
[local_host] #组名
10.0.2.220 ansible_ssh_user=root ansible_ssh_pass=****** #指定帐号密码登录
[local:children] #父组
local_1
local_2
[local_2] #子组
10.0.2.178 ansible_ssh_user=root
[local_1] #子组
10.0.1.179 ansible_ssh_user=root
----
====== 最佳配置 ======
host_key_checking = False #如果用ssh验证,且服务器重装系统之后,会因为服务器的ssh key与本机的known_hosts文件中内容不同,而引发生错。这个参数的作用是不去check本机的known_hosts文件
----
====== 基本用法 ======
ansible -i 清单文件 目标组 -m 模块名 -a 传递给模块的参数
* 主机列表文件用俩描述主机的清单文件。如果不指定这个参数,使用默认清单文件,一般情况下在/etc/ansible/hosts
* 清单文件可以使用正则表达式,如上面的local*。
* 目标组是指清单文件中的组,组用来管理同一类型的多台服务器
* 模块是每个功能的划分,有shell(执行命令)cope(远程copy)等模块
* 模块可以通过 ansible-doc -l 命令来查询
* 参数的作用是告诉模块具体要干什么
下面是一些常用模块的使用方法:
- 安装软件:ansible local -m apt -a ‘name=gcc state=present’或者ansible local -m yum -a “name=nmap state=installed”
- 执行命令:ansible local -m shell -a ‘uptime’
- 拷贝文件:ansible local -m copy -a “src=/tmp/server dest=/tmp/server”
- 文件属性:ansible local -m file -a “dest=/tmp/server mode=755 owner=root group=root”
----
====== 主机匹配 ======
* all : 匹配inventory文件中所有主机
* 主机名 : 指定inventory文件中某台主机
* 组名 : 指定分组下所有主机,多个组之间用:分隔
* abc* : 匹配所有以abc开头的所有组和主机
----
====== playbook ======
* 我的第一个playbook
---
- hosts: local
remote_user: root
tasks:
- name: first
shell: echo "first" >> file.fang
notify:
- fang #第一次触发任务fang
- name: second
shell: echo "second" >>file.fang
notify:
- fang #第二次触发任务fang
handlers:
- name: fang #但是最终只执行一次
shell: echo "fang" >> file.fang
=== ansible-playbook fang.yml #执行playbook ===
=== cat file.fang #登录服务器,查看执行结果 ===
first
second
fang
----
执行playbook前用ansible-playbook fang.yml --list-hosts命令查看会被影响的主机列表
===== role 例子 =====
虽然叫role,其实更准确的说法应该是子任务。role之间还可以有依赖关系。更多见:http://docs.ansible.com/playbooks_roles.html
目录结构
├── first.yml
├── foo.yml
├── hosts.file
└── roles
├── ro1
│ └── tasks
│ ├── init.yml
│ └── main.yml
first.yml
---
- hosts: local
remote_user: root
tasks:
- include: foo.yml # 包含其他yml文件
- name: first
shell: echo "first" >> file.fang
roles: # 优先于tasks执行
- ro1 # 自include ./roles/ro1/tasks/main.yml文件(描素task)
# 同理,会自动include ./roles/ro1/vars/main.yml文件(描素变量)
foo.yml
- name: foo
shell: echo "include" >> file.fang
roles/ro1/tasks/main.yml
- include: init.yml # 包含其他yml文件
tags: # 为这个任务设置标签
- init
- name: ro1
shell: echo "ro1" >> file.fang
tags: # 为这个任务设置标签
- main
roles/ro1/tasks/init.yml
- name: ro11
shell: echo "ro11" >> file.fang
* ansible-playbook first.yml # 正常调用
* ansible-playbook first.yml -i hosts.file -t init # -t 参数 指定tags为 init
* ansible-playbook first.yml -i hosts.file -t init,main #同时指定多个tags