一站式自动化:Ansible Playbook的全面学习之旅

发布于:2023-12-07 ⋅ 阅读:(84) ⋅ 点赞:(0)

1 Playbook介绍

1.1 Playbook介绍

playbook 是由一个或多个play组成的列表
Playbook 文件使用YAML来写的

1.2 YAML

1.2.1 介绍

是一种表达资料序列的格式,类似XML
Yet Another Markup Language
2001年首次发表
www.yaml.org

1.2.2 特点

可读性好
和脚本语言交互性号
易于实现
适用程序执行流梳理方式
可扩展性强

1.2.3 语法简介

在文件中用[---]开始
在文件中用[...]结尾
次行一般书写文件内容
缩进严格
大小写敏感
key/value可以多行书写也可一行书写,一行书写用,隔开
value可以是个字符串,也可是list
一个play需要包括name和tasks
name 是描述
tasks 是动作
一个name只能包含一个task
扩展名称yml或者yaml
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2.4 YAML 列表

[Linux,C++,Java,Python]
- Linux
- C++
- Java
- Python

1.2.5 YAML的字典

字典作用存放键值

name:westos
age:12
jobs:linux

在这里插入图片描述

1.3 playbook执行命令

  • Playbook的核心组件

name #可选,建议使用多用于说明
hosts #受控主机列表
tasks #任务
#用与选择执行部分代码

ansible-playbook xxx.yml ...
--check|-C ##检测
--syntax-check ##check language
--list-hosts ##列出hosts
--list-tags ##列出tag
--list-tasks ##列出task
--limit ##指定执行主机
-v -vv ##现实过程

在这里插入图片描述

1.4 vim 设定技巧

autocmd FileType yaml setlocal ai ts=2 sw=2 et
setlocal ##设定当前文件
ai ##自动退格对齐 auto indent
ts ##tab建长度为2空格 tabstop=2
sw ##缩进长度为2 shiftwidth=2
et ##把tab键变成空格 expandtab

在这里插入图片描述

1.5 playbook项目

2 Playbook的使用

2.1 变量

2.1.1 变量命令

只能包含数字,下划线,字母
只能用下划线或字母开头

2.1.2 变量级别

全局: 从命令行或配置文件中设定的
paly: 在play和相关结构中设定的
主机: 由清单,事实收集或注册的任务

变量优先级设定:
狭窄范围高 paly>主机>全局

2.1.3 在playbook中直接定义变量

vars: 
    msg: sxl666

在这里插入图片描述

2.1.4 在文件中定义变量

vars_files: var_file.yml

在这里插入图片描述

2.1.5 使用变量

msg: "{{msg}}"

在这里插入图片描述

2.1.6 设定主机变量和清单变量

[westos1]
192.168.1.10
192.168.1.20

[westos1:vars]
msg=sxl000

在这里插入图片描述

2.1.7 目录设定变量

group_vars ##清单变量,目录中的文件名称与主机清单名称一致
host_vars ##主机变量,目录中的文件名称与主机名称一致

在这里插入图片描述
在这里插入图片描述

2.1.8 用命令覆盖变量

ansible-playbook user.yml -e "USER=hello"

2.1.9 使用数组设定变量

#vim user_var.yml
---
USER:
 lee:
 age: 18
 obj: linux
 
 westos:
 age: 20
 obj: java
#vim user.yml
- name: Create User
 hosts: all
 gather_facts: no
 vars_files:
 ./user_var.yml
 tasks:
 - name: create user
 shell:
 echo "{{USER['lee']['age']}}"
 echo "{{USER.westos.obj}}"
create web vhost
www.westos.com 80 ------ > /var/www/html ------> www.westos.com
linux.westos.com 80 ------> /var/www/virtual/westos.com/linux -----> linux.westos.com

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2.1.10 注册变量

#register 把模块输出注册到指定字符串中
---
- name: test register
 hosts: 172.25.0.254
 tasks:
 - name: hostname command
 shell:
 hostname
 register: info
 - name: show messages
 shell:
 echo "{{info['stdout']}}"

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2.1.11 事实变量

事实变量是ansible在受控主机中自动检测出的变量
事实变量中还有与主机相关的信息
当需要使用主机相关信息时不需要采集赋值,直接调用即可
因为变量信息为系统信息所以不能随意设定仅为采集信息,故被成为事实变量
---
- name: test register
 hosts: 172.25.0.254
 tasks:
 - name: show messages
 debug:
 msg: "{{ansible_facts['architecture']}}"
gather_facts: no ##在playbook中关闭事实变量收集

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2.1.12 魔法便变量

hostvars: ##ansible软件的内部信息
#eg:
ansible localhost -m debug -a "var=hostvars"
group_names: ##当前受管主机所在组
#eg:
ansible localhost -m debug -a "var=group_names"
groups: ##列出清单中所有的组和主机
#eg:
ansible localhost -m debug -a "var=groups"
inventory_hostname: ##包含清单中配置的当前授管主机的名称
#eg:
ansible localhost -m debug -m "var=inventory_hostname"

