Ansible-playbook

playbook由一个或多个play组成,一个play可以包含多个task任务(使用多个不同的模块完成同一件事情)

playbook书写格式

缩进:YAML使用固定的缩进风格表示层级关系,每个缩进由两个空格组成(不能使用tabs)

冒号:所有冒号后面都需要有空格(除了使用冒号结尾的情况外)

短横线:表示列表项,使用一个短横线加一个空格,多个项使用同样的缩进级别作为同一列表

安装ansible

yum install ansible -y

验证安装版本

ansible --version

为项目单独创建配置文件(调整配置文件优先级)

ansible.cfg(复制默认的配置文件到指定项目的配置文件中)

关键配置:

#inventory = ./hosts(路径重新定义,进入该项目目录时读取当前目录的ansible.cfg)
#library = /usr/share/my_modules/
#module_utils = /usr/share/my_module_utils/
#remote_tmp = ~/.ansible/tmp
#local_tmp = ~/.ansible/tmp
#plugin_filters_cfg = /etc/ansible/plugin_filters.yml
#forks = 5 (调整并行主机的数量)

#host_key_checking = False

#roles_path = /etc/ansible/roles

定义host主机清单

[root@manager ~]# vim /etc/ansible/hosts

image-20250706234258061.png

检查定义的模块中有多少台主机

[root@manager ~]# ansible webservers --list-hosts

image-20250706234356236.png

主机生成密钥

ssh-keygen -t rsa -b 2048

推送密钥给目标主机

方法一:[root@manager cluster]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.192

方法二:[root@manager ~]# ssh-keyscan -H 172.16.1.51 172.16.1.41 >> ~/.ssh/known_hosts

image-20250707115638092.png

测试ping命令是否能通

[root@manager ~]# ansible dbservers -m ping

image-20250707115723918.png

编写ansible-playbook(nginx剧本)

[root@manager ~]# vim project/test_p1.yml

image-20250707121000471.png

模拟测试剧本(测试不一定成功)

[root@manager ~]# ansible-playbook -C project/test_p1.yml

image-20250707121034261.png

真实执行

[root@manager ~]# ansible-playbook project/test_p1.yml
image-20250707121125357.png

playbook编写nfs服务端

安装nfs

yum install nfs-utils -y

编写ansible剧本

1、安装(yum模块)
- hosts: webservers
  tasks:
    - name: install nfs
      yum:
        name: nfs-utils
        state: present
2、配置(copy模块)
    - name: cfg nfs
      copy:
        src: ./exports.j2
        dest: /etc/exports
      notify: Restart NFS
3、初始化(file/group/user模块)
    - name: init group
      group:
        name: zzz
        gid: 7777
   
    - name: init user
      user:
        name: zzz
        uid: 7777
        group: zzz
        shell: /sbin/nologin
        create_home: no

    - name: init creat directory
      file:
        path: /ansible_test
        state: directory
        owner: zzz
        group: zzz
        mode: "0755"
4、启动(systemd模块)
    - name: start nfs
      systemd:
        name: nfs
        state: started
        enabled: yes
5、触发器(当copy模块中的文件内容发生变化时执行触发器 )
  handlers:
    - name: Restart NFS
      systemd:
        name: nfs
        state: restarted

完整ansible剧本文件(nfs服务)

[root@manager project]# cat nfs.yml 
- hosts: webservers(目标主机的hosts组别)
  tasks:
    - name: install nfs
      yum:(管理软件包)
        name: nfs-utils(需要安装的包名)
        state: present(确保资源存在,不存在则安装,存在则保持或更新)

    - name: cfg nfs
      copy:(从ansible主控端复制文件到被控端)
        src: ./exports.j2(复制当前目录的文件到远程服务器)
        dest: /etc/exports(目标主机存放文件的路径)
      notify: Restart NFS(若文件发生改变,则递交给触发器)

    - name: init group
      group:(管理被控端用户组)
        name: zzz(创建的组名)
        gid: 7777(指定组的gid)
   
    - name: init user
      user:(创建或删除用户名)
        name: zzz(创建的用户名)
        uid: 7777(设置创建的用户的uid)
        group: zzz(给创建的用户设置组)
        shell: /sbin/nologin(为用户设置登陆时的shell,禁止该用户登录主机)
        create_home: no(不为该用户创建家目录)

    - name: init creat directory
      file:(为被控端创建文件或目录,设定权限)
        path: /ansible_test(指定被控端的文件路径)
        state: directory(检查目录是否存在,没有则创建)
        owner: zzz(设定目录属主)
        group: zzz(设定目录属组)
        mode: "0755"(设定目录权限)

    - name: start nfs
      systemd:(管理服务的启动、停止、重启)
        name: nfs(服务的名称)
        state: started(指定服务状态)
        enabled: yes(允许开机自启)

  handlers:(触发器)
    - name: Restart NFS(要匹配之前设定的notify名称)
      systemd:(管理服务的启动、停止、重启)
        name: nfs(指定服务名称)
        state: restarted(指定重启操作)