RHCE-B10. 利用playbook在不同主机组修改文件内容

Posted 白-胖-子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RHCE-B10. 利用playbook在不同主机组修改文件内容相关的知识,希望对你有一定的参考价值。

红帽RHCE考试下午-RHCE(RH294)

RH294任务概览

  • 考试时间4个小时,6台虚拟机,15道题
  • 原来通过脚本或者集群做的题现在都需要使用playbook实现
  • 考试时大概有6台虚拟服务器,都已经做好了互相的免密
  • 做题在ansible控制节点workstation做,但是需要去其他虚拟服务器进行验证
  • 考试时需要将6台虚拟服务器在考试环境全部开启,物理机界面点击左侧按钮启动
  • 考试时Ansible所有playbook都放在普通用户目录中且都以普通用户执行
  1. 注意:考试时一定注意要求将playbook放在指定用户的家目录中,用指定的用户登录做题!
  2. 注意:考试的判分方式通过普通用户远程执行指定目录下的playbook或者脚本,如果使用root做题,则没有权限就是零分

10. 利用playbook在不同主机组修改文件内容

  • 按照下方所述,创建一个名为 /home/student/ansible/issue.yml 的 playbook:
  • 该 playbook 将在所有清单主机上运行
  • 该 playbook 会将 /etc/issue 的内容替换为下方所示的一行文本:

任务要求

  1. 在 dev 主机组中的主机上,这行文本显示为:Development
  2. 在 test 主机组中的主机上,这行文本显示为:Test
  3. 在 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-B9. 利用playbooke生成主机清单文件

RHCE-B8. 利用playbook在指定主机组创建和使用逻辑卷

RHCE-B8. 利用playbook在指定主机组创建和使用逻辑卷

RHCE-B12. 利用playbook生成所有清单主机指定硬件信息报告

RHCE-B3. 创建playbook安装 php 和 mariadb 软件包到指定主机组

RHCE-B11. 利用playbook创建 Web 内容目录并能够访问