目录
一、概述
(一)特点
(二)工作特性
二、运行机制
三、安装
(一)配置源
(二)安装ansible
(三)查看相关文件
(四)配置文件
1、主配置文件
2、部署端的hosts
3、Playbook相关
四、命令相关
(一)ansible
1、参数
2、语法
(二)ansible-doc
1、选项
2、举例
(1)列出所有模块名称
(2)查看模块的简短文档
(3)查看模块的完整文档
(4)指定额外的模块路径
(5)以JSON格式显示文档信息
(三)ansible-playbook(用于执行Ansible Playbook的命令)
1、语法
2、选项
3、示例:
(1)执行Playbook
(2)指定主机清单文件
(3)仅运行指定标签的任务
(4)覆盖变量文件中的变量值
(5)检查Playbook的语法是否正确
(6)列出Playbook中的所有任务
(7)从指定任务开始执行Playbook
(8)逐步询问每个任务是否要执行
(9)增加详细度
(10)模拟执行Playbook
五、主机组配置
(一)基本配置
1、vim /etc/ansible/hosts
2、配置/etc/hosts
3、设置SSH密钥对验证登录
(二)也可以定义范围主机
六、简单案例
(一)连通性测试
1、ansible 192.168.115.131 -m ping 编辑
2、ansible webServers -m ping
(二)主机信息查看
1、ansible webServer -m shell -a "ls -l /root"
2、ansible webServer -m shell -a "hostname"
(三)安装服务
七、常见模块
(一)command(执行命令,但是命令中不能包含"< > | &")
(二)shell(执行命令,基于/bin/sh,也可执行远程主机已经存在的脚本文件)
(三)raw(执行命令,不需要远程主机安装python环境)
(四)script(拷贝ansible端的shell脚本至远程主机并执行,执行完毕后删除远程主机的脚本文件)
(五)ping(测试连通性)
(六)file(对远程主机进行文件操作)
1、参数
2、案例:
(七)copy(拷贝文件至远程主机)
1、参数
2、案例:复制文件并设置权限
(八)service(对远程主机的服务进行管理)
1、参数
2、案例
(九)cron(管理远程主机的计划任务)
1、参数
2、案例
(十)yum(管理远程主机的软件包)
1、参数
2、案例
(十一)user与group(管理远程主机的用户与组)
1、参数
(十二)synchronize(管理远程主机数据同步,调用rsync)
1、参数:
(十三)setup(查看远程主机信息)
1、参数
2、案例
(十四)get_url(使远程主机下载文件(http、https、ftp),类似于wget)
1、参数
2、案例:通过以下步骤实现
(十五)unarchive(解压缩)
1、参数
2、案例
(十六)archive(归档压缩)
1、参数
2、案例
(十七)template(Templat模板使用jinjia2语言进行配置,模板文件的后缀名为.j2)
八、剧本(ansible变量)
(一)格式
(二)返回状态
(三)核心元素
1、 Hosts:主机组
2、Tasks:任务列表
3、Variables:变量,设置方式有四种
4、 Handlers:由特定条件触发的任务。
5、Templates:包含了模块语法的文本文件
(四)案例
1、vim mariadb.yml
2、运行剧本
(五)roles
(六)批量创建目录结构
1、部署简单,没有客户端,只需在主控端部署Ansible环境,被控端无需做任何操作;
2. 模块化:调用特定的模块,完成特定任务
3. 默认使用SSH协议对设备进行管理;
4. 主从集中化管理;
5、配置简单、功能强大、扩展性强;
6、支持API及自定义模块,可通过Python轻松扩展;
7、通过Playbooks来定制强大的配置、状态管理
8. 对云计算平台、大数据都有很好的支持;
9. 具有幂等性:一个操作在一个主机上执行一遍和执行N遍的结果是一样的
1、连接插件connection plugins:负责和被监控端实现通信;
2、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
3、各种模块核心模块、command模块、自定义模块;
4、借助于插件完成记录日志邮件等功能;
5、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务
1、Ansible: ansible的核心模块
2、Host Inventory:主机清单,也就是被管理的主机列表
3、Playbooks:ansible的剧本,可想象为将多个任务放置在一起,一块执行
4、Core Modules:ansible的核心模块
5、Custom Modules:自定义模块
6、Connection Plugins:连接插件,用于与被管控主机之间基于SSH建立连接关系
7、Plugins:其他插件,包括记录日志、邮件等
命令:yum install -y epel-release
命令:yum install -y ansible
命令:rpm -ql ansible
安装目录:/etc/ansible
/etc/ansible/ansible.cfg
/etc/ansible/hosts
/etc/ansible/roles
(1)-v 详细模式,如果执行成功,输出详细结果
(2)-i 指定host文件路径,默认在/etc/ansible/hosts
(3)-f, -forks=NUM NUM默认是整数5,指定fork开启同步进程的个数
(4)-m 指定使用的module名称,默认command模块
(5)-a 指定模块的参数
(6)-k 提示输入SSH密码,而不是使用基于ssh密钥认证
(7)-sudo 指定使用sudo获取root权限
(8)-K 提示输入sudo密码
(9)-u 指定移动端的执行用户
(10)-C 测试命令执行会改变什么内容,不会真正的去执行
(11)all --list 显示hosts清单
ansibe -i [filePath] -m [moduleName] -a [arguments]
ansible-doc是用于查阅Ansible模块文档的命令。该命令可用于列出安装在本地系统中的所有模块,并提供文档以及示例。
(1)-l 列出所有模块名称
(2)-s 查看指定模块
(3)--help 显示帮助信息。
(4)--version 显示版本信息
(5)-a 显示模块的完整文档
(6)-M 指定额外的模块路径
(7)--json 以JSON格式显示文档信息
命令:ansible-doc -l
命令:ansible-doc -s module_name
其中module_name替换为要查询的模块名称。
命令:ansible-doc -a module_name
ansible-doc -M /path/to/extra/module_dir module_name
其中/path/to/extra/module_dir替换为包含自定义模块的目录路径,module_name替换为要查询的模块名称。
命令:ansible-doc --json module_name
ansible-playbook [选项] playbookName
(1)-e :外部变量传递
(2)-i: 指定主机清单文件
(3)-l: 跟随由逗号分隔的主机名称列表限制作用的主机
(4)-e: 覆盖变量文件中的变量值
(5)-t: 仅运行指定标签的任务
(6)--skip-tags: 跳过指定标签的任务
(7)--syntax-check: 检查Playbook的语法是否正确
(8)--list-tasks: 列出Playbook中的所有任务
(9)--start-at-task: 从指定的任务开始执行Playbook
(10)--step: 逐步询问每个任务是否要执行
(11)-v: 增加详细度,可多次使用增加级别
(12)--check: 运行模拟模式,只测试任务是否需要执行,不会真正执行任务
命令:ansible-playbook playbook.yml
其中playbook.yml替换为要执行的Playbook的文件名。
命令:ansible-playbook -i inventory.ini playbook.yml
其中inventory.ini替换为要使用的主机清单文件的路径。如果未指定该选项,则默认为/etc/ansible/hosts。
命令:ansible-playbook -i inventory.ini playbook.yml -t task1,task2
其中task1,task2替换为要运行的任务的标签名称。
命令:ansible-playbook -i inventory.ini playbook.yml -e "foo=bar"
其中foo替换为要覆盖的变量名,bar替换为要设置的新值。
命令:ansible-playbook --syntax-check playbook.yml
该命令将检查Playbook的语法是否正确,并显示任何错误信息。
命令:ansible-playbook --list-tasks playbook.yml
该命令将列出Playbook中的所有任务。
命令:ansible-playbook -i inventory.ini playbook.yml --start-at-task="task3"
其中task3替换为要从其开始执行的任务名称。
命令:ansible-playbook -i inventory.ini playbook.yml --step
该命令将在运行每个任务之前询问用户是否要执行该任务。
命令:ansible-playbook -i inventory.ini playbook.yml -v
使用该选项可增加命令的详细度。可多次使用此选项以增加日志详细度。
命令:ansible-playbook -i inventory.ini playbook.yml --check
使用该选项可进行模拟运行,以测试所有任务是否需要执行,而不实际执行任务。
[webServers]
192.168.115.131
192.168.115.132
vim /etc/hosts
192.168.115.131 server1
192.168.115.132 server2
[webServers]
192.168.115.13[1:2]
ansible webServer -m shell -a "yum -y install vsftpd"
案例:ansible webServer -m command -a "netstat -anptul"
案例:ansible webServer -m shell -a "netstat -anptul | grep vsftb"
案例:ansible webServer -m raw -a "ls -l"
语法: ansible all -m script -a "chdir=/opt 脚本名"
chdir 切换脚本运行结果的目录
(1)force(强制创建软连接)
①yes|no
②用于使用ansible编译安装软件后的命令优化
(2)group(文件属组)
(3)owner(文件属主)
(4)mode(文件权限)
(5)path(文件路径)
(6)state(文件类型)
①directory(目录)
②link
③hard
④touch(文件)
⑤absent
ansible 192.168.115.131 -m file -a "path=/opt/t1 state=directory mode=0700 owner=juexing group=juexing"
(1)backup
若目标文件存在,则覆盖前是否进行备份,yes|no
(2)content(等效于src)
(3)src
要复制文件在本地的路径,若复制目录则需要在目录名称结尾处添加/
(4)dest
复制文件到远程主机的绝对路径,若复制源是目录,则目录也必须是目录
(5)directory_mode(采用递归的形式设置目录权限)
(6)force( 是否进行强制覆盖,yes|no)
命令:ansible webServer -m copy -a "src=/etc/yum.repos.d/epel.repo dest=/opt/epel.repo mode=0444 owner=juexing group=juexing "
(1)enabled(开机自启,yes|no)
(2)name(服务名称)
(3)parttern(定义模式)
(4)sleep(若执行了restarted,该时间设置stop到start 的间隔时间)
(5)state
①started(开启)
②stopped(关闭)
③restarted(重启)
④reloaded(平滑重启)
ansible 192.168.115.131 -m service -a "name=httpd state=started"
(1)backup(备份冲突计划任务,yes|no)
(2)cron_file(指定计划任务存储路径,/etc/cron.d)
(3)minute(0~59,*,*/2)
(4)hour(0~23,*,*/2)
(5)day(1~31)
(6)mouth(1~12)
(7)weekly(0~7,0和7都是周日)
(8)job(执行的任务,依托于state=present)
(9)state
①present(创建)
②absent(删除)
(10)name(描述信息)
(11)user(执行job的用户)
(12)special_time(指定执行的时间)
参数:
①reboot(重启)
②annually(每年)
③mouthly(每月)
④weekly(每周)
⑤daily(每天)
⑥hourly(每小时)
命令:ansible 192.168.115.131 -m cron -a "name=backup state=present minute=10 hour=15 job=whoami"
在文件vim /var/spool/cron/root中查看
(1)config_file(yum源的配置文件)
(2)disable_gpg_check(关闭gpgcheck)
(3)disablerepo(不启用某个源)
(4)enablerepo(启用某个源)
(5)name(安装软件的名称)
(6)state
①present(安装)
②installed(安装)
③latest(安装最新版本)
④absent(删除)
⑤removed(删除)
ansible webServer -m yum -a "name=ftp state=present"
(1)name(指定用户名)
(2)group(指定组名)
(3)groups(指定附加组) 注意:指定多个附加组用“,”隔开
(4)shell(指定登录shell)
(5)state
①present(创建)
②absent(删除)
(6)remove(递归删除用户家目录及邮件,state=absent)
(7)password(指定用户密码(md5加密的密码))
(1)archive(归档)
(2)checksum(数据验证,默认关闭)
(3)compress(是否压缩,默认开启)
(4)copy_links(复制链接文件,默认关闭)
(5)delete(删除不存在的文件,默认是no)
(6)src(源文件)
(7)dest(目标路径)
(8)dest_port(目标端口,默认22)
(9)mode
①push(推送,文件上传)
②pull(拉取,文件下载)
file(指定要查看的内容)
(1)ansible_all_ipv4_addresses:仅显示ipv4的信息。
(2)ansible_devices:仅显示磁盘设备信息。
(3)ansible_distribution:显示是什么系统,例:centos,suse等。
(4)ansible_distribution_major_version:显示是系统主版本。
(5)ansible_distribution_version:仅显示系统版本。
(6)ansible_machine:显示系统类型,例:32位,还是64位。
(7)ansible_eth0:仅显示eth0的信息。
(8)ansible_hostname:仅显示主机名。
(9)ansible_kernel:仅显示内核版本。
(10)ansible_lvm:显示lvm相关信息。
(11)ansible_memtotal_mb:显示系统总内存。
(12)ansible_memfree_mb:显示可用系统内存。
(13)ansible_memory_mb:详细显示内存情况。
(14)ansible_swaptotal_mb:显示总的swap内存。
(15)ansible_swapfree_mb:显示swap内存的可用内存。
(16)ansible_mounts:显示系统磁盘挂载情况。
(17)ansible_processor:显示cpu个数(具体显示每个cpu的型号)。
(18)ansible_processor_vcpus:显示cpu个数(只显示总的个数)。
(1)返回远程主机的所有信息
ansible servers -m setup
(2)ansible servers -m setup -a "filter=ansible_all_ipv4_addresses"
(1)url(指定下载路径)
(2)dest(指定下载位置)
(3)url_username(指定登录用户名)
(4)url_password(指定用户密码)
(1)ansible 192.168.115.131 -m service -a "name=httpd state=started"
(2)systemctl start httpd
(3)cd /var/www/html
(4)echo 111 >t2
(5)ansible 192.168.115.132 -m get_url -a "url=http://192.168.115.131/t2 dest=/opt"
(1)copy
从ansible服务器复制文件到远程主机,默认yes。
设置为no,需要使用src指定远程主机中包的存在位置
(2)src(指定远程主机软件包位置)
(3)dest(解压后的软件存储位置)
(4)mode(解压后的文件权限)
ansible all -m unarchive -a 'copy=no src=/mnt/etc.tar.gz dest=/mnt mode=777’
(1)path 打包目录名称
(2)dest 声称打包文件名称
(3)format 打包格式
(4)owner 指定文件属主
(5)mode 指定文件权限
ansible all -m archive -a 'path=/etc dest=/mnt/etc.tar.gz format=gz owner=devops mode=777'
1、文件的第一行应该以“---”(三个连字符)开始,表明YAML文件的开始。
2、在同一行中,#之后的内容表示注释,类似于shell,python和ruby。
3、YAML中的列表元素以“-”开头并且跟着一个空格。后面为元素内容。
4、同一个列表之中的元素应该保持相同的缩进,否则会被当做错误处理。
注意: 缩进不能使用tab键
5、playbook中hosts、variables、roles、tasks等对象的表示方法都是键值中间以“:”分隔表示,并且“:”之后要加一个空格。
绿色代表执行成功,系统保持原样。黄色代表系统状态发生改变。红色代表执行失败,显示错误输出。
(1)name(任务名)
(2)模块(模块名)
(3)notify(触发任务,与handlers名称一致)
(4)tags(任务执行标签)
(1)vars
(2)外部传递:ansible-playbook xxx.yml -e var=value
(3)内部定义
(1)template
(2)拷贝模板文件
命令:ansible-playbook mariadb.yml
1、roles/
2、mysql/:mysql服务的yml文件
3、httpd/:apached服务的yml文件
4、nginx/:nginx服务的yml文件
5、files/:存储由copy或者script等模块调用的文件或者脚本;
6、tasks/:此目录中至少应该有一个名为main.yml的文件,用于定义各个task;其他文件需要由main.yml进行包含调用;
7、handlers/:此目录中至少应该有一个名为main.yml的文件,用于定义各个handler;其他文件需要由main.yml进行包含调用;
8、vars/:此目录至少应该有一个名为main.yml的文件,用于定义各个variable(变量);其他的文件需要由main.yml进行包含调用;
9、templates/:存储由templates模块调用的模板文件;
10、meta/:此目录中至少应该有一个名为main.yml的文件,定义当前角色的特殊设定以及依赖关系,其他文件需要由main.yml进行包含调用;
11、defaults/:此目录至少应该有一个名为main.yml的文件,用于设定默认变量;
mkdir -p {nginx,mysql,tomcat}/{tasks,files,hanlders,vars,templates,meta,defaults}