Ansible自动运维工具之playbook

目录

一.inventory主机清单

1.定义

2.变量

(1)主机变量

(2)组变量

(3)组嵌套

二.playbook基本内容

1.组成

(1)Tasks: 任务,即调用模块完成的某操作

(2)Variables: 变量

(3)Templates: 模板

(4)Handlers: 处理器,当某条件满足时,触发执行的操作

(5)Roles: 角色

2.基本语法

(1)大小写敏感

(2)使用缩进表示层级关系

(3)缩进时不允许使用tab键、只允许使用空格

(4)缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

3.数据结构

(1)对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes)/ 字典(dictionary)

(2)数组:一组按次序排列的值,又称为序列(sequence)/ 列表(list)

(3)纯量:单个的、不可再分的值

三.playbook示例

1.为每个任务定义远程执行用户

2.指定远程主机切换用户执行剧本

3.tasks忽略错误,强制返回成功

(1)Play的主体部分是task列表,task列表中的各任务按次序逐个在hosts中指定的主机上执行,即在所有主机上完成第一个任务后再开始。在运行playbook时 (从上到下执行),如果一个host执行task失败, 整个tasks都会停止。

(2)每一个task必须有一个名称 name,这样在运行playbook时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个task的。

4.针对多个主机节点执行剧本

5.Handlers概述 

6.引入变量

(1)通过ansible命令参数-e传递

(2) 直接在yaml中定义,或者内置变量 

(3)引用主机清单内自定义变量 

7.条件测试

(1)单条件判断

(2)多条件判断 

(3)组条件判断 

(4)迭代

四.template

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

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

3.编写 playbook

五.tags模块

六.playbook使用roles

1.roles内各自目录含义

2.在playbook中使用roles


一.inventory主机清单

1.定义

Inventory支持对主机进行分组,每个组内可以定义多个主机,每个主机都可以定义在任何一个或多个主机组内。

2.变量

(1)主机变量
[webservers]
192.168.10.14 ansible_port=22 ansible_user=root ansible_password=abc1234
(2)组变量
[webservers:vars]			#表示为 webservers 组内所有主机定义变量
ansible_user=root
ansible_password=abc1234

[all:vars]					#表示为所有组内的所有主机定义变量
ansible_port=22
(3)组嵌套
[nginx]
192.168.10.20
192.168.10.21
192.168.10.22

[apache]
192.168.10.3[0:3]

[webs:children]		#表示为 webs 主机组中包含了 nginx 组和 apache 组内的所有主机
nginx
apache

二.playbook基本内容

1.组成

(1)Tasks: 任务,即调用模块完成的某操作
(2)Variables: 变量
(3)Templates: 模板
(4)Handlers: 处理器,当某条件满足时,触发执行的操作
(5)Roles: 角色

2.基本语法

(1)大小写敏感
(2)使用缩进表示层级关系
(3)缩进时不允许使用tab键、只允许使用空格
(4)缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
hosts 定义节点,可以是组
remote_user 是你以什么用户身份进行登陆
tasks 是你的任务
become:yes 表示切换用户
become_user: mysql 表示切换到mysql用户,配合上一条使用
- name: 为下面执行的操作起名

3.数据结构

(1)对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes)/ 字典(dictionary)
(2)数组:一组按次序排列的值,又称为序列(sequence)/ 列表(list)
(3)纯量:单个的、不可再分的值

三.playbook示例

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='xxx'			     #指定从某个task开始运行
 
- hosts: webserver   #指定主机组,可以是一个或多个组
 
remote_user: root 	 #指定远程主机执行的用户名
参数 说明
-k(-ask-pass) 用来交互输入ssh密码
-K(-ask-become-pass) 用来交互输入sudo密码
-u 指定用户
-e 引入变量值

1.为每个任务定义远程执行用户

cd /opt
vim 1.yaml
 
- hosts: mysql
  remote_user: root
  tasks:
  - name: test connection
    ping:
    remote_user: mysql  
	
