Ansible 的脚本 --- playbook 剧本

1.playbooks 组成

(1)Tasks:任务,即通过 task 调用 ansible 的模块将多个操作组织在一个 playbook 中运行
(2)Variables:变量
(3)Templates:模板
(4)Handlers:处理器,当changed状态条件满足时,(notify)触发执行的操作
(5)Roles:角色

playbook剧本的格式

vim XXX.yaml   XXX.yml
- name:                        #设置play的名称(一个playbook文件里可以有多个play)
  hosts:                       #设置执行此play的远程主机组,多个组用 : 分隔
  remote_user:                 #设置在远程主机执行此play的用户名,默认为root
  become: yes                  #设置是否需要在远程主机sudo切换执行任务
  become_user: root            #设置sudo切换的用户,一般为root
  gather_facts: true|false     #设置是否收集facts信息,默认为true
  vars:                        #设置此play中使用的自定义变量
  - 变量1: 值1
  - 变量2: 值2
  tasks:                       #设置此play的任务列表
  - name:                         #定义任务的名称
    模块名: 模块参数              #定义此任务要使用的模块和参数(键值对格式 key=value)
  - name:           
    模块名: 模块参数
    ignore_errors: true           #忽略此任务可能的失败(如果不忽略,则任务失败会导致中断后续任务的执行)
  - name:           
    模块名: 模块参数
    when: 条件表达式              #条件表达式成立则执行此任务,不成立则不执行此任务
  - name:           
    模块名: 模块参数={{item}}     #循环遍历
    with_items:                   #定义循环的取值列表
  - name:           
    模块名: 模块参数
    notify: '任务名'              #定义此任务执行状态为changed时要触发的handler任务
- name:           
    模块名: 模块参数
    tags:       #定义任务的标签,ansible-playbook --tags="标签" 可实现仅执行拥有指定标签的任务(拥有always标签的任务总是会执行)
    - 标签1
    - 标签2




  handlers:                    #设置notify触发的任务
  - name: 任务名
    模块名: 模块参数



2.playbook运行命令

ansible-playbook XXX.yaml -u <远程用户> -k   #用来交互输入ssh密码
                          --become-user <sudo切换的用户> -K   #用来交互输入sudo密码
                          --syntax-check   #检查yaml文件的语法是否正确
						  --list-task      #检查tasks任务
						  --list-hosts      #检查生效的主机
						  --start-at-task="任务名"    #指定从某个task开始运行
                          -e "变量=值"    #在命令行里定义变量
模块参数的格式
横向格式:
  模块名: 参数1=值  参数2={{变量名}}  ....

纵向格式:
  模块名: 
    参数1: 值
    参数2: "{{变量名}}"
    ....

-k(–ask-pass):用来交互输入ssh密码
-K(-ask-become-pass):用来交互输入sudo密码
-u:指定用户

ansible-playbook xxx.yaml --syntax-check    #检查yaml文件的语法是否正确
ansible-playbook xxx.yaml --list-task       #检查tasks任务
ansible-playbook xxx.yaml --list-hosts      #检查生效的主机
ansible-playbook xxx.yaml --start-at-task='install httpd'     #指定从某个task开始运行




3.vars 和 with_items 的格式

#值为纯量类型时:
tasks:
- name:
  模块名: 参数1={{item}}
  with_items:
  - 值1                                 #纵向格式:
  - 值2
  ....

tasks:
- name:
  模块名: 参数1={{item}}
  with_items: ["值1", "值2", ....]     #横向格式


#先使用vars定义循环取值列表,再用with_items引用vars的变量
vars:
- 变量1:
  - 值1                                #纵向格式
  - 值2
  ....
- 变量2: ["值1", "值2", ....]          #横向格式

tasks:
- name:
  模块名: 参数1={{item}}
  with_items: "{{变量1}}"         #使用with_items引用vars的变量
- name:
  模块名: 参数1={{item}}
  with_items: "{{变量2}}"
  

#当值为对象类型(键值对)时:
tasks:
- name:
  模块名: 参数1={{item.key1}}  参数2={{item.key2}}
  with_items: 
  - key1: 值1                    #纵向格式
    key2: 值2
  - key1: 值3
    key2: 值4
  ....
  
  with_items:
  - {key1: 值1, key2: 值2}      #横向格式
  - {key1: 值3, key2: 值4}
  ....
	
	
vars:
- 变量1: 
  - key1: 值1                    #纵向格式
    key2: 值2
  - key1: 值3
    key2: 值4
  ....
- 变量2:
  - {key1: 值1, key2: 值2}      #横向格式
  - {key1: 值3, key2: 值4}
  ....
tasks:
- name:
  模块名: 参数1={{item.key1}}  参数2={{item.key2}}
  with_items: "{{变量1}}"	


4.template 配置模板模块

1)先准备一个 XXX.j2 配置文件模板,在模板文件中使用 {{变量名}} 格式引用主机变量/组变量/vars字段定义的变量/facts信息字段变量
2)修改主机清单配置文件 hosts,设置主机变量/组变量
3)编辑 playbook 文件,在 tasks 任务中定义 template 模块任务及其参数 template: src=XXX.j2文件路径 dest=远程主机配置文件路径v

