Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等

本实验是基于前篇《Ansible(4)—— Playbook语法之变量的类型》实验环境下进行的,其中普通用户devops已经创建好,授权、免密都配置好了。在编辑好playbook.yml下进行的
上一实验的博客链接:https://blog.csdn.net/dghfttgv/article/details/104808636

目录

一、playbook中一些常用语句块的用法

(一)、ignore_errors: True (忽略编译报错  )

  • 1、ignore_errors: True 语法的简介
  • 2、没有添加ignore_errors: True  语句    
  • 3、添加: ignore_errors: True 语句                   

(二)loop语句循环变量的用法

   方法一:在playbook.yml文件中直接循环loop后边的变量

  • 步骤一:  编辑playbook中的内容
  • 步骤二: 测试:

   方法二:  通过调用文件中的变量来实现

  • 步骤一: 创建变量文件
  • 步骤二: 修改playbook文件(红色字体为修改的内容)
  • 步骤三: 测试

1、没有添加change when: false 抑制更改的语句

  • 步骤一:创建yml文件打印时间(没有添加抑制更改的语句)
  • 步骤二: 测试:

2、带有抑制修改的语句

  • 步骤一:在test.yml文件中添加 change when: false
  • 步骤二测试:

(三)、block语句块、  when判断语句(部署haprox负载均衡)

1、使用playbook.yml文件自动部署haprox负载均衡

  • 步骤一: 给server1上传密钥
  • 步骤二: 修改hosts文件信息 、配置 /etc/haproxy/haproxy.cfg 文件信息
  • 步骤三: 配置playbook.yml文件
  • 步骤四: 测试

2、向haproxy集群中添加新的后端

  • 步骤一: 设置server4环境
  •     1、给server4的普通用户设置操作权限
  •     2、给server4转递密钥
  • 步骤二:编辑hosts文件把server4添加到prod组里
  • 步骤三:在server4上自动安装apache、将server4加入集群
  • 步骤四:测试:

二、判断语句的用法

(一)、 change when: false 抑制更改信息语句

1、没有添加change when: false 抑制更改的语句

  • 步骤一:创建yml文件打印时间(没有添加抑制更改的语句)
  • 步骤二: 测试:

2、带有抑制修改的语句

  • 步骤一:在test.yml文件中添加 change when: false
  • 步骤二测试:

(二)、failed_when web_package == "service" 语句的用法

1、验证failed_when web_package == "service" 语句的用法

  • 步骤一:编辑 test.yml
  • 步骤二:测试:

2、异常抛出(出现报错是指定输出相应的值)

  • 步骤一:编辑test.yml文件
  • 步骤二:测试:

三、playbook变量文件的管理

(一)、文件的加密、解密

1、文件加密

  • 步骤一: 查看文件加密相关命令的用法、给文件进行加密
  • 步骤二:测试:

2、给文件解密

  • 步骤一:  输入解密命令
  • 步骤二: 测试 

(二)、变量文件的管理

1、文件管理的简介

2、创建文件管理的目录

  •       步骤一: 下载tree命令、创建相应的目录
  •       步骤二:编辑文件主机的变量信息
  •       步骤三: 测试

 

四、 导入和包含task

1、静态加载

  • 步骤一:编辑play3.yml文件
  • 步骤二:测试:

2、静态加载

  • 步骤一:修改配置文件
  • 步骤二:测试:

 

 

正文:

一、playbook中一些常用语句块的用法

(一)、ignore_errors: True (忽略编译报错  )

  • 1、ignore_errors: True 语法的简介
  • 2、没有添加ignore_errors: True  语句    
  • 3、添加: ignore_errors: True 语句                   

(二)loop语句循环变量的用法

   方法一:在playbook.yml文件中直接循环loop后边的变量

  • 步骤一:  编辑playbook中的内容
  • 步骤二: 测试:

   方法二:  通过调用文件中的变量来实现

  • 步骤一: 创建变量文件
  • 步骤二: 修改playbook文件(红色字体为修改的内容)
  • 步骤三: 测试:

(三)、block语句块、  when判断语句(部署haprox负载均衡)

1、使用playbook.yml文件自动部署haprox负载均衡

  • 步骤一: 给server1上传密钥
  • 步骤二: 修改hosts文件信息 、配置 /etc/haproxy/haproxy.cfg 文件信息
  • 步骤三: 配置playbook.yml文件
  • 步骤四: 测试