ansible mysql -m user -a 'name=mysql'
ansible mysql -m shell -a 'echo 123123 | passwd --stdin mysql'
ansible-playbook 1.yaml -k
123123

2.指定远程主机切换用户执行剧本

vim 2.yaml
 
- hosts: mysql
  remote_user: root
  become: yes         
  become_user: mysql   
  tasks:
  - name: copy text
    copy: src=/etc/fstab dest=/home/mysql/fstab.bak
 
ansible-playbook 2.yaml

3.tasks忽略错误,强制返回成功

(1)Play的主体部分是task列表,task列表中的各任务按次序逐个在hosts中指定的主机上执行,即在所有主机上完成第一个任务后再开始。在运行playbook时 (从上到下执行),如果一个host执行task失败, 整个tasks都会停止。
(2)每一个task必须有一个名称 name,这样在运行playbook时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个task的。

错误示例:遇到错误task自动停止,apache服务不会继续安装

vim 3.yaml
 
- hosts: webserver
  remote_user: root
  tasks:
  - name: stop selinux
    command: '/usr/sbin/setenforc 0'
  - name: install httpd
    yum: name=httpd
  - name: start httpd
    service: name=httpd state=started
 
ansible-playbook 3.yaml

加入ignore_errors: True 忽略错误,报错后继续执行

vim 3.yaml
 
- hosts: webserver
  remote_user: root
  tasks:
  - name: stop selinux
    command: '/usr/sbin/setenforc 0'
    ignore_errors: True
  - name: install httpd
    yum: name=httpd
  - name: start httpd
    service: name=httpd state=started
                                                   
ansible-playbook 3.yaml                       

4.针对多个主机节点执行剧本

vim 4.yaml
  
- hosts: webserver
  remote_user: root
  tasks:
  - name: remove httpd
    yum: name=httpd state=absent
 
- hosts: mysql
  remote_user: root
  tasks:
  - name: copy file
    copy: src=/etc/fstab dest=/opt/haha.txt

5.Handlers概述 

Handlers也是一些task的列表, 和一般的task并没有什么区别。
是由通知者进行的notify,如果没有被notify,则Handlers不会执行,假如被notify了 ,则Handlers被执行不管有多少个通知者进行了notify,等到play中的所有task执行完成之后,handlers也只会被执行一次

vim 5.yaml
 
- hosts: webserver
  remote_user: root
  tasks:
  - name: remove httpd
    yum: name=httpd state=absent
 
  - name: start firewalld
    service: name=firewalld state=started
 
  - name: setenforce 0 && install httpd
    command: '/usr/sbin/setenforce 0'
    notify:
    - step one
 
  - name: stop firewalld && start httpd
    service: name=firewalld state=stopped
    notify:
    - step two
 
  handlers:
 
  - name: step one
    yum: name=httpd
 
  - name: step two
    service: name=httpd state=started
 
 
ansible-playbook 5.yaml

6.引入变量

(1)通过ansible命令参数-e传递
vim 6_1.yaml
 
- hosts: mysql
  remote_user: root
  vars:
  - user:
  tasks:
  - name: add user
    user: name={{user}}
 
ansible-playbook 6_1.yaml -e "user=wangwu"
ansible mysql -a 'tail -1 /etc/passwd'

(2) 直接在yaml中定义,或者内置变量 
vim 6_2.yaml
 
- hosts: mysql
  remote_user: root
  vars:
  - user: lisi
  tasks:
  - name: add user
    user: name={{user}}
 
ansible-playbook 6_2.yaml
ansible mysql -a 'tail -1 /etc/passwd'

vim 6_2.yaml
 
- hosts: mysql
  remote_user: root
  tasks:
  - name: copy file
    copy: content="{{ansible_all_ipv4_addresses}}" dest=/opt/vars.txt
 
ansible-playbook 6_2.yaml
ansible mysql -a 'ls /opt'
ansible mysql -a 'cat /opt/vars.txt'

(3)引用主机清单内自定义变量 
vim /etc/ansible/hosts
 
[webserver]
192.168.227.101
[mysql]
192.168.227.102  user=wsk
 
