RHCE-B10. 利用playbook在不同主机组修改文件内容
Posted 白-胖-子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RHCE-B10. 利用playbook在不同主机组修改文件内容相关的知识,希望对你有一定的参考价值。
红帽RHCE考试下午-RHCE(RH294)
RH294任务概览
- 考试时间4个小时,6台虚拟机,15道题
- 原来通过脚本或者集群做的题现在都需要使用playbook实现
- 考试时大概有6台虚拟服务器,都已经做好了互相的免密
- 做题在ansible控制节点workstation做,但是需要去其他虚拟服务器进行验证
- 考试时需要将6台虚拟服务器在考试环境全部开启,物理机界面点击左侧按钮启动
- 考试时Ansible所有playbook都放在普通用户目录中且都以普通用户执行
- 注意:考试时一定注意要求将playbook放在指定用户的家目录中,用指定的用户登录做题!
- 注意:考试的判分方式通过普通用户远程执行指定目录下的playbook或者脚本,如果使用root做题,则没有权限就是零分
10. 利用playbook在不同主机组修改文件内容
- 按照下方所述,创建一个名为 /home/student/ansible/issue.yml 的 playbook:
- 该 playbook 将在所有清单主机上运行
- 该 playbook 会将 /etc/issue 的内容替换为下方所示的一行文本:
任务要求
- 在 dev 主机组中的主机上,这行文本显示为:Development
- 在 test 主机组中的主机上,这行文本显示为:Test
- 在 prod 主机组中的主机上,这行文本显示为:Production
注意:
准备个工作
- 考试期间不需要做
完成步骤
- 使用copy模块的content关键字将指定的文本内容整进指定主机组的/etc/issue文件中
- 模块中使用if对主机组进行判断
- group_names 是ansible内置变量来的吧,目标主机的所属组
[student@workstation ansible]$ vim issue.yml
---
- name: modify issue file
hosts: all
tasks:
- copy:
content:
{% if "dev" in group_names %}
Development
{% elif "test" in group_names %}
Test
{% elif "prod" in group_names %}
Production
{% endif %}
dest: /etc/issue
[student@workstation ansible]$ ansible-playbook issue.yml
- 验证
for i in server{a..d} bastion;do ssh root@$i "cat /etc/issue";done
ansible all -m shell -a "cat /etc/issue"
- 有时间的话就挨个主机登录去进行验证
[student@workstation ansible]$ ssh servera
Activate the web console with: systemctl enable --now cockpit.socket
Last login: Wed Feb 26 15:02:14 2020 from 172.25.250.9
[student@servera ~]$ cat /etc/issue
Development [student@servera ~]$ exit logout
Connection to servera closed.
[student@workstation ansible]$ ssh serverb
Activate the web console with: systemctl enable --now cockpit.socket
Last login: Wed Feb 26 15:02:14 2020 from 172.25.250.9
[student@serverb ~]$ cat /etc/issue
Test
[student@serverb ~]$ exit logout
Connection to serverb closed.
[student@workstation ansible]$ ssh serverc
Activate the web console with: systemctl enable --now cockpit.socket
Last login: Wed Feb 26 15:02:14 2020 from 172.25.250.9
[student@serverc ~]$ cat /etc/issue
Production
[student@serverc ~]$ exit logout
Connection to serverc closed.
[student@workstation ansible]$ ssh serverd
Activate the web console with: systemctl enable --now cockpit.socket
Last login: Wed Feb 26 15:02:14 2020 from 172.25.250.9
[student@serverd ~]$ cat /etc/issue
Production
[student@serverd ~]$ exit
考察的知识点
ansible Copy 模块
- 功能:从ansible服务器主控端复制文件或者文件内容到受控主机
注意: src=file 如果是没指明路径,则为当前目录或当前目录下的files目录下的file文件
#如目标存在,默认覆盖,此处指定先备份
ansible websrvs -m copy -a "src=/root/test1.sh dest=/tmp/test2.sh owner=sun mode=600 backup=yes"
- name: copy file
hosts: websrvs
tasks:
- copy:
src: /root/test1.sh
dest: /tmp/test2.sh
owner: sun
mode: 600
backup: yes
#指定内容,直接生成目标文件
ansible websrvs -m copy -a "content='test line1\\ntest line2\\n' dest=/tmp/test.txt"
- name: copy content
hosts: websrvs
tasks:
- copy:
content: 'test line1\\ntest line2\\n'
dest: /tmp/test.txt
#复制/etc目录自身,注意/etc/后面没有/
ansible websrvs -m copy -a "src=/etc dest=/backup"
- name:copy DIR
hosts: websrvs
tasks:
- copy:
src=/etc
dest=/backup
#复制/etc/下的文件,不包括/etc/目录自身,注意/etc/后面有/
ansible websrvs -m copy -a "src=/etc/ dest=/backup"
- name: copy file in DIR
hosts: webstvs
tasks:
- copy:
src=/etc/
dest=/backup
playbook 中使用if 条件判断
{% if i in EXPR %}
...
{% endif %}
## 示例:
{% if i in range(1,10) %}
server_name web{{i}};
{% endfor %}
## 多重条件判断
{% if i in EXPRA %}
...
{% elif i in EXPRB %}
...
{% elif i in EXPRC %}
...
{% endif %}
## 示例:
{% if i in range(1,10) %}
server_name web{{i}};
{% elif j in range(20,30) %}
server_name web{{j}};
{% endfor %}
- hosts: websrvs
remote_user: root
vars:
nginx_vhosts:
- web1:
listen: 8080
root: "/var/www/nginx/web1/"
- web2:
listen: 8082
server_name: "web2.sunmy.pro"
root: "/var/www/nginx/web2/"
- web3:
listen: 8083
server_name: "web3.sunmy.pro"
root: "/var/www/nginx/web3/"
tasks:
- name: template config to
copy:
content:
{% for vhost in nginx_vhosts %}
server {
listen {{ vhost.listen }}
{% if vhost.server_name is defined %}
server_name {{ vhost.server_name }} #注意缩进
{% endif %}
root {{ vhost.root }} #注意缩进
}
{% endfor %}
dest=/data/nginx5.conf
- #生成的结果
server {
isten 8080
root /var/www/nginx/web1/
}
server {
listen 8082
server_name web2.sunmy.pro
root /var/www/nginx/web2/
}
server {
listen 8083
server_name web3.sunmy.pro
root /var/www/nginx/web3/
}
以上是关于RHCE-B10. 利用playbook在不同主机组修改文件内容的主要内容,如果未能解决你的问题,请参考以下文章
RHCE-B8. 利用playbook在指定主机组创建和使用逻辑卷
RHCE-B8. 利用playbook在指定主机组创建和使用逻辑卷
RHCE-B12. 利用playbook生成所有清单主机指定硬件信息报告