ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible是基于模块工作的,本身没有批量部署的能力。
不错的文章: http://blog.51cto.com/191226139/2066936
一、安装ansible: yum install ansible -y
配置hosts:/etc/ansible/hosts
# test on es-si-os-ohn-81
[test]
10.181.132.203
10.181.133.81
10.181.133.86
将公钥写入被管理机:
ssh-copy-id -i .ssh/id_rsa.pub root@10.181.133.86
将.ssh/id_rsa.pub的内容拷贝到10.181.133.86服务器的.ssh/authorized_keys里面
测试ansible:
[root@alice-test-ansible ~]# ansible test -m ping
10.181.133.81 | SUCCESS => {
"changed": false,
"ping": "pong"
}
10.181.133.86 | SUCCESS => {
"changed": false,
"ping": "pong"
}
10.181.132.203 | SUCCESS => {
"changed": false,
"ping": "pong"
}
二、ansible模块
1. ansible远程命令模块command、script、shell
1)command 作为 Ansible 的默认模块,可以运行远程权限范围所有的 shell 命令,不支持管道符。
[root@alice-test-ansible ~]# ansible test -m command -a "free -m" # 查看test分组主机内存使用情况
10.181.133.81 | SUCCESS | rc=0 >>
total used free shared buff/cache available
Mem: 88619 707 87605 24 306 87283
Swap: 0 0 010.182.65.169 | SUCCESS | rc=0 >>
total used free shared buff/cache available
Mem: 145068 1920 710 96 142436 141929
2)script 的功能是在远程主机执行主控端存储的 shell 脚本文件,相当于 scp + shell 组合。
[root@alice-test-ansible ~]# ansible test -m script -a "a.sh " #远程执行本地文件,a.sh在主控端
10.181.132.203 | SUCCESS => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 10.181.132.203 closed.\r\n",
"stderr_lines": [
"Shared connection to 10.181.132.203 closed."
],
"stdout": "test script module\r\n",
"stdout_lines": [
"test script module"
]
}
3)shell 的功能是执行远程主机上的 shell 脚本文件,支持管道符。
ansible test -m shell -a "/home/a.sh" #远程执行脚本,a.sh脚本在所有的远程主机上。
2. copy 模块(实现主控端向目标主机拷贝文件,类似于 scp 功能)
#拷贝Master服务器上/root/a.sh 到远程主机的/root/test/目录,这个目录必须已经存在
ansible test -m copy -a "src=/root/a.sh dest=/root/test/ "
#指定属主和组,以及权限
ansible test -m copy -a "src=/root/a.sh dest=/root/test/ owner=root group=root mode=0755"
3. yum 模块(软件包管理)
ansible test -m yum -a "name=curl state=latest" #安装最新版本的curl
ansible test81 -m yum -a "name=python36"
4. mount 模块(远程主机分区挂载)
ansible test -m mount -a "name=/mnt/ltesdkroot src=hz11.china.nsn-net.net:/vol/ltesdkroot fstype=nfs opts=rw state=present"
ansible test81 -m mount -a "name=/build/ltesdk src=hzchon11tesdkroot fstype=nfs opts=rw state=mounted"
4种state解释:
present:只更新/etc/fstab 文件,但不执行mount命令
mounted:更新/etc/fstab文件,创建dest目录, 执行mount命令
unmounted:不更新/etc/fstab文件,只执行unmount命令
absent:删除/etc/fstab文件中条目,删除dest目录,执行unmount命令
5. service 模块(远程主机系统服务管理)
ansible test -m service -a "name=nginx state=stoped" ansible test -m service -a "name=nginx state=restarted" ansible test -m service -a "name=nginx state=reloaded"
6. get_url 模块(实现在远程主机下载指定 URL 到本地,支持 sha256sum 文件校验)
ansible test -m get_utl -a "url=http://www.baidu.com dest=/tmp/index.html mode=0440 force=yes"
7. user 服务模块(远程主机用户管理)
ansible test81 -m user -a "name=alice" # 创建alice用户 ansible test81 -m user -a "name=wang comment='user wang'" # 更新用户信息 ansible test81 -m user -a "name=wang state=absent remove=yes" # 删除用户以及相关的目录
8. cron 模块(远程主机 crontab 配置)
ansible test -m cron -a "name='check dirs' hour='5,2' job='ls -alh > /dev/null'"
9. stat 模块(获取远程文件状态信息,atime/ctime/mtime/md5/uid/gid 等信息)
ansible test -m stat -a "path=/etc/fstab"
三、Ansible-playbook
使用 Ansible-playbook 可以完成一组复杂的动作,例如部署环境、搭建服务、修改配置等
# hosts 指定执行操作主机 # remote_user 指定执行用户 # tasks 指明有哪些动作 # name 动作描述 # shell 模块,后面为具体指令
简单示例:
# vi /etc/ansible/playbook.yml 在test远程主机上,将服务器的内存信息保存到info.txt文件中
- hosts: test
remote_user: root
tasks:
- name: Save Memory To info.txt
shell: "free -m > ~/info.txt"# ansible-playbook /etc/ansible/playbook.yml
PLAY [test] ****************************************************************************************************************************************************************
TASK [Gathering Facts] *****************************************************************************************************************************************************
ok: [10.181.132.203]
ok: [10.181.133.86]
TASK [Save Memory To info.txt] *********************************************************************************************************************************************
changed: [10.181.132.203]
changed: [10.181.133.86]PLAY RECAP *****************************************************************************************************************************************************************
10.181.132.203 : ok=2 changed=1 unreachable=0 failed=0
10.181.133.86 : ok=2 changed=1 unreachable=0 failed=0
一般使用框架:
## 建立 files 目录,用于存放将要拷贝到远程主机的安装包等 ## 建立 tasks 目录,用于编写将要执行的任务 ## 建立 templates 目录,用于存放可变的模板文件,比如某种条件下变量的值不一样 ## 建立 vars 目录,用于存放变量信息
# tree /etc/ansible
|-- ansible.cfg
|-- a_playbook.yml
|-- hosts
|-- playbook.yml
|-- roles
| |-- memory_check
| | |-- files
| | |-- tasks
| | | `-- main.yml #这里文件名字必须是main.yml,否则会报错
| | |-- templates
| | `-- vars
| | `-- main.yml #这里文件名必须是main.yml,否则会报错;这里定义的变量可用于tasks/main.yml({{ var_name }})
|-- test_memory_check.yml# ansible-playbook /etc/ansible/test_memory_check.yml
# cat test_memory_check.yml
- hosts: test #定义主机组
roles:
- memory_check #定义角色# cat roles/memory_check/tasks/main.yml
- name: Save Memory To info.txt
shell: "free -m > ~/{{ filename }}"
- name: copy file a
copy: src=a dest=~/b # 文件a存放在/etc/ansible/roles/memory_check/files/目录下# cat roles/memory_check/vars/main.yml
filename: info.txt