vim 6_3.yaml
 
- hosts: mysql
  remote_user: root
  tasks:
  - name: add user
    user: name={{user}}
 
ansible-playbook 6_3.yaml
ansible mysql -a 'tail -1 /etc/passwd'

7.条件测试

如果需要根据变量、facts (setup) 或此前任务的执行结果来作为某task执行与否的前提时要用到条件测试,在Playbook中条件测试使用。在task后添加when子句即可使用条件测试: when子句支持 jinjia2 表达式或语法

(1)单条件判断
vim 7_1.yaml
 
 - hosts: mysql
   remote_user: root
   tasks:
     - name: "shutdown CentOS"
       command: /sbin/shutdown -h now
       when: ansible_distribution == "CentOS"
 
ansible-playbook 7_1.yaml

(2)多条件判断 
vim 7_2.yaml
 
- hosts: mysql
  remote_user: root
  tasks:
  - name: "shut down CentOS 7 systems"
    command: /sbin/shutdown -r now
    when:
    - ansible_distribution == "CentOS"
    - ansible_distribution_major_version == "7"
 
ansible-playbook 7_2.yaml
(3)组条件判断 
vim 7_3.yml
 
- hosts: mysql
  remote_user: root
  tasks:
  - name: "shut down CentOS 6 and Debian 7 systems"
    command: /sbin/shutdown -t now
    when: (ansible_distribution == "CentOS" and ansible_distribution_major_version == "6") or (ansible_distribution == "Debian" and ansible_distribution_major_version == "7")
 
ansible-playbook 7_3.yaml
(4)迭代
vim 7_4.yaml
 
- hosts: webserver
  remote_user: root
  tasks:
  - name: install
    yum: name={{item}} state=latest
    with_items:
    - httpd
    - rpcbind
    - nfs-utils
 
ansible-playbook 7_4.yaml
ansible webserver -a 'rpm -q httpd'
ansible webserver -a 'rpm -q rpcbind'
ansible webserver -a 'rpm -q nfs-utils'

四.template

Jinja是基于Python的模板引擎。Template类是Jinja的一个重要组件,可以看作是一个编译过的模板文件,用来产生目标文本,传递Python的变量给模板去替换模板中的标记。

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

yum -y install httpd
rpm -qc httpd
cp /etc/httpd/conf/httpd.conf /opt/httpd.conf.j2
vim /opt/httpd.conf.j2
Listen {{http_port}}				#42行,修改
ServerName {{domain}}       		#95行,修改

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

vim /etc/ansible/hosts

[mysql]
192.168.227.101 port=80 domain=www.wsk1.com
192.168.227.102 port=80 domain=www.wsk2.com

3.编写 playbook

cd /opt
vim a.yaml
 
- hosts: mysql
  remote_user: root
  vars:
  - package: httpd
  - service: httpd
  tasks:
  - name: install service
    yum: name={{package}} state=latest
  
  - name: httpd.conf
    template: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
    notify: restart service
   
  
  - name: start service
    service: name={{service}} state=started enabled=true
 
  handlers:
  - name: restart service
    service: name={{service}} state=restarted

ansible-playbook a.yaml
ansible mysql -a 'rpm -q httpd'
ansible mysql -a 'systemctl status httpd'
ansible mysql -a 'systemctl is-enabled httpd'

五.tags模块

可以在一个playbook中为某个或某些任务定义“标签”,在执行此playbook时通过ansible-playbook命令使用--tags选项能实现仅运行指定的tasks。
playbook还提供了一个特殊的tags为always。作用就是当使用always当tags的task时,无论执行哪一个tags时,定义有always的tags都会执行。

vim b.yaml
 
- hosts: mysql
  remote_user: root
  tasks:
  - name: touch file one
    file: path=/opt/1.txt state=touch
    tags:
    - file one
 
  - name: touch file two
    file: path=/opt/2.txt state=touch
    tags:
    - file two
 
  - name: touch file three
    file: path=/opt/3.txt state=touch
    tags:
    - file three
 
 
