简介
playbook是一个由yaml语法编写的文本文件,由play和task两部分组成
play: 主要定义要操作的主机或主机组
task: 主要定义对主机或主机组具体的执行任务,可以是一个或多个
playbook是由一个或多个play组成,可以包含多个task任务,可以理解为多个不同的模块共同完成一件事情
playbook与ad-hoc的区别
playbook是对ad-hoc的编排方式
playbook可以持久运行,而ad-hoc是临时性的
playbook适合复杂任务,而ad-hoc只能做快速简单的任务
playbook可以控制任务的执行顺序
playbook语法格式
playbook是yaml语法书写,结构清晰,可读性强
demo
[root@k81 an]# cat > y1.yaml <<EOF --- - name: test-playbook # play的名字 hosts: ubuntus # 被控端主机 remote_user: root # 被控端的用户 vars: # 变量 file_name: xiaohu # 定义一个该playbook可用的变量 tasks: # 任务 - name: Installed nginx-server # 任务名 apt: # 模块,这边是Ubuntu系统所以用的apt,如对端是rhel系列需要修改为yum模块 name: nginx state: present - name: Systemd nginx-server systemd: name: nginx state: started enabled: yes EOF ## 在执行playbook之前我们可以检查一下playbook的语法,类似于shell中检查sh -n xxx.sh [root@k81 an]# ansible-playbook --syntax y1.yaml ## 模拟执行playbook [root@k81 an]# ansible-playbook y1.yaml -C ## 真正执行playbook [root@k81 an]# ansible-playbook y1.yaml
从零开始编写playbook
我们为play新建一个项目文件夹,后续操作在这个文件夹进行
[root@k81 an]# mkdir playbook [root@k81 an]# cd !$ cd playbook [root@k81 playbook]# cp /etc/ansible/{ansible.cfg,hosts} . [root@k81 playbook]# ls ansible.cfg hosts [root@k81 playbook]# sed -i 's@#inventory = /etc/ansible/hosts@inventory = ./hosts@' ansible.cfg [root@k81 playbook]# vim ansible.cfg [root@k81 playbook]# ansible --version ansible 2.9.27 config file = /an/playbook/ansible.cfg # 可以看到配置文件已经是当前目录下的ansible.cfg了
开始之前
playbook的主机组的书写方式
[root@k81 an]# cat except.yaml - hosts: all #所有组 tasks: - name: debug debug: msg="test" [root@k81 an]# cat except.yaml - hosts: all:!k8s # 排除k8s组 tasks: - name: debug debug: msg="test" [root@k81 an]# cat except.yaml - hosts: all:!k8s:!db # 排除k8s组和db组 tasks: - name: debug debug: msg="test"
第一个playbook开始
简单写一个服务
我们以安装一个nfs服务器为第一个例子
[root@k81 playbook]# cat > exports.j2 <<EOF /ansible_test 10.10.21.0/24(rw,all_squash,anonuid=7777,anongid=7777) EOF # 先准备一个nfs的配置文件 [root@k81 playbook]# cat nfs.yaml --- - hosts: ub1 tasks: - name: 0. Configure apt apt_repository: repo: 'deb http://mirrors.ustc.edu.cn/ubuntu/ {{ ansible_distribution_release }} main restricted universe multiverse' state: present update_cache: yes - name: 1. Install nfs-server apt: name: nfs-kernel-server # rhel下为nfs-utils state: present - name: 2. Configure nfs-server copy: src: ./exports.j2 dest: /etc/exports - name: 3. Init user and group user: name: test uid: 777 shell: /sbin/nologin create_home: no - name: 4. Init nfs-server file: path: /ansible_test state: directory owner: test group: test mode: "0755" - name: 5. Start nfs-server systemd: name: nfs state: started enabled: yes [root@k81 playbook]# vim nfs.yaml ## 编写一个playbook [root@k81 playbook]# cat nfs.yaml --- - hosts: ub1 tasks: - name: 0. Configure apt apt_repository: repo: 'deb http://mirrors.ustc.edu.cn/ubuntu/ {{ ansible_distribution_release }} main restricted universe multiverse' state: present update_cache: yes - name: 1. Install nfs-server apt: name: nfs-kernel-server # rhel下为nfs-utils state: present - name: 2. Configure nfs-server copy: src: ./exports.j2 dest: /etc/exports - name: 3. Init user and group user: name: test uid: 7777 shell: /sbin/nologin create_home: no - name: 4. Init nfs-server file: path: /ansible_test state: directory owner: test group: test mode: "0755" - name: 5. Start nfs-server systemd: name: nfs-kernel-server # rhel下为nfs state: started enabled: yes
引入新的配置
如果nfs已经是启动状态,再把systemd的state设置started,那么修改配置文件并不会生效,因此我们需要新引进一个handlers的模块
在Ansible中,handlers是一种特殊的任务,在任务执行完成后,如果有任何任务通知该handler,则该handler将被触发。handlers通常用于在某些特定的任务完成后,执行一些额外的操作,例如重新启动服务或重新加载配置文件。
Handlers的触发是通过notify关键字来实现的。在任务中,使用notify关键字来通知handlers。
那么我们就可以来根据原来的playbook文件进行修改了
........ - name: 2. Configure nfs-server copy: src: ./exports.j2 dest: /etc/exports notify: Restart nfs-server # 在修改了配置文件之后触发handlers ........ handlers: # handlers与tasks同级别,一般写在playbook的最后面 - name: Restart nfs-server # 这任务名一定要和notify一致 systemd: state: restarted name: nfs-kerner-server
然后我们可以测试一下,不修改exports.j2运行playbook和修改了再运行
[root@k81 playbook]# echo "###" >> exports.j2 [root@k81 playbook]# ansible-playbook nfs.yaml .... PLAY RECAP ******************************************************************************************************************************************************************************** ub1 : ok=8 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 ## 可以看到这次changed=2