2、向haproxy集群中添加新的后端

  • 步骤一: 设置server4环境
  •     1、给server4的普通用户设置操作权限
  •     2、给server4转递密钥
  • 步骤二:编辑hosts文件把server4添加到prod组里
  • 步骤三:在server4上自动安装apache、将server4加入集群
  • 步骤四:测试:

(一)、ignore_errors: True (忽略编译报错  )

  1、ignore_errors: True 语法的简介

  •   ignore_errors: True  用来忽视错误信息
  • Asible的自带模块中 command模块和shell模块无需使用key=value格式:


tasks:
 -name: disable selinux
  command: /sbin/setenforce

  • 使用 command 和 shell 时 我们需需要关心返回码信息

tasks:
 -name: run this command and ignore the result
  shell://user/bin/somecommand
  ignore_errors: True                          //返回值如果步为0,就会报错.tasks停止.

 

 

2、没有添加ignore_errors: True  语句                      

2.1.、修改hosts文件中的变量信息

[ansible@server1 ~]$ vim hosts
[test]
server2 web_package=http            ##修改程错误的信息

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第1张图片


 

  2.2、编译:

[ansible@server1 ~]$ ansible-playbook playbook.yml          

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第2张图片

编译失败 !!!

在配置playbook.yml 文件执行的过程中如果出现报错系统将会在报错的地方停下无法再进行后边的工作

 

3、添加: ignore_errors: True 语句                  

[ansible@server1 ~]$ vim playbook.yml

---
- hosts: test
  tasks:
    - name: install {{  web_package }}                ##是名称测不需要加双引号
      yum:
        name: "{{  web_package }}"                        ##使用变量代替原来名称要加双引号
        state: present                     ##运行的状态

 

      ignore_errors: True                 ##返回值如果步为0,就会报错.tasks停止

 

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第3张图片

 

3.1、验证:

3.1.1、编译:

[ansible@server1 ~]$ ansible-playbook playbook.yml            

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第4张图片

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第5张图片

 

 

(二)loop语句循环变量的用法

(block语句块  when判断语句)方法一:在playbook.yml文件中直接循环loop后边的变量

  • 步骤一:  编辑playbook中的内容changed_when: false
  • 步骤二: 测试:

方法二:通过调用文件中的变量来实现

  • 步骤一: 创建变量文件
  • 步骤二: 修改playbook文件(红色字体为修改的内容)
  • 步骤三: 测试:

loop循环中存放的字典型数据,用 item.key值 调用value值

以创建用户为例:

方法一:在playbook.yml文件中直接循环loop后边的变量

步骤一:
编辑playbook中的内容

[ansible@server1 ~]$ vim playbook.yml

 

- hosts: test
  tasks:
    - name: create users
      user:changed_when: false
        name: "{{ item.user }}"                                                                 ##变量对应的是loop语句块中的内容
        password: "{{ item.passwd|password_hash('sha512') }}"
      loop:                                                                                              ##loop语句块按顺序循环创建下边的内容
        - { user: user1, passwd: westos }
        - { user: user2, passwd: redhat }
  tags: user

 

步骤二:

测试:

1.1、编译

[ansible@server1 ~]$ ansible-playbook playbook.yml -t user

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第6张图片

(用户已经被创建)

1.2、在server2上:

[root@server2 ~]# cat /etc/shadow

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第7张图片

 

方法二:
通过调用文件中的变量来实现

步骤一:

创建变量文件

[ansible@server1 ~]$ mkdir vars                                       ##创建变量目录
[ansible@server1 ~]$ cd vars/
[ansible@server1 vars]$ vim userlist.yml                            ##编辑变量文件 


---
userlist:                                            ##userlist块中对应以下的变量
- user: user1
  passwd: westos
- user: user2
  passwd: redhat
- user: user3
  passwd: redhat

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第8张图片


步骤二:
修改playbook文件(红色字体为修改的内容)


[ansible@server1 ~]$ vim playbook.yml

步骤二:...


- hosts: test
  vars_files:                                                                     ##指定的变量的文件的名称
    - vars/userlist.yml                                                         ##指定的读取变量文件的路径
  tasks:
    - name: create users
      user:
        name: "{{ item.user }}"
        password: "{{ item.passwd|password_hash('sha512') }}"
      loop: "{{ userlist }}"                                                     ##循环userlist中的 内容
  tags: user

...

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第9张图片

 

步骤三:
测试:

1.1、编译

[ansible@server1 ~]$ ansible-playbook playbook.yml  -t user

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第10张图片

