本实验是基于前篇《Ansible(4)—— Playbook语法之变量的类型》实验环境下进行的,其中普通用户devops已经创建好,授权、免密都配置好了。在编辑好playbook.yml下进行的
上一实验的博客链接:https://blog.csdn.net/dghfttgv/article/details/104808636
(一)、ignore_errors: True (忽略编译报错 )
(二)loop语句循环变量的用法
方法一:在playbook.yml文件中直接循环loop后边的变量
方法二: 通过调用文件中的变量来实现
1、没有添加change when: false 抑制更改的语句
2、带有抑制修改的语句
(三)、block语句块、 when判断语句(部署haprox负载均衡)
1、使用playbook.yml文件自动部署haprox负载均衡
2、向haproxy集群中添加新的后端
(一)、 change when: false 抑制更改信息语句
1、没有添加change when: false 抑制更改的语句
2、带有抑制修改的语句
(二)、failed_when web_package == "service" 语句的用法
1、验证failed_when web_package == "service" 语句的用法
2、异常抛出(出现报错是指定输出相应的值)
(一)、文件的加密、解密
1、文件加密
2、给文件解密
(二)、变量文件的管理
1、文件管理的简介
2、创建文件管理的目录
1、静态加载
2、静态加载
(一)、ignore_errors: True (忽略编译报错 )
(二)loop语句循环变量的用法
方法一:在playbook.yml文件中直接循环loop后边的变量
方法二: 通过调用文件中的变量来实现
(三)、block语句块、 when判断语句(部署haprox负载均衡)
1、使用playbook.yml文件自动部署haprox负载均衡
2、向haproxy集群中添加新的后端
(一)、ignore_errors: True (忽略编译报错 )
1、ignore_errors: True 语法的简介
tasks:
-name: disable selinux
command: /sbin/setenforce
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 ##修改程错误的信息
2.2、编译:
[ansible@server1 ~]$ ansible-playbook playbook.yml
编译失败 !!!
在配置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停止
3.1、验证:
3.1.1、编译:
[ansible@server1 ~]$ ansible-playbook playbook.yml
(二)loop语句循环变量的用法
(block语句块 when判断语句)方法一:在playbook.yml文件中直接循环loop后边的变量
方法二:通过调用文件中的变量来实现
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
(用户已经被创建)
1.2、在server2上:
[root@server2 ~]# cat /etc/shadow
方法二:
通过调用文件中的变量来实现
步骤一:
创建变量文件
[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
步骤二:
修改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...
步骤三:
测试:
1.1、编译
[ansible@server1 ~]$ ansible-playbook playbook.yml -t user
when、
1.2、在server2上:
[root@server2 ~]# cat /etc/passwd
(三)、block语句块、 when判断语句(部署haprox负载均衡)
1、使用playbook.yml文件自动部署haprox负载均衡
2、向haproxy集群中添加新的后端
例:使用playbook.yml文件自动部署haprox负载均衡
1、使用playbook.yml文件自动部署haprox负载均衡
步骤一:
给server1上传密钥:
[ansible@server1 ~]$ ssh-copy-id server1
步骤二:
修改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
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 %}...
步骤三:
配置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...
步骤四:
测试 :
1.1、编译
[ansible@server1 ~]$ ansible-playbook playbook.yml -t haproxy
1.2、查看 /etc/haproxy/haproxy.cfg 中的文件信息
[ansible@server1 ~]$ vim /etc/haproxy/haproxy.cfg
1.3、测试负载均衡:
在srever1上:
[ansible@server1 ~]$ curl server1
2、向haproxy集群中添加新的后端
在集群中加入server4
步骤一:
设置server4环境
1、给server4的普通用户设置操作权限
[root@server4 tmp]# visudo
ansible ALL=(ALL) NOPASSWD: ALL
2、给server4转递密钥
[ansible@server1 ~]$ ssh-copy-id server4
步骤二:
编辑hosts文件把server4添加到prod组里
[ansible@server1 ~]$ cat hosts
[balancer]
server1
[test]
server2[prod]
server3
server4[webservers:children]
test
prod[webservers:vars]
http_port=80
步骤三:
在server4上自动安装apache、将server4加入集群
编译 :
[ansible@server1 ~]$ ansible-playbook playbook.yml -t apache,haproxy
步骤四:
测试:
1.1、在server4上查看80端口是否打开
[root@server4 tmp]# netstat -anltp
tcp 0 0 172.25.6.4:80 0.0.0.0:* LISTEN 2153/httpd
1.2、在server1上查看/etc/haproxy/haproxy.cfg文件中server4是否被成功的添加
1.3、查看负载均衡的效果
[ansible@server1 ~]$ curl server1 ##访问server1主机
(一)、 change when: false 抑制更改信息语句
1、没有添加change when: false 抑制更改的语句
2、带有抑制修改的语句
(二)、failed_when web_package == "service" 语句的用法
1、验证failed_when web_package == "service" 语句的用法
2、异常抛出(出现报错是指定输出相应的值)
抑制更改 针对一些命令对系统不做修改但是有报错的
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 ##打印结果
步骤二
测试:
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
(报有修改的信息)
2、带有抑制修改的语句
步骤一:
在test.yml文件中添加 change when: false ##抑制更改信息
步骤二:
测试:
[ansible@server1 ~]$ ansible-playbook test.yml
总结:在实际的生产环境中编写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" 语句的用法
2、异常抛出(出现报错是指定输出相应的值)
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@server1 ~]$ ansible-playbook test.yml
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
(一)、文件的加密、解密
1、文件加密
2、给文件解密
(二)、变量文件的管理
1、文件管理的简介
2、创建文件管理的目录
加密文件的使用的相关命令
[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
(端口信息已经改变说明 创建的目录能被系统识别到)
2、给文件进行加密
[ansible@server1 ~]$ ansible-vault encrypt vars/userlist.yml
步骤二:
测试:
1.1、查看加密文件的内容 :
[ansible@server1 ~]$ cat vars/userlist.yml
1.2、检测文件需要输入密码认证
测试:
[ansible@server1 ~]$ ansible-playbook playbook.yml -t user --ask-vault-pass
Vault password:
(因为playbook文件需要调用加密文件中的内容所以需要输出密码才可以访问)
1.3、查看文件需要输入密码:
[ansible@server1 ~]$ ansible-vault view vars/userlist.yml
1.4、编辑文件需要输入密码:
[ansible@server1 ~]$ ansible-vault edit vars/userlist.yml
2、给文件解密
步骤一:
输入解密命令
[ansible@server1 ~]$ ansible-vault decrypt vars/userlist.yml ##文加解密
Vault password:
步骤二:
测试
[ansible@server1 ~]$ cat vars/userlist.yml ##查看文件中的内容
(二)、变量文件的管理
1、文件管理的简介
2、创建文件管理的目录
1、文件管理的简介
├── {
├── \\
├── 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
2、创建文件管理的目录
步骤一:
下载tree命令、创建相应的目录
1、下载tree命令(方便查看各个目录以及文件之间的关系
[ansible@server1 ~]$ sudo yum install tree -y ##下载tree命令
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
步骤二:
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文件中主机识别文件变量的路径(目的是为了让系统重找相应的变量路径)
1.1、编译
[ansible@server1 ~]$ ansible-playbook playbook.yml --ask-vault-pass
Vault password: 需要输入密码说明系统能自动识别加密文加所在的位置
1.2、在server2主机上 查看端口信息
[root@server2 ~]# netstat -anltp
tcp 0 0 172.25.6.2:8080 0.0.0.0:* LISTEN 9386/httpd ##查看到的是8080端口已经生效说明远程部署已经生效
(端口信息已经改变说明 创建的目录能被系统识别到)
1、静态加载
2、静态加载
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文件信息
2、编辑 task2.yml文件
[ansible@server1 ~]$ cat task2.yml
---
- set_fact: ansible_os_family="Centos"
- debug:
var: ansible_os_family
步骤二:
测试:
[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
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
查看动态设置成功!!!