1.安装ansible
sudo yum install epel-release
sudo yum install ansible -y
1.1 配置ansible管理节点和主机的连接(其实就是配置从管理节点到远程主机之间基于密钥(无密码的方式)的ssh连接)
# 生成SSH密钥
ssh-keygen
#复制SSH密钥到远程主机,这样SSH连接的时候就不需要输入密码了
ssh-copy-id remoteuser@remoteserver
#SSH的时候不会提示是否保存密钥
ssh-keyscan remote_servers >> ~/.ssh/known_hosts
--验证SSH配置:在管理节点执行下面的SSH命令,若是不需要输入密码,也不提醒你存储密钥,表示已经成功配置。
ssh remoteuser@remoteserver
2.被管理的远程主机
不需要安装特殊的包,只需配置并启动SSH服务且Python版本在2.4以上即可。
2.1 主机目录
主机目录(Host inventory)是配置文件,用来告诉Ansible需要管理哪些主机,并且把这些主机按需分类。
2.2 主机目录配置文件
默认的文件是: /etc/ansible/hosts
2.3 ansible 用命令管理主机
Ansible提供一个命令行工具,在官方文档中给命令行起了一个名字,叫Ad-Hoc Commands。
2.3.1 ansible命令的格式
ansible命令的格式是:ansible <host -p atter n> (options]
2.3.2 ansible命令的功能
①.检查Ansible安装环境
检查所有的远程主机,是否以“bruce”用户创建了Ansible管理主机可以访问的环境:
ansible all -m ping -u bruce
②.执行命令
在所有的远程主机上,默认以当前Bash的同名用户,在远程主机上执行“echo hello”:
ansible all -a "/ bin/echo hello "
③.复制文件
复制文件/etc/host到远程主机(组)"Web",位置为/tmp/hosts:
ansible web -m copy -a "src=/etc/hosts dest=/tmp/hosts"
④.安装包
在远程主机(组)WebServer上安装yum包:
ansible web -m yum -a "name=acme state=present"
⑤.添加用户
ansible all -m user -a "name=foo password=...."
⑥.下载Git仓库
ansible web -m git -a "repo=git://foo.example.org/repo.git dest=/srv/myapp version=HEAD"
⑦.启动服务
ansible web -m service -a "name=httpd state=started"
⑧.并行执行
启动10个并行执行重启
ansible lb -a "/sbin/reboot" -f 10
⑨.查看远程主机的全部系统信息
ansible all -m setup
2.4 ansible用脚本管理主机
为了避免重复的输入命令,ansible提供了脚本功能。ansible脚本叫做Playbook,使用的是YAML格式,文件以yml或yaml为后缀。
2.4.1 执行脚本playbook的方法
ansible-playbook deploy.yml
2.4.2 Playbook的例子
Playbook包含几个关键字,每个关键字的含义如下:
①hosts:某主机的IP,或者主机组名,或者关键字all
②remote_user:以某个用户身份执行。
③vars:变量
④tasks:Playbook的核心,定义顺序执行的动作Action。每个Action调用一个Ansible模块。
--action语法:
module:module_parameter=module_value
--常用的模块有yum、copy、template等,模块在Ansible中的作用,相当于bash脚本中的yum、copy这样的命令。
⑤handers:Playbook的Event处理操作,有且仅有在被Action触发时才会执行。但多次触发只执行一次,并按照声明的顺序执行。
2.4.3 Play和Playbook
Playbook是指一个可被Ansible执行的YAML文件,其结构如下所示:
- hosts: web
remote_user: root
tasks:- name: ensure apache is at the latest version
yum: pkg=httpd state=latest
- name: ensure apache is at the latest version
当然,在一个Playbook文件中,还可以针对两组主机进行不同的操作:
#安装apache的play
- hosts: web
remote_user: root
tasks:- name: ensure apache is at the latest version
yum: pkg=httpd state=latest
- name: ensure apache is at the latest version
# 安装MySQL Server 的Play
- hosts: lb
remote_user: root
tasks:- name: ensure mysqld is at the latest version
yum: pkg=mariadb state=latest
- name: ensure mysqld is at the latest version
2.5 Ansible模块
模块是Ansible命令行和脚本中都需要调用的。常用的Ansible模块有yum、copy、template等。
正如bash在调用命令时可以跟不同的参数,每个命令的参数都是该命令自定义的。同样,Ansible中调用模块也可以跟不同的参数,每个模块的参数也都是由模块自定义的。
通过ansible-doc <module_name>来查看模块具体用法。
2.5.1 在命令行里使用模块
在命令行中:
-m 后面接调用模块的名字
-a 后面接调用模块的参数
使用模块copy复制管理员节点文件/etc/hosts到所有远程主机/tmp/hosts
ansible all -m copy -a "src=/etc/hosts dest=/tmp/hosts"
使用模块yum 在远程主机Web上安装httpd包
ansible web -m yum -a "name=httpd state=present"
2.5.2 在Playbook脚本中使用模块
在playbook脚本中,tasks中的每一个Action都是对模块的一次调用。在每个Action中:
-冒号前面是模块的名字。
-冒号后面是调用模块的参数。
tasks:
- name:ensure apache is at the latest version
yum: pkg=httpd state=latest - name: write the apache config file
template: src=ternplates/httpd.conf.j2 dest=/etc/httpd/conf/httpd .conf- name: ensure apache is running
service: name=httpd state=started
- name: ensure apache is running
2.5.3 Ansible模块的特点
①像Linux中的命令一样,ansible的模板既可以在命令行中调用,也可以在ansible的脚本playbook中调用
②每个模块的参数和状态的判断,都取决于该模块的具体实现,所以在使用它们之前需要查阅模块对应的文档
③可以通过文档查看其具体的用法(http://docs.ansible.com/ansible/list_of_all_modules.html)
④通过命令ansible-doc也可以查看模板的用法
⑤ansible提供一些常用功能的模块,同时ansible也提供API。让用户可以自己写模块,使用的编程语言是Python。
2.5.4 常用模块
①测试与调试类的模块
--ping:ping一下你的远程主机,如果可以通过Ansible连接成功,就会返回pong。
--debug:用于调试的模块,只是简单打印一些信息,有点像Linux的echo命令。
②文件类的模块
--copy:从本地复制文件到远程节点。
--template:从本地复制文件到远程节点,并进行变量的替换。
--file:设置文件属性。
③Linux上的常用操作
--user:管理用户账户。
--yum:Red Hat系列Linux上的包管理。
--service:管理服务。
--firewalled:管理防火墙中的服务和端口。
④执行shell命令
--shell:在节点上执行shell命令,支持$HOME,"<",">","|",";"和"&".
--command:在远程节点上面执行命令,不支持$HOME,"<",">","|",";"和"&".
->ping模块
这是测试远程节点的SSH连接是否就绪的常用模块。它并不像Linux命令那样简单的ping一下远程节点,而是先检查能否通过SSH登录远程节点,再检查Python版本能否满足要求,如果都满足就会返回pong,表示成功。ping无需任何参数。
->debug模块
打印输出信息,类似Linux上的echo命令。
①通过参数msg定义打印的字符串。
msg中可以嵌入变量,下面的例子中注入了[系统变量],Ansible在执行Playbook之前会收集一些比较常用的系统变量,这样在Playbook中不需要定义直接使用就可以。
-debug:
msg: "system {{ inventory_hostname }} has gateway {{ ansible_default_ipv4.gateway }}"
②通过参数var定义需要打印的变量。
变量可以是系统变量,也可以是动态的执行结果,通过关键字regester注入变量中。
3.copy模块
从当前的机器上复制静态文件到远程节点上,并且设置合理的文件权限。
①设置文件权限。
利用mode设置权限可以是数字,当然也可以是符号的形式"u=rw,g=r,o=r"和"u+rw,g-wx,o-rwx"。
-copy:
src: /srv/myfiles/foo.conf
dest:/etc/foo.conf
owner:foo
group:foo
mode:0644
②backup参数:备份节点上原来的文件。
backup参数为yes的时候,如果发生了复制(copy)操作,那么会先复制目标节点上的源文件。当两个文件相同时,不再进行复制操作。
-copy:
src:sudoers
dest:/tmp
backup:yes
③content参数:当不使用src指定拷贝的文件时,可以使用content直接指定文件内容,src与content两个参数必须有其一,否则会报错。
④force参数:当远程主机的目标路径已经存在同名文件,并且与ansible主机中的文件内容不同时,是否强制覆盖,可选值有yes和no,默认值为yes,表示覆盖,当设置为no,则不会执行覆盖拷贝操作,远程主机中的文件保持不变。
⑤复制后的验证操作。
validate参数接需要验证的命令。一般需要验证复制后的文件,所以%s都可以指代复制后的文件。当copy模块加入了validate参数后,不仅需要成功复制文件,还需要validate命令返回成功的状态,整个模块的执行状态才算成功。
-copy:
src: /mine/sudoers
dest: /etc/sudoers
validate: 'visudo -cf %s'
4.template模块
如果复制的只是静态文件,那么用copy模块就足够了。但如果在复制的同时需要根据实际情况修改部分内容,这时就需要用到template模块。
5.file模块
file模块可以帮助我们完成一些对文件的基本操作,权限创建等,比如,创建文件或目录、删除文件或目录、修改文件权限等。
以下为file模块的常用参数:
①path参数 :必须参数,用于指定要操作的文件或目录,在之前版本的ansible中,使用dest参数或者name参数指定要操作的文件或目录,为了兼容之前的版本,使用dest或name也可以。
②state参数 :此参数非常灵活,此参数对应的值需要根据情况设定,state的值设置为directory,则为创建一个目录。state的值设置为touch,则为创建一个文件。创建软链接文件时,需将state设置为link。创建硬链接文件时,需要将state设置为hard。想要删除一个文件时,则需要将state的值设置为absent。
③src参数 :当state设置为link或者hard时,表示我们想要创建一个软链或者硬链,所以,我们必须指明软链或硬链链接的哪个文件,通过src参数即可指定链接源。
④force参数 : 当state=link的时候,可配合此参数强制创建链接文件,当force=yes时,表示强制创建链接文件。
⑤recurse参数:当要操作的文件为目录,将recurse设置为yes,可以递归的修改目录中文件的属性。
⑥mode参数:既可以直接赋值数字权限(必须以0开头),也可以增加和删除权限。如:mode:0644 或者mode:"u=rw,g=r,o=r"或者mode:"u+rw,g-wx,o-rwx"
.....
网友评论