用户工具


ansible

ansible是新出现的运维工具是基于Python研发的糅合了众多老牌运维工具的优点实现了批量操作系统配置、批量程序的部署、批量运行命令等功能。


安装

  1. yum install ansible

注意事项

  1. 被管理的服务器需要安装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