when、

1.2、在server2上:

[root@server2 ~]# cat /etc/passwd

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第11张图片

 

 

(三)、block语句块、  when判断语句(部署haprox负载均衡)

1、使用playbook.yml文件自动部署haprox负载均衡

  • 步骤一: 给server1上传密钥
  • 步骤二: 修改hosts文件信息 、配置 /etc/haproxy/haproxy.cfg 文件信息
  • 步骤三: 配置playbook.yml文件
  • 步骤四: 测试

2、向haproxy集群中添加新的后端

  • 步骤一: 设置server4环境
  •     1、给server4的普通用户设置操作权限
  •     2、给server4转递密钥
  • 步骤二:编辑hosts文件把server4添加到prod组里
  • 步骤三:在server4上自动安装apache、将server4加入集群
  • 步骤四:测试:

例:使用playbook.yml文件自动部署haprox负载均衡

 

1、使用playbook.yml文件自动部署haprox负载均衡

步骤一:
给server1上传密钥:

[ansible@server1 ~]$ ssh-copy-id server1

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第12张图片


步骤二:
修改hosts文件信息 、配置 /etc/haproxy/haproxy.cfg 文件信息

1、修改hosts文件信息


[ansible@server1 ~]$ cat  hosts
[balancer]                          ##把server1添加到负载均衡的组里
server1  
[test]
server2

[prod]
server3

[webservers:children]
test
prod

[webservers:vars]
http_port=80

 

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第13张图片

 

2、配置 /etc/haproxy/haproxy.cfg 文件信息

[ansible@server1 ~]$ vim haproxy.cfg.j2       ##编辑变量文件信息 

...

#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend  main *:80
    default_backend             app

#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
backend app
    balance     roundrobin
{% for host in groups['webservers'] %}
   server {{  hostvars[host]['ansible_facts']['hostname'] }} {{ hostvars[host]['ansible_facts']['eth0']['ipv4']['address'] }}:80 check
{% endfor %}

...

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第14张图片

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第15张图片

 

步骤三:
配置playbook.yml文件

[ansible@server1 ~]$vim  playbook.yml

...
- hosts: all                                          
  tasks:       
    - name: deployment haproxy                           ##部署 haproxy                          
      block:                                                             ##block语句块与下边的when语句向对应
        - name: install haproxy
          yum:                                                          ##安装haproxy
            name: haproxy
            state: present
        - name: config haproxy                            ##将当前目录下的haproxy.cfg.j2文件中的变量信息复制到/etc/haproxy/haproxy.cfg文件中
          template:
            src: haproxy.cfg.j2                    
            dest:  /etc/haproxy/haproxy.cfg
          notify: restart haproxy                                      ##触发器              
        - name: start haproxy                                         ##开启haproxy服务
          service:
            name: haproxy
            state: started
      when: ansible_hostname == 'server1'                ##判断当检测到server1时安装haproxy软件否测跳过
  handlers:                                                                 ##触发器
    - name: restart haproxy
      service:
        name: haproxy
        state: reloaded
  tags: haproxy

...

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第16张图片

步骤四:
测试 :
1.1、编译

[ansible@server1 ~]$ ansible-playbook playbook.yml -t haproxy

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第17张图片

 

1.2、查看  /etc/haproxy/haproxy.cfg 中的文件信息

[ansible@server1 ~]$ vim /etc/haproxy/haproxy.cfg

 

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第18张图片

 

1.3、测试负载均衡:

在srever1上:

[ansible@server1 ~]$ curl server1

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第19张图片

 


2、向haproxy集群中添加新的后端

在集群中加入server4

步骤一:
设置server4环境
 

1、给server4的普通用户设置操作权限

[root@server4 tmp]# visudo
ansible ALL=(ALL)       NOPASSWD: ALL

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第20张图片

2、给server4转递密钥

[ansible@server1 ~]$ ssh-copy-id  server4

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第21张图片


步骤二:

编辑hosts文件把server4添加到prod组里

[ansible@server1 ~]$ cat  hosts
[balancer]
server1


[test]
server2

[prod]
server3
server4

[webservers:children]
test
prod

[webservers:vars]
http_port=80

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第22张图片


步骤三:

在server4上自动安装apache、将server4加入集群
编译 :

[ansible@server1 ~]$ ansible-playbook playbook.yml  -t apache,haproxy

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第23张图片

 

步骤四:

测试:
1.1、在server4上查看80端口是否打开