ansible-playbook b.yaml --tags="file two"
ansible-playbook b.yaml --skip-tags="file one"

六.playbook使用roles

Ansible为了层次化、结构化地组织Playbook,使用了角色(roles),roles可以根据层次型结构自动装载变量文件、task以及handlers等。简单来讲,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们。roles一般用于基于主机构建服务的场景中,但也可以用于构建守护进程等场景中。

1.roles内各自目录含义

files 用来存放copy模块或script模块调用的文件
templates 用来存放jinjia2模板,template模块会自动在此目录中寻找jinjia2模板文件
tasks 此目录应当包含一个main.yml文件,用于定义此角色的任务列表,此文件可以使用include包含其它的位于此目录的task文件
handlers 此目录应当包含一个main.yml文件,用于定义此角色中触发条件时执行的动作
vars 此目录应当包含一个main.yml文件,用于定义此角色用到的变量
defailts 此目录应当包含一个main.yml文件,用于为当前角色设定默认变量
meta 此目录应当包含一个main.yml文件,用于定义此角色的特殊设及其依赖关系

2.在playbook中使用roles

#创建服务组件工作目录
mkdir -p /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta} 
mkdir -p /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta} 
mkdir -p /etc/ansible/roles/php/{files,templates,tasks,handlers,vars,defaults,meta} 
 
#创建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
touch /etc/ansible/roles/php/{defaults,vars,tasks,meta,handlers}/main.yml
#编写httpd模块
vim /etc/ansible/roles/httpd/tasks/main.yml 
 
- name: install httpd
  yum: pkg={{pkg}} state=latest
 
#定义变量pkg软件包
vim /etc/ansible/roles/httpd/vars/main.yml 
 
pkg: httpd
#编写mysql模块
vim /etc/ansible/roles/mysql/tasks/main.yml 
 
- name: install mysql
  yum: pkg={{pkg}} state=latest
 
vim /etc/ansible/roles/mysql/vars/main.yml 
 
pkg: mariadb*
#编写php模块
vim /etc/ansible/roles/php/tasks/main.yml 
 
- name: install php
  yum: pkg={{pkg}} state=latest
 
vim /etc/ansible/roles/php/vars/main.yml 
 
pkg: php
#编写roles示例
vim /etc/ansible/site.yml
remote_user: root
roles:
 - httpd
 - mysql
 - php

相关推荐

  1. 自动化工具Ansibleplaybooks剧本

    2024-05-13 05:32:03       24 阅读
  2. 自动化工具----Ansible playbook详解

    2024-05-13 05:32:03       30 阅读
  3. Ansible自动化工具---Playbook

    2024-05-13 05:32:03       14 阅读
  4. 开源IT自动化工具Ansible Playbook介绍

    2024-05-13 05:32:03       20 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-13 05:32:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-13 05:32:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-13 05:32:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-13 05:32:03       20 阅读

热门阅读

  1. Kotlin语言泛型的形变是什么?

    2024-05-13 05:32:03       11 阅读
  2. undolog

    undolog

    2024-05-13 05:32:03      12 阅读
  3. 【C++】手搓读写ini文件源码

    2024-05-13 05:32:03       8 阅读
  4. 如何创建族表

    2024-05-13 05:32:03       12 阅读
  5. [UUCTF 2022 新生赛]ez_unser

    2024-05-13 05:32:03       13 阅读
  6. 一篇简单易懂的十大机器学习算法

    2024-05-13 05:32:03       13 阅读
  7. AtCoder Beginner Contest 353

    2024-05-13 05:32:03       12 阅读
  8. c#设置或者获取一个泛型整数指定bit的值

    2024-05-13 05:32:03       12 阅读
  9. iOS 沙盒图片的存取

    2024-05-13 05:32:03       13 阅读
  10. go语言切片slice使用细节和注意事项整理

    2024-05-13 05:32:03       9 阅读
  11. GO: json 处理

    2024-05-13 05:32:03       17 阅读
  12. 【GoLang基础】defer关键字有什么作用?

    2024-05-13 05:32:03       12 阅读