ansible的使用以及剧本

在使用的每台机器上安装ansible

安装配置

yum install -y epel*
yum install -y ansible

配置文件

vim /etc/ansible/hosts
vim /etc/ansible/ansible.cfg

主机组和包含组配置文件写法

[webservers]
192.168.10.11
[weball:children] 
webserver

某一个组配置连接变量

[weball:vars] 
ansible_ssh_port=22     
ansible_ssh_user=root   
ansible_ssh_private_key_file=/root/.ssh/id_rsa
ansible_ssh_pass=1 

看默认主机文件里的主机

ansible  weball --list-hosts

在别的地方写主机清单

vim /opt/hostlist
#使用-i参数调用里面的组
ansible -i /opt/hostlist all -m ping -o

模块

复制模块

1.远程复制备份模块:copy
模块参数详解:  
src=:指定源文件路径
dest=:目标地址(拷贝到哪里)
owner:指定属主
group:指定属组
mode:指定权限,可以以数字指定比如0644
backup:在覆盖之前将原文件备份,备份文件包含时间信息。有两个选项:yes|no

使用命令实例

把本地的拷贝到对方机器
ansible web -m copy -a 'src=/root/b dest=/root/a '
带上copy=no是指不从本地拷贝,在远程主机上操作

用户管理user模块

添加用户:

ansible web -m user -a "name=123"
添加叫123的用户

删除用户

ansible web -m user -a "name=123 state=absent"

软件包管理 yum模块

安装软件包

ansible web -m yum -a 'name=httpd state=latest'
ansible web -m yum -a 'name=httpd state=remove'

服务管理service模块

[root@ansible-server ~]# ansible webservers1 -m service -a "name=httpd state=started" #启动
[root@ansible-server ~]# ansible webservers1 -m service -a "name=httpd state=stopped" #停止
[root@ansible-server ~]# ansible webservers1 -m service -a "name=httpd state=restarted" #重启
[root@ansible-server ~]# ansible webservers1 -m service -a "name=httpd state=started enabled=yes" #开机启动
[root@ansible-server ~]# ansible webservers1 -m service -a "name=httpd state=started enabled=no"  #开机关闭

文件模块file

参数

模块参数详解:  
owner:修改属主
group:修改属组
mode:修改权限
path=:要修改文件的路径
recurse:递归的设置文件的属性,只对目录有效
        yes:表示使用递归设置
state:
touch:创建一个新的空文件
directory:创建一个新的目录,当目录存在时不会进行修改

实例

ansible web -m file -a 'path=/tmp/88.txt mode=777 state=touch ' 
ansible web -m file -a 'path=/tmp/99 mode=777 state=directory ' 

脚本 script 模块

指定本地的脚本文件,到远程主机运行一次
注意:和 shell 模块的不同,shell 模块是要求客户端上有这个脚本才能执行;script 是要求 ansible 服务端有这个脚本就可以了,执行的时候是不会拷贝这个脚本到客户端的。

ansible webservers1 -m script -a "chdir=/mnt /root/test.sh"

要给脚本权限

chmod o+x test.sh

参数:
creates:如果其后跟的文件存在,则不执行脚本;
removes:如果其后跟的文件存在,则执行脚本;

ansible webservers1 -m script -a "/root/awk.sh removes=/etc/passwd"

收集信息模块setup

收集主机组信息

ansible webservers1 -m setup  #收集所有信息

查询主机组的ip

ansible webservers1 -m setup -a 'filter=ansible_all_ipv4_addresses' #只查询ipv4的地址

archive模块

作用:压缩
常用参数
path 打包目录名称
dest 声称打包文件名称
format 打包格式
owner 指定文件所属人
mode 指定文件权限

ansible webservers1 -m archive -a "path=/etc dest=/mnt/etc.tar.gz format=gz"

解压模块unarchive

参数解释:
copy:默认为yes,当copy=yes,那么拷贝的文件是从ansible主机复制到远程主机上的,如果设置为copy=no,那么会在远程主机上寻找src源文件
src:源路径,可以是ansible主机上的路径,也可以是远程主机上的路径,如果是远程主机上的路径,则需要设置copy=no
dest:远程主机上的目标路径

ansible webservers -m unarchive -a 'src=/root/jdk-8u191-linux-x64.tar.gz dest=/opt/ copy=yes' -o

cron模块作用:计划任务

常用参数
minute 分钟
hour 小时
day 天
month 月
weekday 周
name 任务名称
job 任务脚本或命令
disabled yes 禁用计划任务/no 启动计划任务
state=absent 删除计划任务

ansible webservers -m cron -a 'job="rm -rf /mnt/*" name="deletefile" minute="53" hour="20" day="7" month="5"'

ansible-playbook

概念

  • 剧本(Playbook): 一个包含一系列任务的 Ansible 配置文件,通常使用 YAML 编写。

  • 主机组(Hosts): 定义任务将在哪些主机上执行。可以使用具体的主机名、IP 地址,也可以使用在 Ansible 主机清单(Inventory)中定义的主机组。

  • 任务(Task): 定义了在目标主机上执行的一组操作。每个任务通常与一个模块(Module)关联,模块用于执行特定的功能,例如安装软件、配置文件等。

  • 模块(Module): Ansible 操作的基本单元,用于执行特定的功能。例如,apt 模块用于管理 Debian/Ubuntu 系统上的软件包。

  • 角色(Roles): 可以将一组任务和文件组织成可重用的角色。角色包含了在多个剧本中共享的任务和变量。

  • 变量(Variables): 允许你在剧本中定义和使用变量,使剧本更具灵活性和可重用性。

  • 处理器(Handlers): 用于在剧本中定义的任务中触发的操作,通常用于在特定条件下重新启动服务或执行其他动作

架构

playbook的基础组件:

  • name:
    定义playbook或者task的名称(描述信息),每一个play都可以完成一个任务。
  • hosts:
    playbook中的每一个paly的目的都是为了让某个或某些以某个指定用户的身份执行任务。hosts用于指定要执行指定任务的主机.
  • user :
    remote_user则用于指定远程主机上的执行任务的用户,也可以使用user(基本上是root)
  • tasks :
    任务列表play的主体部分是task list. task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。
  • vars:
    定义变量(如果不使用内部变量需要提前定义)
  • vars_files:
    调用定义变量文件
  • notify:
    任务执行结果如果是发生更改了的则触发定义在handler的任务执行
  • handlers:
    用于当前关注的资源发生变化时采取一定指定的操作

角色

目录顺序:

  • role_name/ ---角色名称=目录
    • files/:存储一些可以用copy调用的静态文件。
    • tasks/: 存储任务的目录,此目录中至少应该有一个名为main.yml的文件,用于定义各task;其它的文件需要由main.yml进行“包含”调用es;
    • handlers/:此目录中至少应该有一个名为main.yml的文件,用于定义各handler;其它的文件需要由(与notify:名字相同,方便notify通知执行下一条命令)通过main.yml进行“包含”调用;
    • vars/:此目录中至少应该有一个名为main.yml的文件,用于定义各variable;其它的文件需要由main.yml进行“包含”调用;
    • templates/:存储由template模块调用的模板文本; (也可以调用变量)
    • site.yml:定义哪个主机应用哪个角色