ansible是个什么东西呢?基于 Python paramiko 开发,分布式,无需客户端,轻量级,配置语法使用 YMAL 及 Jinja2模板语言,更强的远程命令执行操作。这个工具的目标有这么几项:
自动化部署APP;自动化管理配置项;
自动化的持续交互;
自动化的(AWS)云服务管理。
所有的这几个目标从本质上来说都是在一个台或者几台服务器上,执行一系列的命令而已。
通俗的说就是批量的在远程服务器上执行命令 。
当然,最主要的是它是基于 paramiko 开发的。
这个paramiko是什么呢?它是一个纯Python实现的ssh协议库。
因此fabric和ansible还有一个共同点就是不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。
• ansible提供的框架
利用yum 安装ansible,要求系统的python要是2.6以上
安装ansible1.1
需要在ansible服务器上安装一下epel外部源,可以使用阿里云的源:
更新源的方法:
好了,其实到这里,就已经更新完毕了。
如果想全部改成阿里云的源,可以按照下面的方法进行。进行前请先将自己的源做一下备份。
. rm -rf /etc/yum.repos.d/* (执行此操作的时候记得事先装好wget 不然 你就得挂载光盘用rpm装wget了。)
wget -P http://mirrors.aliyun.com/repo/epel-6.repo http://mirrors.aliyun.com/repo/Centos-6.repo
这个时候,执行 yum repolist的结果如下
[root@zhang ~]# yum repolist
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* epel: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
yum install -y ansible
执行ssh-keygen -t rsa
服务器的~/.ssh/id_rsa.pub追加进~/.ssh/authorized_keys 都追加进去
cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.80.129
如果ssh的端口不是22,可用下面命令
ssh-copy-id -i ~/.ssh/id_rsa.pub "-p 23 jifeng@jifeng03"
1、创建公钥
[root@jacken ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): "回车"
Enter passphrase (empty for no passphrase):
Enter same passphrase again: "回车"
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
64:f3:67:a7:8e:11:d8:b1:fc:7d:34:f4:57:0d:e3:86 root@jacken
The key's randomart image is:
+--[ RSA 2048]----+
| o |
| o o.|
| + . E o.o|
| o * o .. o|
| S * o ..+|
| = + .o|
| . o . .|
| + . |
| . . |
+-----------------+
[root@jacken ~]#
2、复制公钥到服务器并被信任
[root@jacken ~]# ssh-copy-id [email protected]
[email protected]'s password:
Now try logging into the machine, with "ssh '[email protected]'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
如下:
ssh ceshi@192.168.80.129
说明 ssh免密码可以正常使用。
Ansible all -m ping
【本身是需要登陆普通账号,不可以直接登陆root账号,而且同时呢,普通账号 需要有sudo的权限】
我们需要在 ansible的hosts里面 添加
添加的形式和上面格式 一致
备注:【当然也可以不填写密码,之后手动再次输入密码】
ANSIBLE PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置 文件,由Ansible顺序依次执行,通常是JSON格式的YML文件
- INVENTORY:Ansible管理主机的清单/etc/anaible/hosts
- MODULES:Ansible执行命令的功能模块,多数为内置核心模块,也可自定义 - - PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插 件等,该功能不常用
- API:供第三方程序调用的应用程序编程接口
- ANSIBLE:组合INVENTORY、API、MODULES、PLUGINS的绿框,可以理解 为是ansible命令工具,其为核心执行工具
USER,普通用户,即SYSTEM ADMINISTRATOR
CMDB(配置管理数据库) API 调用
PUBLIC/PRIVATE CLOUD API调用
USER-> Ansible Playbook -> Ansibile
利用ansible实现管理的方式:
Ad-Hoc 即ansible命令,主要用于临时命令使用场景
Ansible-playbook 主要用于长期规划好的,大型项目的场景,需要有前期 的规划过程
将已有编排好的任务集写入Ansible-Playbook
通过ansible-playbook命令分拆任务集至逐条ansible命令,按预定规则逐 条执行 Ansible主要操作对象
HOSTS主机
NETWORKING网络设备
注意事项
执行ansible的主机一般称为主控端,中控,master或堡垒机
主控端Python版本需要2.6或以上
被控端Python版本小于2.4需要安装python-simplejson
被控端如开启SELinux需要安装libselinux-python
windows不能做为主控端
ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以 在inventory file中将其分组命名
默认的inventory file为/etc/ansible/hosts
inventory file可以有多个,且也可以通过Dynamic Inventory来动态生成
inventory文件遵循INI文件风格,中括号中的字符为组名。可以将同一个主机 同时归并到多个不同的组中;此外,当如若目标主机使用了非默认的SSH端口, 还可以在主机名称之后使用冒号加端口号来标明
[webservers]
www1.test.com:3333
www2.test.com
[dbservers]
db1.test.com
还可以使用列表的方式标识各主机
示例:
[websrvs]
www[01:100].example.com
Ansible 配置文件/etc/ansible/ansible.cfg (一般保持默认)
[defaults]
#inventory = /etc/ansible/hosts # 主机列表配置文件
#library = /usr/share/my_modules/ # 库文件存放目录
#remote_tmp = $HOME/.ansible/tmp #临时py命令文件存放在远程主机目录
#local_tmp = $HOME/.ansible/tmp # 本机的临时命令执行目录
#forks = 5 # 默认并发数
#sudo_user = root # 默认sudo 用户
#ask_sudo_pass = True #每次执行ansible命令是否询问ssh密码
#ask_pass = True #remote_port = 22
#host_key_checking = False # 检查对应服务器的host_key,建议取消注释 #log_path=/var/log/ansible.log #日志文件
#module_name = command #默认模块
具体的命令有:
ansible ansible-doc ansible-playbook ansible-vault ansible-console ansible-galaxy ansible-pull
ansible-doc [options] [module...]
-a 显示所有模块的文档
-l, --list 列出可用模块
-s, --snippet显示指定模块的playbook片段
示例:
ansible-doc -l 列出所有模块
ansible-doc ping 查看指定模块帮助用法
ansible-doc -s ping 查看指定模块帮助用法
ansible -pattern> [-m module_name] [-a args]
**--version 显示版本
-m module 指定模块,默认为command
-v 详细过程 –vv -vvv更详细
--list-hosts 显示主机列表,可简写 --list
-k, --ask-pass 提示输入ssh连接密码,默认Key验证
-C, --check 检查,并不执行
-T, --timeout=TIMEOUT 执行命令的超时时间,默认10s -u, --user=REMOTE_USER 执行远程执行的用户
-b, --become 代替旧版的sudo 切换
--become-user=USERNAME 指定sudo的runas用户,默认为root
-K, --ask-become-pass 提示输入sudo时的口令**
ansible srv -m copy -a “src=/root/f1.sh dest=/tmp/f2.sh owner=wang mode=600 backup=yes” 如目标存在,默认覆盖,此处指定先备份
ansible srv -m copy -a “content=‘test content\n’ dest=/tmp/f1.txt” 指定内容,直接生成目标文件
和copy相反,目录可先tar
ansible srv -m fetch -a ‘src=/root/a.sh dest=/data/scripts’
ansible srv -m file -a "path=/root/a.sh owner=wang mode=755“
ansible web -m file -a ‘src=/app/testfile dest=/app/testfile-link state=link’
ansible node1 -m hostname -a “name=websrv”
支持时间:minute,hour,day,month,weekday
ansible srv -m cron -a “minute=*/5 job=‘/usr/sbin/ntpdate 172.16.0.1 &>/dev/null’ name=Synctime” 创建任务
ansible srv -m cron -a ‘state=absent name=Synctime’ 删除任务
ansible srv -m yum -a ‘name=httpd state=present’ 安装
ansible srv -m yum -a ‘name=httpd state=absent’ 删除
ansible srv -m service -a 'name=httpd state=stopped'
ansible srv -m user -a 'name=user1 comment=“test user” uid=2048 home=/app/user1 group=root‘
ansible srv -m group -a "name=testgroup system=yes“
playbooks是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活。简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。Playbook可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式。值得注意的是playbook是通过YAML格式来进行描述定义的。
核心元素
Tasks:任务,由模板定义的操作列表
Variables:变量
Templates:模板,即使用模板语法的文件
Handlers:处理器 ,当某条件满足时,触发执行的操作
Roles:角色
hosts和users介绍
在playbook中的每一个play都可以选择在哪些服务器和以什么用户完成,hosts一行可以是一个主机组、主机、多个主机,中间以冒号分隔,
可使用通配模式。其中remote_user表示执行的用户账号。
运行playbook的方式 ansible-playbook
常见选项
–check -C 只检测可能会发生的改变,但不真正执行操作
–list-hosts 列出运行任务的主机 --list-tags 列出tag
–list-tasks 列出task --limit 主机列表 只针对主机列表中的主机执行
-v -vv -vvv 显示过程
示例 ansible-playbook file.yml --check 只检测
ansible-playbook install_httpd.yml
ansible-playbook install_httpd.yml --limit webserver
例子:
install_httpd.yml
- hosts: all
tasks:
- name: "安装Apache"
yum: name=httpd
- name: "复制配置文件"
copy: src=/www/httpd.conf dest=/etc/httpd/conf/
- name: "复制配置文件"
copy: src=/www/vhosts.conf dest=/etc/httpd/ conf.cd/
- name: "启动Apache,并设置开机启动"
service: name=httpd state=started enabled=yes