在这里插入图片描述

2.1.13 JINJA2模板

Jinja2是Python下一个被广泛应用的模版引擎
他的设计思想来源于Django的模板引擎,
并扩展了其语法和一系列强大的功能。
其中最显著的一个是增加了沙箱执行功能和可选的自动转义功能

##j2模板书写规则#
{# /etc/hosts line #} ##注释说明文件用途
127.0.0.1 localhost ##文件内容
{{ ansible_facts['all_ipv4_addresses'] }} {{ansible_facts['fqdn']}} ##使用事实变量
#j2模板在playbook中的应用#
#playbook1 
---
- name: test register
 hosts: xxxx
 tasks:
 - name: create hosts
 template:
 src: ./xxxx.j2
 dest: /mnt/hosts
#playbook2
---
- name: test.j2
 hosts: 172.25.0.254
 vars:
 students:
 - name: student1
 obj: linux
 - name: student2
 age: 18
 obj: linux
 
 tasks:
 - template:
 src: ./test.j2
 dest: /mnt/list

在这里插入图片描述

1 for循环
vim users.yml
users:
 - westos
- linux
 - ansible
vim test.j2
{% for NAME in users %}
{{ NAME }}
{%endfor%}

loop.index ##循环迭代记数从1开始
loop.index0 ##循环迭代计数从0开始

在这里插入图片描述
在这里插入图片描述

2 if判断
{% for NAME in users if not NAME == "ansible" %}
User number {{loop.index}} - {{ NAME }}
{%endfor%}
loop.index ##循环迭代记数从1开始
loop.index0 ##循环迭代计数从0开始
{% for user in students %}
name: {{user['name']}}
{%if user['age'] is defined%}
age: {{user['age']}}
{%endif%}
{% if user['age'] is not defined %}
age: null
{% endif%}
obj: {{user['obj']}}
{%endfor%}

在这里插入图片描述

2.2 加密控制

2.2.1 创建建立文件

ansible-vault create westos
vim westos-vault
lee
ansible-vault create --vault-password-file=westos-valut westos
  • 加密现有文件
ansible-vault encrypt test
  • 查看加密文件
ansible-vault view westos
ansible-vault view --vault-password-file=westos-valut westos

在这里插入图片描述

  • 编辑加密文件
ansible-vault edit westos1
ansible-vault edit --vault-password-file=westos-valut westos

在这里插入图片描述

  • 解密文件
ansible-vault decrypt westos ##文件永久解密
ansible-vault decrypt westos --output=linux ##文件解密保存为linux
  • 更改密码
ansible-vault rekey westos1
ansible-vault rekey westos1 --new-vault-password-file=key1
playbook#
ansible-playbook apache_install.yml --ask-vault-pass

在这里插入图片描述

2.3 循环

2.3.1 简单循环

loop: ##赋值列表
 - value1
 - value2
 - ...
{{item}} ##迭代变量名称
#实例#
---
- name: create file
 hosts: 172.25.0.254
 tasks:
 - name: file module
 file:
 name: /mnt/{{item}}
 state: present
 loop:
 - westos_file1
 - westos_file2

在这里插入图片描述
在这里插入图片描述

2.3.2 循环散列或字典列表

- name: create file
 hosts: 172.25.0.254
 tasks:
 - name: file module
 service:
 name: "{{ item.name}}"
 state: "{{ item.state }}"
 loop:
 - name: httpd
 state: started
 - name: vsftpd
 state: stopped

在这里插入图片描述

在这里插入图片描述

2.4 条件

when:
 - 条件1
 - 条件2
#条件判断#
= value == "字符串",value == 数字
< value < 数字
> value > 数字
<= value <= 数字
>= value >= 数字
!= value != 数字
is defined value value is defined 变量存在
is not defined value is not defined 变量不存在
in value is in value 变量为 
not in value is not in value 变量不为
bool变量 为true value value的值为true
bool变量 false not value value的值为false
value in value2 value的值在value2列表中
#多条条件组合#
when:
 条件1 and 条件2
 - 条件1
 - 条件2
when:
 条件1 or 条件2
when: >
 条件1
 or
 条件2

在这里插入图片描述
在这里插入图片描述

2.5 触发器

notify: 触发器当遇到更改是触发handlers
handlers: 触发器触发后执行的动作
#实例#
---
- name: create virtualhost for web server
 hosts: 172.25.0.254
 vars_files:
 ./vhost_list.yml
 tasks:
 - name: create document
 file:
 path: "{{web2.document}}"
 state: directory
 - name: create vhost.conf
 copy:
 dest: /etc/httpd/conf.d/vhost.conf
 content:
 "<VirtualHost *:{{web1.port}}>\n\tServerName {{web1.name}}\n\tDocumentRoot 
{{web1.document}}\n\tCustomLog logs/{{web1.name}}.log combined\n</VirtualHost>\n\n<VirtualHost *:
{{web2.port}}>\n\tServerName {{web2.name}}\n\tDocumentRoot {{web2.document}}\n\tCustomLog logs/
{{web2.name}}.log combined\n</VirtualHost>"
 notify:
 restart apache
 handlers:
 - name: restart apache
 service:
 name: httpd
 state: restarted

2.6 处理失败任务

2.6.1 ignore_errors

#作用:
当play遇到任务失败是会终止
ignore_errors: yes 将会忽略任务失败使下面的任务继续运行
#实例#
- name: test
 dnf:
 name: westos
 state: latest
 ignore_errors: yes
 
- name: create file
 file:
 path: /mnt/westos
 state: touch

在这里插入图片描述

在这里插入图片描述

2.6.2 force_handlers

#作用:
#当任务失败后play被终止也会调用触发器进程
#example
---
- name: apache change port
 hosts: 172.25.0.254
 force_handlers: yes
 vars:
 http_port: 80
 tasks:
 - name: configure apache conf file
 lineinfile:
 path: /etc/httpd/conf/httpd.conf
 regexp: "^Listen"
 line: "Listen {{ http_port }}"
 notify: restart apache
 - name: install error
 dnf:
 name: westos
 state: latest
 handlers:
 - name: restart apache
 service:
 name: httpd
 state: restarted
 enabled: yes

2.6.3 changed_when

#作用:
#控制任务在何时报告它已进行更改
---
- name: apache change port
 hosts: 172.25.0.254
 force_handlers: yes
 vars:
 http_port: 8080
 tasks:
 - name: configure apache conf file
 lineinfile:
 path: /etc/httpd/conf/httpd.conf
 regexp: "^Listen"
 line: "Listen {{ http_port }}"
 changed_when: true
 notify: restart apache
 handlers:
 - name: restart apache
 service:
 name: httpd
 state: restarted
 enabled: yes

2.6.4 failed_when

#当符合条件时强制任务失败
---
- name: test
 hosts: 172.25.0.254
 tasks:
 - name: shell
 shell: echo hello
 register: westos
 failed_when: "'hello' in westos.stdout"

2.6.5 block

block: ##定义要运行的任务
rescue: ##定义当block句子中出现失败任务后运行的任务
always: ##定义最终独立运行的任务
#测试练习#
建立playbook ~/westos.yml要求如下:
建立大小为1500M名为/dev/vdb1的设备
如果/dev/vdb不存在请输入:
 /dev/vdb is not exist
如果/dev/vdb大小不足2G请输出:
 /dev/vdb is less then 2G
并建立800M大小的/dev/vdb1
此设备挂载到/westos上

3 ansible roles

#ansible 角色简介#

  • Ansible roles 是为了层次化,结构化的组织Playbook
  • roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们
  • roles一般用于基于主机构建服务的场景中,在企业复杂业务场景中应用的频率很高
  • 以特定的层级目录结构进行组织的tasks、variables、handlers、templates、files等;相当于函数的调用把各个功能切割
    成片段来执行。
    #roles目录结构#
    files ##存放copy或script等模块调用的函数
    tasks ##定义各种task,要有main.yml,其他文件include包含调用
    handlers ##定义各种handlers,要有main.yml,其他文件include包含调用
    vars ##定义variables,要有main.yml,其他文件include包含调用
    templates ##存储由template模块调用的模板文本
    meta ##定义当前角色的特殊设定及其依赖关系,要有main.yml的文件 defaults##要有main.yml的文
    件,用于设定默认变量
    tests ##用于测试角色
    #role存放的路径在配置文件ansible.cfg中定义#
    roles_path = path/roles (默认目录:/etc/ansible/roles)
    #创建目录结构#
    $ ansible-galaxy init apache
    $ ansible-galaxy list
    #playbook中使用roles#
    playbook中使用roles:

  • hosts: server2
    roles:
  • role: role1
  • role: role2
    var1: value1 ##此处变量会覆盖roles中的定义变量
    #控制任务执行顺序#

  • hosts: server2
    roles:
  • role: role1 ##角色任务
    pre_tasks: ##角色执行前执行的play
  • tasks1
    tasks: ##普通任务
  • tasks2
    post_tasks: ##在角色和普通任务执行完毕后执行的play
  • tasks3
    handlers:
    #ansible—galaxy命令工具#
  • Ansible Galaxy 是一个免费共享和下载 Ansible 角色的网站,可以帮助我们更好的定义和学习roles。
  • ansible-galaxy命令默认与https://galaxy.ansible.com网站API通信,可以查找、下载各种社区开发的 Ansible 角色
  • ansible-galaxy在 Ansible 1.4.2 就已经被包含了
  • 在galaxy.ansible.com网站查询roles
    #安装选择的角色#
    #install https://galaxy.ansible.com roles
    $ansible-galaxy install geerlingguy.nginx
    #install local roles
    $ vim install_apache_role.yml

  • src: file:///mnt/apache.tar.gz
    name: apache
    $ ansible-galaxy install -r install_apache_role.yml
本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到