[root@server4 tmp]# netstat  -anltp     
tcp        0      0 172.25.6.4:80           0.0.0.0:*               LISTEN      2153/httpd   

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第24张图片

1.2、在server1上查看/etc/haproxy/haproxy.cfg文件中server4是否被成功的添加

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第25张图片

1.3、查看负载均衡的效果

[ansible@server1 ~]$ curl server1           ##访问server1主机

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第26张图片

 

 

二、判断语句的用法

(一)、 change when: false 抑制更改信息语句

1、没有添加change when: false 抑制更改的语句

  • 步骤一:创建yml文件打印时间(没有添加抑制更改的语句)
  • 步骤二: 测试:

2、带有抑制修改的语句

  • 步骤一:在test.yml文件中添加 change when: false
  • 步骤二测试:

(二)、failed_when web_package == "service" 语句的用法

1、验证failed_when web_package == "service" 语句的用法

  • 步骤一:编辑 test.yml
  • 步骤二:测试:

2、异常抛出(出现报错是指定输出相应的值)

  • 步骤一:编辑test.yml文件
  • 步骤二:测试:
  • 处理任务失败

抑制更改  针对一些命令对系统不做修改但是有报错的
changed_when: false  这个指令用来改变状态报告


编辑一个输出时间变量的yml文件验证 changed_when: false语句

(在文件中只打印时间并不会对系统做修改)

 

1、没有添加抑制更改的语句

步骤一:

创建yml文件打印时间(没有添加抑制更改的语句)


[ansible@server1 ~]$ vim  test.yml

---
- hosts: localhost
  become: no
  tasks:
    - name: local time            ##执行一个命令
      command: date               ##时间
      register: result            ##注册变量
    - name: print time
      debug:
        var: result.stdout        ##打印结果

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第27张图片


步骤二

测试:

1.1、编译

[ansible@server1 ~]$ ansible-playbook test.yml


PLAY [localhost] ******************************************************************************************************

TASK [Gathering Facts] ************************************************************************************************
ok: [localhost]

TASK [local time] *****************************************************************************************************
changed: [localhost]        ##并没有对系统做修改但是依然显示有修改的信息

TASK [print time] *****************************************************************************************************
ok: [localhost] => {

  • 步骤一: 设置server4环境
  •     1、给server4的普通用户设置操作权限
  •     2、给server4转递密钥
  • 步骤二:编辑hosts文件把server4添加到prod组里
  • 步骤三:在server4上自动安装apache、将server4加入集群
  • 步骤四:测试:

 

    "result.stdout": "Tue Mar 10 09:16:29 EDT 2020"
}

PLAY RECAP ************************************************************************************************************
localhost                  : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
                                   (报有修改的信息)

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第28张图片

 

2、带有抑制修改的语句

步骤一:
在test.yml文件中添加  change when: false          ##抑制更改信息

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第29张图片

 

步骤二:

测试:

[ansible@server1 ~]$ ansible-playbook test.yml

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第30张图片

总结:在实际的生产环境中编写playbook时需要编写大量的变量信息因为涉及到实际环境的使用所以一般系统被更改可能对实际的山产造成不可估量的损失,所以使用  change when: false   语句来抑制更改信息能避免很多不必要的麻烦,减运维人员的工作量

 

 

(二)、failed_when web_package == "service" 语句的用法

三个语句的别边

block\

 ...

rescue       (上边的block块报了下边的rescue才会去运行)

...

always

...

判断系统之前有没有运行过相关的动作如果有会报错
例如:
安装http服务如果检测到已经安装有http则会报错

ailed_when web_package == "httpd"    ##更改任务运行后的状态,但不会更改任务本身的行为

failed_when web_package == "service" 语句  更改任务运行后的状态,但不会更改任务本身的行为

1、验证failed_when web_package == "service" 语句的用法

  • 步骤一:编辑 test.yml
  • 步骤二:测试:

2、异常抛出(出现报错是指定输出相应的值)

  • 步骤一:编辑test.yml文件
  • 步骤二:测试:

 

1、验证failed_when web_package == "service" 语句的用法

步骤一:

编辑 test.yml
 

[ansible@server1 ~]$ vim test.yml

- hosts: server2
  tasks:
    - name: deploy apache
      block:
        - name: install webserver
          yum:
            name: httpd
            state: present
          failed_when: web_package == "httpd"                  ##上边的语句块进行判断  

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第31张图片

 

步骤二:

测试:
编译(有报错 )

