目录
一、Ansible核心组件
二、Ansible配置
1.配置案例
(1)管理安装ansible
(2)管理机分发公匙
(3)配置管理
(4)测试连接
2.命令说明
三、playbook剧本编写
1.playbook模板
2.playbook剧本话管理
3.常用模块
4.文件管理
5.文件分发
6.处理程序(Handlers)
7.角色管理
8.事实
9.加密
一、Ansible核心组件
- Host Inventory模块:
定义ansible管理的主机,可以进行分组管理。
- Core Modules Ansible核心模块
ansible中模块就是用来指定对远程主机具体的操作,比如执行命令模块command、创建文件模块file等(ansible自带的模块)。
- Custom Modules自定义模块
如果黑犀牛模块不足以完成魔种功能呢就可以使用任何语言自定义模块。
- Connection Plugins连接插件
Ansible用来连接被管理端的一种方式,比如客户端运行了SSH服务,Ansible利用SSH服务跟客户端进行通信,Ansible是通过python编写的,而python有一个模块paramiko支持并行连接SSH,Ansible事实上就是使用paramiko进行连接被管理端。但是它还支持其他的连接方式需要插件(如zeroMQ就是C/S模式工作)。
- Plugins第三方插件支持
如email、logging模块,只要有Python编写能力就可以自行编写插件。
二、Ansible配置
1.配置案例
实验环境准备:
- 192.168.10.10 管理机 192.168.10.11 被管理机
- 目前只要机器上安装了python2.6或python2.7(windows系统不可以做控制主机),都可以运行Ansible。
- 主机的系统可以是Red Hat,Debian,CentOS,OS X,BSD的各种版本等等。
(1)管理安装ansible
yum -y install epel-release#ansible在epel扩展源中yum -y install ansible#安装ansible
(2)管理机分发公匙
ssh-keygen -t rsa -b 4096#生成密钥对ssh-copy-id root@192.168.10.11#将公钥传给被管理机
#编写批量化传公钥的脚本
yum -y install expect#安装expect,让脚本支持expect的命令,可以出发远程登录。vim send_isa_pub.sh#编写批量化传公钥的脚本#!/bin/bash
ip1=100
pwd=123456
while [ $ip1 -le 200 ];
doip=192.168.10.$ip1
expect << EOF
spawn ssh-copy-id root@$ip
expect {
"yes/no" {send "yes\n";exp_continue}
"password" {send "$pwd\n"}
}
export eof
EOFlet ip1=$ip1+1
done
(3)配置管理
cd /aetc/ansible
vim hosts#编辑主机管理文件
[web] #定义模块
# 设置管理的主机(被管理主机的IP地址)192.168.10.11
[local]127.0.0.1
[remote]192.168.10.11
(4)测试连接
ansible -i /etc/ansible/hosts --connection=local local -m ping# 测试本地连接,-i 指定主机文件;-m指定调用的命令模块;# --connection=local告诉ansible本机通信不需要通过SSH运行命令ansible -i /etc/ansible/hosts remote -m ping# 测试远程连接,-m后面跟调用的命令模块# 测试到 remote 模块的主机是否网络通畅
2.命令说明
命令:ansible
参数:-i /etc/ansible/hosts# --inventory=PATH# 指定库存文件,命名为hostsremote,local,all# 使用这个标签的下定义的服务器hosts清单文件# “all”是针对文件中定义的每个服务器运行的特殊关键字的。--private-key=PRIVATE_KEY_FILE_PATH# #使用指定路径的密匙建立认证连接-m shell# --module-path=DIRECTORY# 使用shell模块,它只是运行ping命令并返回结果。-a 'yum -y install httpd'# 用于将任何参数传递给 -m 指定的模块-c local或--connecion=local#在本地服务器上运行命令,而不是SSH。-b --become-user=root# 以用户“root”身份运行命令-u USERNAME --user=USERNAME# 指定移动端的执行用户-U SUDO_USERNAME --sudo-user=USERNAME-s --sudo# -u指定用户的时候,使用sudo获得root权限-k --ask-pass# 提示输入ssh的密码,而不是使用基于ssh的密钥认证-K --ask-sudo-pass# 提示输入sudo密码,与--sudo一起使用示例:ansible -i /etc/ansible/hosts web -b --become-user=root -m shell -a 'yum -y install httpd'# -i指定hosts文件(内有管理主机的IP)中的web组里的主机# -b指定以root用户执行后面的命令# -m指定shell模块(运行命令)# -a指定yum -y install httpd运行这个命令,并将这个参数传给shellansible -i ./hosts local --connection=local -b --become-user=root -m shell -a 'yum -y install nginx'# --connection=local对本机执行ansible -i ./hosts local remote -b --become-user=root -m shell -a 'yum -y install httpd'# 同时指定多个模块
三、playbook剧本编写
-
功能:剧本文件中可以写入多个执行项,并排列好执行顺序,一次性给客户执行
-
特点:剧本文件,必须按照yml语言编写,后缀必须是.yml
剧本中调用对应的模块(即程序段),实现对应的功能
1.playbook模板
mkdir /etc/ansible/playbook && cd /etc/ansible/playbookvim default.yml
- hosts: web #指定hosts文件里的web模块的主机become: yes #允许使用指定的用户身份去执行become_user: roottask: #针对web主机组执行的操作 - name: install httpd #定义一个任务名shell: #调用shell模块执行命令'yum -y install httpd'#command: 'yum -y install httpd' #等于shell模块-name: create web page file #创建网页文件shell:'echo "www.daboluo.com" > /var/www/html/index.html' -name: start httpd #定义一个任务名service: #服务name: httpd #服务名为httpdstate: restarted #指定服务状态重启ansible-playbook -i /etc/ansible/hosts /etc/ansible/playbook/default.yml# 指定主机文件/etc/ansible/hosts,剧本文件为/etc/ansible/playbook/default.yml
2.playbook剧本话管理
- 功能:制定被管主机服务,业务的部署方案,实现复杂配置
- 配置思路:
首先定义.yml文件,文件内容按ad-hoc格式编写
再用ansible-playbook -i ./hosts XXX.yml的方式调用运行剧本
- 模块化管理:
.yml文件中使用不同模块完成不同的配置功能
3.常用模块
tasks # 定义各种任务,.yml启动时执行,常用任务类型如下:command # 运行指定命令shell # 调用指定脚本file # 文件创建copy # 文件复制service # 服务管理yum # 软件安装handlers # 设定处理程序user # 用户模块group # 组模块
# command和shell的区别:
# command只能调用一条指令,不支持保留字;shell可以使用管道。
# 不支持别名命令
4.文件管理
# task任务中可设定file模块,创建文件或目录
file:path: '/mnt/d1'mode: 775state: directory
# 指定文件类型:touch文件,directory目录,link软连接,hard硬链接,absent删除文件owner: www-datagroup: www-data#src=/mnt/f1 # 若state=link/hard的时候,src来指定原文件#force=yes # 若创建软链接时,需要强制创建,则增加force=yes#recurse=yes # 若state=directory时,并且更改权限或所属的时候,需递归继承,增加此选项。
# 若文件/目录不存在,则创建;若文件/目录存在,则更改权限,所属。
参数详解:
-
state参数:文件需要将state的值设置为touch。软链接需要将state设置为link,硬链接需要将state设置为hard。删除文件时(删除时不用区分目标是文件、目录还是链接),需要将state的值设置为absent,“absent”为缺席之意,当我们想让操作的目标“缺席”时,就表示我们想要删除目标。
-
src参数:当state设置为link或hard时,表示我们想要创建一个软连接或硬链接,所以,我们必须知知名软连接或硬链接的那个文件,通过src参数即可指定链接源。
-
force参数:当state=link的时候,可以配合此参数强制创建链接文件,当force=yes时,表示强制创建链接文件。
-
recurse参数:当要操作的文件为目录,将recurse设置为yes,可以递归的修改目录中文件的属性。
示例:
vim test1.yml#编写剧本文件
- hosts: webbecome: yesbecome_user: roottasks:- name: chuang jian wen jianfile: #创建一个文件path=/mnt/f1 #文件的路径state=touch #状态为创建mode=644 #权限为644owner=root #所有者为rootgroup=root #所属组为rootansible-playbook -i /etc/ansible/hosts /etc/ansible/playbook/test1.yml
vim link-test.yml
- hosts: webbecome: yesbecome_user: roottasks:- name: an zhuang httpdfile: #创建一个文件path=/mnt/f1 #源文件的路径src=/mnt/f1 #软连接文件为f1state=link #创建软链接mode=644 #权限为644force=yes #如果已经存在,那就强制创建owner=root #所有者为rootgroup=root #所属组为rootansible-playbook -i /etc/ansible/hosts /etc/ansible/playbook/link-test.yml
5.文件分发
功能:从ansible服务器端分发文件给客户机
copy:
src=/mnt/f1 # 指定本机要分发出去的文件路径
dst=/mnt/ # 指定客户机上分发后存放的路径
# 复制文件- hosts: webbecome: yesbecome_user: roottasks:- name: testcopy:src=/mnt/f1
# 本机要分发出去的文件,src=/mnt表示把整个目录分发下去,src=/mnt/表示分发目录下所有内容dest=/mnt/ # 客户机上存放的路径mode=644 # 权限为644owner=root # 所有者为rootgroup=root # 所属组为rootansible-playbook -i /etc/ansible/hosts /etc/ansible/playbook/XXX.yml
# 复制多个文件
# 多个文件复制传到相同位置- hosts: testvars:filename: /mnt/f*become: yesbecome_user: roottasks:- name: start httpcopy:src={{item}} #占位符dest=/mnt/mode=755owner=rootgroup=rootwith_fileglob:"{{filename}}" #调用变量的值,将变量的值传给占位符ansible-playbook -i /etc/ansible/hosts /etc/ansible/playbook/XXX.yml
# 多个文件传到不同位置- hosts: testremote_user: rootgather_facts: falsebecome: yestasks:- name: "copy from target cpu"copy:src="{{item.src}}“ #占位符,src调用src项dest="{{item.dest}}" #占位符:dest调用dest项mode=755owner=rootgroup=root with_items:- {src:"/mnt/f1",dest:"/mnt"} #被调用变量- {src:"/mnt/f2",dest:"/var"} #被调用变量,给占位符传值ansible-playbook -i /etc/ansible/hosts /etc/ansible/playbook/XXX.yml# 使用变量支持保留字时,只针对批量文件分发有效,对批量目录的分发无效
# 添加用户或组- hosts: webremote_user: rootbecome: yestasks:- name: testuser:name: wang #创建名为wang的用户state: presentansible-playbook -i /etc/ansible/hosts /etc/ansible/playbook/XXX.yml
6.处理程序(Handlers)
处理程序与任务完全相同(它可以做task可以做的任何事),相当于一个函数,只是在剧本启动时不被执行,只有当另一个任务调用它时才会运行,您可以将其视为时间系统的一部分,处理程序将通过其侦听的时间调用进行操作。
这对于运行任务后可能需要的“辅助”操作非常有用,例如在配置更改后安装或重新加载服务后启动新服务。
功能:使用handlers模块,创建任务,但并不会被直接执行,实在任务中调用执行,类似于软件开发中欧给的函数功能。
注:使用notify关键字调用handlers程序,而且notify不可以独立完成任务,需要跟在其他任务后。
示例:
- hosts: webbecome: yesbecome_user: roottasks:- name: an zhuangyum:name: httpdstate: installednotify:jian wang ye #调用下方的handlers的执行的操作- name: qi fu wuservice:name: httpdstate: restartedhandlers: #被上面notify调用- name: jian wang yeshell:'echo "www.daboluo.com" > /var/www/html/index.html'ansible-playbook -i /etc/ansible/hosts /etc/ansible/playbook/XXX.yml
7.角色管理
-
角色的功能:
将剧本中需要定义的各个模块,如:handlers、files、变量等分别存放于不同的目录中,然后在task中组织任务部署的流程,方案。
-
角色的优点:
模块化、离散化编写复杂任务
可支持的功能比单个task文件较为丰富,如:可创建文件模板,便于某服务的配置文件的统一化配置
-
角色的创建:
ansible-galaxy init NFS-test #创建角色,角色名为NFS-test
cd /etc/ansible/rolesansible-galaxy init test #创建角色,命名为testcd files && mkdir d1echo aaaa > d1/f1cd ../tasksvim main.yml
-name: copy d1copy:src: d1 #不用指定路径,他会自动到角色的目录下的files目录下找d1文件dest: /mnt/mode=644owner: rootgroup: rootvim test.yml
- hosts: webroles: #调用web_admin用户的所有任务- web_adminansible-playbook -i /etc/ansible/hosts tt.yml
8.事实
在运行任何任务之前,Ansible将手机有关其配置的系统的信息,这些被成为事实,并且包括广泛的系统信息,如:CPU核心数量,可用的ipv4和ipv6网络,挂载的磁盘,Linux发行版等等。
事实在“任务”或“模板”配置中通常很有用,例如在nginx的配置文件模块文件中设定与CPU核数一样的进程数。
user www-data:worker_processes {{ ansible _processor_cores }};# 定义进程数pid /var/run/nginx.pid;# 所有的ansible facts全局变量都是以“ansible_"为前缀,并且可以在其他任何地方使用。ansible -m setup --connection=local localhost# 查看本机事实ansible -i ./hosts remote -m setup# 查看远端事实(获取客户端信息)示例:ansible -i /etc/ansible/hosts web -m setup# 查看客户端信息
9.加密
我们经常需要将敏感数据存储在我们的模板,文件或变量文件中,这样安全性由一定要求的情况时不可避免的。
Ansible有一个j奥做Ansible Valult的解决方案
Vault允许加密任何Yaml文件,通常用于将其作用与遍历啊ing文件,Vault不会加密文件和模板,只能加密Yaml文件。
在创建加密文件时,系统会询问您必须使用的密码,以便稍后在调用角色或playbook时进行编辑。
参数: create #创建一个新文件并进行加密decrypt #从加密文件创建明文文件edit #编辑已经存在的加密文件encrypt #加密现有的纯文本文件rekey #在加密文件中设置新密码示例:
ansible-vault create vars/main.yml# 创建一个新的变量文件,并加密。# 输入加密密码后,该文件将在默认编辑器(通常是vim或nano)中打开。