(1)先准备一个以 .j2 为后缀的 template 模板文件,设置引用的变量

cp /etc/httpd/conf/httpd.conf /opt/httpd.conf.j2

vim /opt/httpd.conf.j2
Listen {{http_port}}				#42行,修改
ServerName {{server_name}}			#95行,修改
DocumentRoot "{{root_dir}}"          #119行,修改

(2)修改主机清单文件,使用主机变量定义一个变量名相同,而值不同的变量

vim /etc/ansible/hosts       
[webservers]
192.168.80.11 http_port=192.168.80.11:80 server_name=www.accp.com:80 root_dir=/etc/httpd/htdocs

[dbservers]
192.168.80.12 http_port=192.168.80.12:80 server_name=www.benet.com:80 root_dir=/etc/httpd/htdocs

(3)编写 playbook

vim apache.yaml
---

- hosts: all
  remote_user: root
  vars:
    - package: httpd
    - service: httpd
      tasks:
    - name: install httpd package
      yum: name={{package}} state=latest
    - name: install configure file
      template: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf     #使用template模板
      notify:
        - restart httpd
    - name: create root dir
      file: path=/etc/httpd/htdocs state=directory
    - name: start httpd server
      service: name={{service}} enabled=true state=started
      handlers:
    - name: restart httpd
      service: name={{service}} state=restarted

ansible-playbook apache.yaml

5.roles角色

可以把playbook剧本里的每个play看作为一个角色,将每个角色要用到的文件、变量、任务列表定义到对应角色的目录中,需要时可以直接在playbook中调用角色。

作用:实现在playbook中代码复用。

(1)roles目录格式

roles/          #角色总目录,其每个子目录就是一个角色目录
  nginx/        #角色目录,一个角色相当于playbook中的一个play主题,目录名就是角色名
    files/      #存放copy、script、unarchive等模块默认调用的文件
	templates/       #存放template模块默认调用的模板文件
	tasks/mian.yml   #定义此角色的tasks任务列表
	handlers/mian.yml    #定义此角色通过nofity触发执行的handlers任务列表
	vars/mian.yml        #定义此角色使用的自定义变量
	defaults/mian.yml    #定义此角色使用的默认变量(一般不用)
	meta/mian.yml        #定义此角色的元数据信息和依赖关系
  mysql/
    ....
  php/
    ....
vim XXX.yaml
- name:
  hosts:
  remote_user:
  roles:
  - 角色名1
  - 角色名2
  ....

ansible-playbook XXX.yaml

(2)在一个 playbook 中使用 roles 的步骤

(1)创建以 roles 命名的目录
mkdir /etc/ansible/roles/ -p #yum装完默认就有

(2)创建全局变量目录(可选)

mkdir /etc/ansible/group_vars/ -p
touch /etc/ansible/group_vars/all     #文件名自己定义,引用的时候注意

(3)在 roles 目录中分别创建以各角色名称命名的目录,如 httpd、mysql

mkdir /etc/ansible/roles/httpd
mkdir /etc/ansible/roles/mysql

(4)在每个角色命名的目录中分别创建files、handlers、tasks、templates、meta、defaults和vars目录,用不到的目录可以创建为空目录,也可以不创建

mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta}
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta}

(5)在每个角色的 handlers、tasks、meta、defaults、vars 目录下创建 main.yml 文件,千万不能自定义文件名

touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml

(6)修改 site.yml 文件,针对不同主机去调用不同的角色

vim /etc/ansible/site.yml
---

- hosts: webservers
  remote_user: root
  roles:
     - httpd
- hosts: dbservers
  remote_user: root
  roles:
     - mysql
- hosts: lampserver
  remote_user: root
  roles:
     - httpd
     - mysql
     - php

(7)运行 ansible-playbook

cd /etc/ansible
ansible-playbook site.yml

示例:
mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta} -p
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta} -p
mkdir /etc/ansible/roles/php/{files,templates,tasks,handlers,vars,defaults,meta} -p

touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/php/{defaults,vars,tasks,meta,handlers}/main.yml

(3)编写mysql模块

vim /etc/ansible/roles/mysql/tasks/main.yml

- name: install mysql
  yum: name={{pkg}} state=latest
- name: start mysql
  service: enabled=true name={{svc}} state=started

vim /etc/ansible/roles/mysql/vars/main.yml
pkg:

  - mariadb
  - mariadb-server
  - svc: mariadb

(4)编写php模块

vim /etc/ansible/roles/php/tasks/main.yml

- name: install php
  yum: name={{pkg}} state=latest
- name: start php-fpm
  service: enabled=true name={{svc}} state=started

vim /etc/ansible/roles/php/vars/main.yml
pkg:

  - php
  - php-fpm
  - svc: php-fpm

(5)编写roles示例

vim /etc/ansible/site.yml
---

- hosts: webservers
  remote_user: root
  roles:
   - httpd
   - mysql
   - php

cd /etc/ansible
ansible-playbook site.yml

posted @   无敌小鲁班  阅读(692)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
点击右上角即可分享
微信分享提示