[ansible@server1 ~]$ ansible-playbook test.yml     

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第32张图片

 

 

2、异常抛出(出现报错是指定输出相应的值)

(上边运行如果错误则会把问题抛向指定的值)   只改变报告的最终状态 并不改变任务的本身

步骤一:

编辑test.yml文件

[ansible@server1 ~]$ vim test.yml

- hosts: server2
  tasks:
    - name: deploy apache
      block:
        - name: install webserver
          yum:
            name: httpd
            state: present
          failed_when:  yes       ##判断上边运行错误之后会指向下边定义的值
      rescue:                            ##错误抛出
        - debug:
            msg: rescue is runing  !!!!
~                                                                 

 

步骤二:

测试:

[ansible@server1 ~]$ ansible-playbook test.yml

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第33张图片

 

 

三、playbook变量文件的管理

(一)、文件的加密、解密

1、文件加密

  • 步骤一: 查看文件加密相关命令的用法、给文件进行加密
  • 步骤二:测试:

2、给文件解密

  • 步骤一:  输入解密命令
  • 步骤二: 测试 

(二)、变量文件的管理

1、文件管理的简介

  • 步骤一: 设置server4环境
  •     1、给server4的普通用户设置操作权限
  •     2、给server4转递密钥
  • 步骤二:编辑hosts文件把server4添加到prod组里
  • 步骤三:在server4上自动安装apache、将server4加入集群
  • 步骤四:测试:

 

2、创建文件管理的目录

  •       步骤一: 下载tree命令、创建相应的目录
  •       步骤二:编辑文件主机的变量信息
  •       步骤三: 测试


加密文件的使用的相关命令

[ansible@server1 ~]$ ansible-playbook playbook.yml  -t user --ask-vault-pass     ##给文件设置密码
[ansible@server1 ~]$ ansible-vault view vars/userlist.yml    ##查看文件需要输入密码
[ansible@server1 ~]$ ansible-vault edit vars/userlist.yml      ##编辑文件需要输入密码

 

1、文件加密


步骤一:
1、查看文件加密相关命令的用法

[ansible@server1 ~]$ ansible-vault --help

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第34张图片

 

(端口信息已经改变说明 创建的目录能被系统识别到)

 

2、给文件进行加密

[ansible@server1 ~]$ ansible-vault encrypt vars/userlist.yml

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第35张图片

 

步骤二:

测试:
1.1、查看加密文件的内容 :

[ansible@server1 ~]$ cat vars/userlist.yml

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第36张图片

 

1.2、检测文件需要输入密码认证
测试:

[ansible@server1 ~]$ ansible-playbook playbook.yml  -t user --ask-vault-pass
Vault password:

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第37张图片

(因为playbook文件需要调用加密文件中的内容所以需要输出密码才可以访问)
 

1.3、查看文件需要输入密码:

[ansible@server1 ~]$ ansible-vault view vars/userlist.yml


1.4、编辑文件需要输入密码:

[ansible@server1 ~]$ ansible-vault edit vars/userlist.yml

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第38张图片
 

2、给文件解密

步骤一:

输入解密命令

[ansible@server1 ~]$ ansible-vault decrypt vars/userlist.yml      ##文加解密
Vault password:

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第39张图片

 

步骤二:

测试

[ansible@server1 ~]$ cat  vars/userlist.yml     ##查看文件中的内容

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第40张图片

 

 

(二)、变量文件的管理

1、文件管理的简介

2、创建文件管理的目录

  •       步骤一: 下载tree命令、创建相应的目录
  •       步骤二:编辑文件主机的变量信息
  •       步骤三: 测试

1、文件管理的简介

  • 在相应文件下写入主机变量文件
  • platbook文件在检测的时候不需要在指定相应的变量路径 系统能自动识别变量所在的位置

├── {
├── \\
├── demo
│   ├── ansible.cfg
│   └── inventory
├── docker
├── group_vars
│   └── webservers
│       └── vars
├── haproxy.cfg.j2
├── hostinfo.j2
├── hosts
├── host_vars
│   └── server2
│       ├── vars
│       └── vault
├── httpd.conf.j2
├── index.html
├── install
├── playbook.yml
├── test.j2
├── test.yml
└── vars
    └── userlist.yml

 

  • group_vars 管理文件主机变量
  • host_vars  管理主机变量
  • vars  存放纯文本信息
  • vault  存放加密信息的文加

 

2、创建文件管理的目录
 

步骤一:

 

下载tree命令、创建相应的目录

1、下载tree命令(方便查看各个目录以及文件之间的关系

[ansible@server1 ~]$ sudo yum install tree -y        ##下载tree命令

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第41张图片

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第42张图片


2、创建相应的目录

[ansible@server1 ~]$ mkdir group_vars      ## 管理文件主机变量
[ansible@server1 ~]$
[ansible@server1 ~]$ mkdir host_vars         ##管理主机变量
[ansible@server1 ~]$
[ansible@server1 ~]$ cd group_vars/
[ansible@server1 group_vars]$
[ansible@server1 group_vars]$
[ansible@server1 group_vars]$ mkdir webservers
[ansible@server1 group_vars]$ cd webservers/
[ansible@server1 webservers]$
[ansible@server1 webservers]$ vim vars

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第43张图片

步骤二:

1、编辑文件主机的变量信息

[ansible@server1 ~]$ cd group_vars/
[ansible@server1 group_vars]$ cd webservers/
[ansible@server1 webservers]$ cat vars      
http_port: 8080                                  ##设置将远程端口的主机改为8080

 


2、编辑管理主机的变量
[ansible@server1 ~]$ cd host_vars/
[ansible@server1 host_vars]$
[ansible@server1 host_vars]$ ls
server2
[ansible@server1 host_vars]$ cd server2/
[ansible@server1 server2]$
[ansible@server1 server2]$ ls
vars  vault
[ansible@server1 server2]$
[ansible@server1 server2]$ cat vars
web_http: http
[ansible@server1 server2]$

 


步骤三:
注释掉playbook文件中主机识别文件变量的路径(目的是为了让系统重找相应的变量路径)

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第44张图片

 

 

1.1、编译

[ansible@server1 ~]$ ansible-playbook playbook.yml  --ask-vault-pass     
Vault password:                                                        需要输入密码说明系统能自动识别加密文加所在的位置

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第45张图片


1.2、在server2主机上 查看端口信息

[root@server2 ~]# netstat  -anltp    
tcp        0      0 172.25.6.2:8080         0.0.0.0:*               LISTEN      9386/httpd            ##查看到的是8080端口已经生效说明远程部署已经生效

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第46张图片

(端口信息已经改变说明 创建的目录能被系统识别到)

 

 

四、 导入和包含task

1、静态加载

  • 步骤一:编辑play3.yml文件
  • 步骤二:测试:

2、静态加载

  • 步骤一:修改配置文件
  • 步骤二:测试:

 

  1. 在实际的生产环境中往往会调用其他模块的task来进行操作
  2. 所以涉及到letask的导入和包含

 

1、静态加载

静态加载的时候直接跳过debug


步骤一

1、编辑play3.yml文件:

[ansible@server1 ~]$ cat play3.yml
---
- hosts: server1
  tasks:
    - import_tasks: task2.yml                      ##静态加载
      when: ansible_os_family == "Redhat"          ##满足静态加载,task2.yml 文件中的内容生效  所以不会执行task2.yml中的内容   会一旦满足此条件直接加载 跳过debug
编辑task2.yml文件信息

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第47张图片

 

2、编辑 task2.yml文件

[ansible@server1 ~]$ cat task2.yml
---
- set_fact: ansible_os_family="Centos"
- debug:
    var: ansible_os_family

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第48张图片

 

步骤二:
测试:

[ansible@server1 ~]$ ansible-playbook play3.yml

PLAY [server1] ********************************************************************************************************

TASK [Gathering Facts] ************************************************************************************************
ok: [server1]

TASK [set_fact] *******************************************************************************************************
ok: [server1]

TASK [debug] **********************************************************************************************************
skipping: [server1]

PLAY RECAP ************************************************************************************************************
server1                    : ok=2    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   

 

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第49张图片


2、动态加载

先判断task2.yml  文件中的内容

步骤一:

修改配置文件

---
- hosts: server1
  tasks

    - include_tasks: task2.yml                     ##动态加载
      when: ansible_os_family == "RedHat"          ##满足静态加载,task2.yml 文件中的内容不生效  所以执行task2.yml中的内容 会执行debug中的内容   

 

步骤二:

测试:

[ansible@server1 ~]$ ansible-playbook play3.yml

 

Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等_第50张图片

查看动态设置成功!!!

 

你可能感兴趣的:(Ansible(5)——Playbook中loop、when 、block、循环、判断语句的用法、roles编写、导入和包含task等)