首页 > 系统相关 >RHCS认证-Linux(RHel9)-Ansible

RHCS认证-Linux(RHel9)-Ansible

时间:2024-09-23 21:52:02浏览次数:12  
标签:name ......... RHel9 builtin ansible Linux vim RHCS yml

文章目录

一、ansible 简介

Ansible是一种基于Python开发的自动化运维工具,集成了多种运维工具的优点,主要用于批量系统配置、程序部署和运行命令等任务。它的核心在于提供一个简单易用且功能强大的框架,通过SSH协议与远程主机通信,无需在被管节点上安装客户端。

Ansible由红帽公司收购,并逐渐成为运维工程师必备的技能之一。该工具具有以下特点:

  1. 部署简单:只需在主控端部署Ansible环境,被控端无需做任何
  2. 操作。 默认使用SSH协议:对设备进行管理,保障通信安全。
    功能模块丰富:拥有大量常规运维操作模块,可实现日常绝大部分操作。
  3. 支持Playbooks:通过定义多个任务的YAML文件来定制配置和状态管理。
  4. 轻量级:无需在客户端安装agent,更新时只需在操作机上进行一次更新即可。

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

在这里插入图片描述

Ansible命令的执行过程包括加载配置文件和模块文件、生成并传输临时Python文件、在远程服务器上执行命令、返回结果并删除临时文件。
以下是详细的步骤:

  1. 加载配置文件:Ansible首先会加载配置文件,通常为ansible.cfg,这个文件包含了Ansible运行的各种参数和设置。

  2. 加载模块文件:根据使用的具体模块(如command、shell等),加载相应的模块文件。这些模块定义了要在远程服务器上执行的具体操作。

  3. 生成传输临时Python文件:Ansible将模块或命令生成一个临时的Python(.py)文件,并通过SSH传输到远程服务器的$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件中。

  4. 执行命令:Ansible给临时文件添加执行权限,然后在远程服务器上执行这个临时文件,具体命令通过nohup方式在后台运行,确保即使SSH连接断开,命令也能继续执行。

  5. 返回结果:命令执行完成后,结果会被传回Ansible主控端,同时输出到终端或保存到指定文件中。

  6. 删除临时文件:为了安全性,执行完成后,临时Python文件会被删除

ansible 工作机制

在这里插入图片描述

二 、ansible部署

# 下载yum源
wget -O /etc/yum.repos.d/CentOS-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 安装epel-release源
yum install -y epel-release
# 搜索ansible
yum list |grep ansible
# 安装ansible
dnf install ansible
# 验证安装
rpm -ql ansible
rpm -qc ansible
#ansible所有模块
ansible-doc -l 
#yum模块
ansible-doc -s yum

三、ansible服务端测试

# 测试 Ansible 是否能成功连接到本地主机(localhost)
# -m ping 模块 主机是否在线
ansible localhost -m ping
.........
localhost | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
.........
# 定义主机清单
vim /etc/ansible/hosts
.........
 43 ## db-[99:101]-node.example.com
 44 centos2
 45 centos3
.........

ssh-keygen
ssh-copy-id centos2
# 测试连通性
#可提前测试ssh
ansible centos2 -m ping
ansible centos3 -m ping
ansible centos5 -m ping

在这里插入图片描述

四 、ansible 清单inventory

#查找配置
ansible --version
.........
#ansible 2.9.27
#  config file = /etc/ansible/ansible.cfg
.........  
# 查找包
rpm -qf /etc/ansible/ansible.cfg
.........  
# ansible-2.9.27-1.el7.noarch
.........  
#查找配置
rpm -qc ansible-2.9.27-1.el7.noarch
.........  
#/etc/ansible/ansible.cfg
#/etc/ansible/hosts
.........  
# 具体配置
vim /etc/ansible/ansible.cfg
.........  
 #10 [defaults]
 #11
 #12 # some basic default values...
 #13
 #14 #inventory      = /etc/ansible/hosts
.........  
vim /etc/ansible/hosts
# 增加主机组
ansible webserver -m ping
.........
 44 [webserver]
 45 centos2
 46 centos3
 .........
#增加账号密码
.........
 45 centos2  ansible_ssh_user="root" ansible_ssh_pass="redhat"
 .........
 #增加端口
 #centos2 vim /etc/ssh/sshd_config 修改端口 port 2222
 .........
 45 centos2  ansible_ssh_user="root" ansible_ssh_pass="redhat" ansible_ssh_port="2222"
 .........
# 组变量
 .........
 44 [webserver]
 45 centos2
 46 centos3
 47
 48 [webserver:vars]  # 注意是vars 且需换行
 49 ansible_ssh_user="root"
 50 ansible_ssh_pass="redhat"
 51 ansible_ssh_port="22"
 .........
 # 子分组
 .........
 44 [webserver1]
 45 centos2
 46 centos3
 47
 48 [webserver2]
 49 centos5
 50
 51 [webserver:children]
 52 webserver1
 53 webserver2
 54
 55 [webserver:vars]
 56 ansible_ssh_user="root"
 57 ansible_ssh_pass="redhat"
 58 ansible_ssh_port="22"
 .........
 # 自定义主机清单,可以不使用/etc/ansible/hosts
ansible -i hosts webserver -m ping

五、Ad-hot 点对点模式

Ad-hot 点对点模式是Ansible一种便捷的任务执行方式,适用于临时性操作和快速命令执行

# 多少个模块
ansible-doc -l |wc -l
.......
7736#或89 安装的ansible-core 7736社区版
.......
# 使用copy模块
ansible-doc copy
ansible webserver -m copy -a 'src=/etc/hosts dest=/tmp/copy.txt mode=777 backup=yes'
# 用户模块
ansible-doc user
##创建用户
ansible webserver -m user -a 'name=lih state=present'
#软件包管理yum或dnf
##安装http
ansible webserver -m dnf -a "name=httpd state=latest enabled=yes"
#服务 
##启动服务
ansible webserver  -m service -a "name=httpd state=started enable=yes"
# 文件模块
## 创建文件
ansible webserver  -m file -a "path=/tmp/addfile.txt mode=777 state=touch"
## 创建文件夹
ansible webserver  -m file -a "path=/tmp/addd mode=777 state=directory"
# 收集模块
ansible webserver -m setup
##收集IP
ansible webserver -m setup -a "filter=ansible_all_ipv4_addresses"
# fetch(获取)
ansible centos2 -m fetch -a "src=/tmp/fetch.txt dest=/root/"
.........#测试结果多了层centos2目录
[root@centos1 tmp]# cat /root/centos2/tmp/fetch.txt
2020202020202020202020202020202020202020
.........
# script(shell脚本)
ansible centos2 -m script -a "/root/addtime.sh"
.........
[root@centos1 ~]# cat addtime.sh
date > /tmp/time.txt
.........

六、YAML语言模式

vim apache.yaml
.........
- hosts: centos2 # 冒号空格 减号空格
  tasks:
  - name: install
    yum: name=httpd state=present  #yum 和name对齐
  - name: service
    service: name=httpd state=started
.........

#检查语法
ansible-playbook apache.yaml --syntax-check
#列出任务
ansible-playbook apache.yaml --list-task
#列出主机
ansible-playbook apache.yaml --list-host
#执行
ansible-playbook apache.yaml

在这里插入图片描述

七、RHCS-Ansible

红帽推出的Ansible自动化平台2。这是红帽针对混合云自动化的新标准,旨在优化不断演变的混合云大规模计算,并引入了自足式自动化功能,将自动化更深入地转移到应用开发生命周期中

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

附:安装CentOS-Stream 9系统

CentOS,是基于Red Hat Linux提供的可自由使用源代码的企业级Linux发行版本;是一个稳定,可预测,可管理和可复制的免费企业级计算平台。 下载地址: https://mirrors.aliyun.com/centos/

安装VMware workstion 17或以上本
下载CentOS-Stream9镜像:

官网:https://mirror.stream.centos.org/9-stream/BaseOS/x86_64/iso/
阿里云:https://mirrors.aliyun.com/centos-stream/9-stream/BaseOS/x86_64/iso/
清华:https://mirrors.tuna.tsinghua.edu.cn/centos-stream/9-stream/BaseOS/x86_64/iso/
#[ ]CentOS-Stream-9-20240724.0-x86_64-dvd1.iso  11G

# ubuntu下载
https://releases.ubuntu.com/18.04.6/
vim /etc/yum.repos.d/ansible.repo
.........
[ansible]
name=ansible
baseurl=https://mirrors.aliyun.com/epel/9/Everything/x86_64/
enabled=1
gpgcheck=0
.........

部暑Ansible环境

# 1.1准备三台主机 CentOS Stream 9   
control.lab.example.com  192.168.10.91   控制主机 
node1.lab.example.com    192.168.10.92   被控制主机  
node2.lab.example.com    192.168.10.93   被控制主机 

2)配置所有主机允许root ssh登录

vim /etc/ssh/sshd_config #PermitRootLogin yes
systemctl restart sshd

3)在管理机实现免密

ssh-keygen
ssh-copy-id [email protected]
ssh-copy-id [email protected]

)定义inventory,主要清单,主机分组

vim /etc/ansible/hosts
[servers]
192.168.10.92
192.168.10.93

)修改配置文件

# 可默认不修改
vim /etc/ansible/ansible.cfg
[defaults]
inventory  = /etc/ansible/hosts
remote_user = root
host_key_checking = False

测试

ansible servers -m ping 

在这里插入图片描述

ansible-navigator

pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ 
pip install ansible-navigator 
ansible-navigator

在这里插入图片描述

podman images

在这里插入图片描述

ansible-navigator config list

7.1 ansible 执行过程

> 加载自己的配置文件,默认/etc/ansible/ansible.cfg; 
> 查找对应的主机配置文件,找到要执行的主机或者组;
> 加载自己对应的模块文件,如 command; 
> 通过ansible将模块或命令生成对应的临时py文件(python脚本),
> 并将该文件传输至远程服务器; 
> 对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件;
> 给文件 +x 执行权限;
> 执行并返回结果; 删除临时py文件,sleep 0退出

简单理解就是Ansible在运行时,首先读取ansible.cfg中的配置,根据规则获取Inventory中的管理主机列表,并行的在这些主机中执行配置的任务,最后等待执行返回的结果

7.2 安装ansible,ansible-navigator

多次实践后,个人理解,ansible-navigator是ansible的升级,同一配置文件等,简单重整理一部分,其他重复部分可忽略。

在这里插入图片描述

在这里插入图片描述

[student@workstation ~]$ dnf search ansible
[root@workstation ~]'#' dnf install -y ansible-navigator.noarch ansible-core.x86_64
# 查询验证
ansible-navigator --version #显示Ansible Navigator工具的版本,该工具是Ansible Automation Platform的一部分,用于帮助开发者更方便地构建和测试Playbook
ansible --version #显示正在使用的Ansible核心程序的版本

rpm -qc ansible-core
---
/etc/ansible/ansible.cfg # 配置文件
/etc/ansible/hosts # 清单文件
---

# 容器配置
podman --version

vim .ansible-navigator.yml
---
ansible-navigator:
  execution-environment:
    image: utility.lab.example.com/ee-supported-rhel8:latest
    pull:
      policy: missing
---
# 配置镜像仓库

vim /etc/containers/registries.conf
cat /etc/containers/registries.conf |grep -v ^# |grep -v ^$
---------#old
unqualified-search-registries = ["registry.fedoraproject.org",
"registry.access.redhat.com", "registry.centos.org", "quay.io", "docker.io"]
short-name-mode = "enforcing"
---------

cat /etc/containers/registries.conf |grep -v ^#
---------#new
unqualified-search-registries = ["registry.lab.example.com"]
[[registry]]
insecure = true
blocked = false
location = "registry.lab.example.com"
---------

vim /etc/hosts
podman images  #内容导航器使用默认的执行环境
ansible-navigator images  #显示本地可用镜像列表

在这里插入图片描述

podman images

在这里插入图片描述

ansible-navigator images

在这里插入图片描述

ansible-navigator collections

在这里插入图片描述

7.2 部署ansible

构建Ansible 清单
管理Ansible 配置文件
编写和运行playbook
实施多个play

>

系统默认清单文件
/etc/ansible/hosts:

vim /etc/ansible/hosts
---
servera
serverb
---
>  #验证清单 
ansible-navigator inventory -i /etc/ansible/hosts --list -m stdout
ansible-navigator inventory -i /etc/ansible/hosts --graph -m stdout

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
配置Ansible
ansible和ansible-navigator的配置文件

#ansible配置文件
which ansible # 文件
rpm -qf /bin/ansible # 安装包
rpm -qc ansible-core-2.13.0-2.el9ap.x86_64 #配置文件
vim /etc/ansible/ansible.cfg # 
ansible-config init --disabled > ansible.cfg#当前生成
vim /etc/ansible/ansible.cfg
.........
138 inventory=/home/lihui/inventory
.........
#其他命令
ansible ungrouped --list-hosts  #

7.3 ansible-navigator

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

#ansible-navigator配置文件
[student@workstation ~]$ cat ~/.ansible-navigator.yml
---
ansible-navigator:
  execution-environment:
    image: utility.lab.example.com/ee-supported-rhel8:latest
    pull:
      policy: missing
---
或程序生成yml配置
ansible-navigator settings --effective>/tmp/abc.yml

ansible-navigator doc -l |wc -l
.........
118
.........

ansible 配置

ansible-config init --disabled > ansible.cfg#当前生成
vim /etc/ansible/ansible.cfg
.........
138 inventory=/home/lihui/inventory
.........
ansible --version #查配置文件
ansible all --list-host # ansible
ansible-navigator inventory -m stdout --graph #ansible-navigator #or list

在这里插入图片描述

# 搜索模块
ansible-navigator collections  -m stdout  |grep firewalld

7.4 YAML

在这里插入图片描述

部分基本案例ansible-playbook可参考章节六
ansible-navigator

调整Tab键缩进

在这里插入图片描述

# 帮助文档
# 查找ansible.posix.firewalld
ansible-navigator collections -m stdout |grep firewalld  

ansible-navigator doc user -m stdout #查找:EXAMPLES
vim useradd.yml
........
- name: create user
  hosts: server
  tasks:
    - name: Add the user 'johnd' 
      ansible.builtin.user:
        name: johnd
        comment: John Doe
        uid: 1040
        group: root
........
#语法检查
ansible-navigator run useradd.yml -m stdout --syntax-check
# 执行
ansible-navigator run useradd.yml
# 提高输出的详细程度
ansible-navigator run useradd.yml -m stdout -vvvv# v-vvvv
# 生产环境检查
ansible-navigator run useradd.yml -m stdout --check

在这里插入图片描述
同一yml文件中再增加play

# 查询控制节点上的模块列表==ansible软件自身带的核心模块
ansible-doc -l |grep dnf
#查询自动化执行环境中的模块列表=容器镜像中带来的模块列表
ansible-navigator doc -l |grep dnf
# 具体模块帮助和案例EXAMPLES
ansible-navigator doc ansible.builtin.dnf -m stdout
vim useradd.yml
.........
#在一个palybook中有多个靠左写的play
#play要有- name hosts tasks
#task要有- name 参数
---
- name: create user
  hosts: server
  tasks:
    - name: Add the user 'johnd' 
      ansible.builtin.user:
        name: johnd
        comment: John Doe
        uid: 1040
        group: root

- name: install
  hosts: server
  tasks:
    - name: Install the latest version of Apache
      ansible.builtin.dnf:
        name: httpd
        state: latest
 #1.Ctrl+v  2.下箭头到(需移动的内容) 3.Shift+i 首行移动 4.Esc (其他行移动) 
 #或 1.v 2.下箭头 3.Shift+>(整体移动) 4..(重复执行)u(撤回上次)
.........
# 语法检查
ansible-navigator run useradd.yml -m stdout --syntax-check
# 模拟执行
ansible-navigator run useradd.yml -m stdout --check
ansible-navigator run useradd.yml -m stdout

在这里插入图片描述

选择模块

在这里插入图片描述

7.5 管理变量和事实

变量作为第一个参数和第一个值存在,必须加双引号“{{ }}”

vars:变量定义

vim dnfvar.yml
.........
---
- name: dnf install
  hosts: server
  vars:
    - package: httpd
  tasks:
    - name: install {{package}}
      ansible.builtin.dnf:
        name: "{{package}}"
        state: present
.........

vars_file 变量定义

vim dnfvar.yml
........
---
- name: dnf install
  hosts: server
  vars_files:
    - /home/lihui/vars.yml
  tasks:
    - name: install {{package}}
      ansible.builtin.dnf:
        name: "{{package}}"
        state: present
    # 显示运行结果
      register: install_result # 存储本模块运行输出到变量中
    - debug:
        var: install_result

........

vim vars.yml
.........
package: ftp
........

清单中定义主机或组变量

# 清单中定义主机或组变量
vim inventory
.........
[server]
192.168.10.92 
centos93

[server:vars]
package=ftp
.........

7.6 管理机密

在Ansible的使用过程中,经常会遇到处理敏感数据(如密码、密钥等)的情况。直接在剧本或角色中以明文形式存储这些敏感数据,不仅不安全,也不符合最佳实践。为解决这一问题,Ansible提供了一个名为Vault的功能

ansible-vault --help
# 创建加密文件
ansible-vault create sec1.txt
# 查看加密文件
ansible-vault view sec1.txt
# 编辑加密文件
ansible-vault edit sec1.txt
#修改密码
ansible-vault rekey sec1.txt
# 解密
ansible-vault decrypt  sec1.txt
# 查看为内容
cat sec1.txt
#加密
ansible-vault encrypt sec1.txt
#查看为加密后数字
cat sec1.txt

#把密码放在文本文件中使用
echo 123456 >mima.txt
ansible-vault view sec1.txt --vault-id=mima.txt

#配置文件中 配置文件密码
vim ansible.cfg
........
275 vault_password_file=/home/lihui/mimasec.txt
........
ansible-vault view sec1.txt

在这里插入图片描述

7.7 管理事实

# 临时命令ad-hoc方式收集事实
ansible server -m setup -a filter=*hostname*


# 帮助文档 EXAMPLES
ansible-doc debug
.........
EXAMPLES
- name: Print return information from the previous task
  ansible.builtin.debug:
    var: result
    verbosity: 2
..........

# 查找var名称 var: ansible_all_ipv4_addresses
# 或ansible_default_ipv4.addresses
ansible server -m setup -a filter=*ipv4*
.........
192.168.10.92 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.168.10.92"
        ],
        "ansible_default_ipv4": {
            "address": "192.168.10.92",
            "alias": "ens32",
            "broadcast": "192.168.10.255",
            "gateway": "192.168.10.2",
            "interface": "ens32",
            "macaddress": "00:0c:29:af:ad:98",
            "mtu": 1500,
            "netmask": "255.255.255.0",
            "network": "192.168.10.0",
            "prefix": "24",
            "type": "ether"
        },
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false
}
.........

# playbook 收集事实
vim fact.yml
.........
---
- name: fact
  hosts: server
  tasks:
  - name: Print return information from the previous task
    ansible.builtin.debug:
      var: ansible_all_ipv4_addresses
 .........
 
ansible dev -m debug -a 'var=inventory_hostname'

在这里插入图片描述
收集事实+魔法变量

vim debug.yml
---
- name:
  hosts: all
  tasks:
  - debug:
      var: hostvars

ansible-navigator run debug.yml -m stdout >1.txt
或ansible all -m setup >1.txt
# 
vim 1.txt 

在这里插入图片描述

7.8 实施任务控制

在这里插入图片描述

循环使用变量

在这里插入图片描述
循环字典列表
在这里插入图片描述

# 循环案例
vim loop.yml
.........
---
- name: server loop
  hosts: server
  vars:
    users:
      - name: jan1
        comment: tom1
      - name: jan2
        comment: tom2
  tasks:
  - name: server loop
    ansible.builtin.user:
      name: "{{ item.name}}"
      comment: "{{item.comment}}"
      state: present
    loop: "{{users}}"
.........
# 执行
ansible-navigator run loop.yml -m stdout
# 验证
ansible server -m shell -a 'tail /etc/passwd'

在这里插入图片描述

有条件的运行任务

when 判断对象是当前模块,和模块在同一下列层次

vim when.yml
.........
---
- name: server when
  hosts: server
  tasks:
  - name: server when
    ansible.builtin.service:
      name: httpd
      state: started
    when: ansible_default_ipv4.address == "192.168.10.92"
.........
# 执行
ansible-navigator run when.yml -m stdout
# 检查
ansible server -m shell -a 'systemctl status httpd'

在这里插入图片描述
多个条件
在这里插入图片描述
循环和条件组合
在这里插入图片描述

处理程序handlers

.........
---
- name: change
  hosts: server
  tasks:
    - name: install
      ansible.builtin.yum:
        name: httpd
        state: latest
    - name: copy
      ansible.builtin.copy:
        content: heiheic
        dest: /var/www/html/index.html
      notify:
        - restart

    - name: start
      ansible.builtin.service:
        name: httpd
        state: started

  handlers:
    - name: restart
      ansible.builtin.service:
        name: httpd
        state: restarted
.........

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

错误处理

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

7.9 管理复杂的playbook

vim main.yml
---
- name: http
  hosts: node1
  tasks:
  - import_tasks: task/install_httpd.yml
  - import_tasks: task/start_httpd.yml

vim task/install_httpd.yml
---
- name: Install the latest version of Apache
  ansible.builtin.yum:
    name: httpd
    state: latest

vim task/start_httpd.yml 
---
- name: Make sure a service unit is running
  ansible.builtin.systemd:
    state: started
    name: httpd

创建角色

#配置路径
  vim ansible.cfg 
#查看
  ansible-galaxy --help
  ansible-galaxy list
  ansible-galaxy role --help
# 创建角色
  ansible-galaxy init roles/apache
  tree roles/apache/

在这里插入图片描述

vim roles/apache/tasks/main.yml
---
- name: Install http
  ansible.builtin.yum:
    name: httpd
    state: latest
- name: Make
  ansible.builtin.systemd:
    state: started
    name: httpd
- name: Create
  ansible.builtin.template:
    src: jin2.j2       # templates 中
    dest: /var/www/html/index.html
  notify: restart     # handers 中


vim roles/apache/templates/jin2.j2
------
wecole to {{ ansible_default_ipv4.address }} and {{ ansible_hostname }} and {{ ansible_nodename }}
------

vim roles/apache/handlers/main.yml
---
# handlers file for roles/apache
- name: restart
  ansible.builtin.systemd:
    state: restarted
    name: httpd
    
vim roles.yml
---
- name: install apache
  hosts: node1
  roles:
    - apache
#运行
ansible-navigator run roles.yml -m stdout
# 验证
curl localhost

在这里插入图片描述

八.训练题

1. 安装和配置 Ansible安装ansible

*$ sudo yum -y install ansible-core ansible-navigator
创建文件夹
*$ mkdir -p /home/greg/ansible/roles
切换工作目录
*$ cd /home/greg/ansible
拷贝配置文件
$ cat /etc/ansible/ansible.cfg
*$ ansible-config init --disabled > /home/greg/ansible/ansible.cfg
创建集合存储目录
*$ mkdir /home/greg/ansible/mycollection
编辑配置文件
*$ vim ansible.cfg
---------
[defaults]
## 配置文件中,按题要求修改,自最好建到同一文件ansible中
inventory = /home/greg/ansible/inventory
remote_user = greg
host_key_checking = False
vault_password_file = /home/greg/ansible/secret.txt
roles_path    = /home/greg/ansible/roles
collections_path=./mycollection/:.ansible/collections:/usr/share/ansible/collections
[privileg/ree_escalation]
become=True
---------

*$ vim /home/greg/ansible/inventory
---------
[dev]
node1
[test]
node2
[prod]
node3
node4
[balancers]
node5
[webservers:children]
prod 
---------

2. 配置系统以使用默认存储库

---
- name: repository
  hosts: all
  tasks:
  - ansible.builtin.yum_repository:
      file: rhel  #file相同,会将配置放到相同repo中。
      name: EX294_BASE
      description: "EX294 base software"
      baseurl: http://content/rhel9.0/x86_64/dvd/BaseOS
      gpgcheck: yes
      gpgkey: http://content/rhel9.0/x86_64/dvd/RPM-GPG-KEY-redhat-release
      enabled: yes

  - ansible.builtin.yum_repository: 
     file: rhel
     name: EX294_STREAM
     description: "EX294 stream software"
     baseurl: http://content/rhel9.0/x86_64/dvd/AppStream
     gpgcheck: yes
     gpgkey: http://content/rhel9.0/x86_64/dvd/RPM-GPG-KEY-redhat-release
     enabled: yes

3. 安装软件包

# php` 和 `mariadb` 软件包安装到 
#`dev`、`test` 和 `prod` 主机组中的主机上
---
- name: play 1
  hosts: dev,test,prod
  tasks:
  - name: ensure a list of packages installed
    ansible.builtin.yum:
      name: "{{ packages }}"
    vars:
      packages:
      - php
      - mariadb

4. 配置collection

配置 collection

  • http://classroom/materials/
    • redhat-insights-1.0.7.tar.gz
    • community-general-5.5.0.tar.gz
    • redhat-rhel_system_roles-1.19.3.tar.gz
  • 上面3个安装在/home/greg/ansible/mycollection目录中
$ vim requirements.yml
---------
---
collections:
- name: http://classroom/materials/redhat-insights-1.0.7.tar.gz
- name: http://classroom/materials/community-general-5.5.0.tar.gz
- name: http://classroom/materials/redhat-rhel_system_roles-1.19.3.tar.gz
---------
$ ansible-galaxy collection install \
  -r requirements.yml \
  -p /home/greg/ansible/mycollection

5.使用 RHEL 系统角色

#不安装角色包可以使用该条命令搜索
find ./mycollection/ -name  selinux-playbook.yml 

$ vim /home/greg/ansible/selinux.yml
---------
---
- hosts: all
  vars:
    selinux_policy: targeted
    selinux_state: enforcing
  roles:
  - redhat.rhel_system_roles.selinux 
---------

6.使用 Ansible Galaxy 安装角色

从URL 下载角色并安装到 /home/greg/ansible/roles

$ vim /home/greg/ansible/roles/requirements.yml
---------
---
- src: http://classroom/materials/haproxy.tar
  name: balancer
- src: http://classroom/materials/phpinfo.tar
  name: phpinfo
---------
 

7. 创建和使用角色

创建和使用角色

根据下列要求,在 /home/greg/ansible/roles 中创建名为 apache 的角色:

  • httpd 软件包已安装,设为在系统启动时启用启动

  • 防火墙已启用并正在运行,并使用允许访问 Web 服务器的规则

  • 模板文件 index.html.j2 已存在,用于创建具有以下输出的文件 /var/www/html/index.html

    Welcome to HOSTNAME on IPADDRESS
    

    其中,HOSTNAME 是受管节点的完全限定域名IPADDRESS 则是受管节点的 IP 地址。

创建一个名为 /home/greg/ansible/apache.yml 的 playbook:

  • 该 play 在 webservers 主机组中的主机上运行并将使用 apache 角色
#生成在在指定的目录
$ ansible-galaxy role init \
  --init-path /home/greg/ansible/roles \
  apache
#查看
$ ansible-galaxy list
# 查看目录
tree main.yml
vim roles/apache/tasks/main.yml
---------
---
- name: Install the latest version of Apache
  ansible.builtin.yum:
    name: httpd
    state: latest
- name: Start service httpd, if not started
  ansible.builtin.systemd:
    name: httpd
    state: started
    enabled: yes
- name: Start service firewalld, if not started
  ansible.builtin.systemd:
    name: firewalld
    state: started
    enabled: yes
#考试时先做第五题否则没有posix集合
- name: permit apache
  ansible.posix.firewalld:
    service: http
    permanent: yes
    state: enabled
    immediate: yes
- name: j2
  ansible.builtin.template:
# path = roles/apache/templates/
    src: index.html.j2
    dest: /var/www/html/index.html

# template 添加模板
 vim roles/apache/templates/index.html.j2
---------
Welcome to {{ ansible_nodename }} on {{ ansible_default_ipv4.address }}
---------
# 使用角色
vim /home/greg/ansible/apache.yml
---------
---
- name: 创建和使用角色
  hosts: webservers
  roles:
  - apache
---------
# 运行
ansible-navigator run apache.yml -m stdout

8.从 Ansible Galaxy 使用角色

 vim /home/greg/ansible/roles.yml
 ---------
---
- name: 从 Ansible Galaxy 使用角色 1 
  hosts: webservers
  roles:
  - phpinfo

- name: 从 Ansible Galaxy 使用角色 2
  hosts: balancers
  roles:
  - balancer
----------

9.创建和使用分区

创建一个名为 /home/greg/ansible/partition.yml的 playbook,它将在prod 主机上运行以执行下列任务:

  • 该playbook只有一个play

  • 在prod主机组中创建分区

  • vdd创建一个1500M主分区,分区号为1,格式化ext4,并挂载到/newpart

  • vde创建一个1500M主分区,分区号为1,格式化ext4,并挂载到/newpart10

  • 如果磁盘空间不够,给出如下提示信息

Could not create partition of that size
  • 改为创建800M分区
  • 如果vde不存在,应显示提示信息
this disk is not exist

vim /home/greg/ansible/partition.yml

---
- name: create and use partition
  hosts: prod
  tasks:
    - block:
        - name: Create a partition with 1500m
          community.general.parted:
            device: "{{ item }}"
            number: 1
            state: present
            part_end: 1500MiB
          loop:
            - /dev/vdd
            - /dev/vde
      rescue:
        - name: report no 1500m
          ansible.builtin.debug:
            msg: Could not create partition of that size
        - name: Create a partition with 800m
          community.general.parted:
            device: "{{ item }}"
            number: 1
            state: present
            part_end: 800MiB
          loop:
            - /dev/vdd
            - /dev/vde
          ignore_errors: yes
      always:
        - name: Create a ext4 filesystem
          community.general.filesystem:
            fstype: ext4
            dev: "{{ item }}"
          loop:
            - /dev/vdd1
            - /dev/vde1
          ignore_errors: yes
        - name: Mount newpart
          ansible.posix.mount:
            path: /newpart
            src: /dev/vdd1
            fstype: ext4
            state: mounted
          when: ansible_devices.vdd is defined
        - name: Mount newpart1
          ansible.posix.mount:
            path: /newpart10
            src: /dev/vde1
            fstype: ext4
            state: mounted
          when: ansible_devices.vde is defined
        - name: report no vde
          ansible.builtin.debug:
            msg: this disk is not exist
          when: ansible_devices.vde is not defined

10. 生成主机文件

$ vim hosts.yml

---
- name: 生成主机文件
  hosts: all 
  tasks:
  - name: Template a file to /etc/myhosts
    ansible.builtin.template:
      src: /home/greg/ansible/hosts.j2
      dest: /etc/myhosts
    when: inventory_hostname in groups.dev

vim hosts.j2

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

{% for host in groups.all %}
{{ hostvars[host].ansible_default_ipv4.address }} {{ hostvars[host].ansible_nodename }} {{ hostvars[host].ansible_hostname }} 
{% endfor %}

11. 修改文件内容

按照下方所述,创建一个名为 /home/greg/ansible/issue.yml 的 playbook :

  • 该 playbook 将在所有清单主机上运行
  • 该 playbook 会将 /etc/issue 的内容替换为下方所示的一行文本:
    • dev 主机组中的主机上,这行文本显示 为:Development
    • test 主机组中的主机上,这行文本显示 为:Test
    • prod 主机组中的主机上,这行文本显示 : Production
---
- name: 修改文件内容
  hosts: all
  tasks:
  - name: Copy using inline content 1
    ansible.builtin.copy:
      content: 'Development'
      dest: /etc/issue
    when: inventory_hostname in groups.dev

  - name: Copy using inline content 2
    ansible.builtin.copy:
      content: 'Test'
      dest: /etc/issue
    when: inventory_hostname in groups.test

  - name: Copy using inline content 3
    ansible.builtin.copy:
      content: 'Production'
      dest: /etc/issue
    when: inventory_hostname in groups.prod

验证
ansible all -a ‘cat /etc/issue’

12. 创建 Web 内容目录

创建 Web 内容目录

按照下方所述,创建一个名为 /home/greg/ansible/webcontent.yml 的 playbook :

  • 该 playbook 在 dev 主机组中的受管节点上运行

  • 创建符合下列要求的目录/webdev

    • 所有者为 webdev
    • 具有常规权限:owner=read+write+execute, group=read+write+execute,other=read+execute
    • 具有特殊权限:设置组 ID
  • 用符号链接将 /var/www/html/webdev(链接文件) 链接到 /webdev(源文件)

  • 创建文件 /webdev/index.html ,其中包含如下所示的单行文件: Development

  • dev 主机组中主机上浏览此目录(例如 http://172.25.250.9/webdev/ )将生成以下输出:

    Development
    

vim /home/greg/ansible/webcontent.yml

---
- name: 创建 Web 内容目录
  hosts: dev
## 存在 httpd 服务;才存在主目录 /var/www/html
## 可以使用『角色』启动服务
  roles:
  - apache
  tasks:
## 可以使用『模块』启动服务
#  - name: Start service httpd, if not started
#    ansible.builtin.service:
#      name: httpd
#      state: started
#      enabled: yes
  - name: Create a directory if it does not exist
    ansible.builtin.file:
      path: /webdev
      state: directory
      group: webdev
      mode: u=rwx,g=rwxs,o=rx
#     mode: '2775'
  - name: Create a symbolic link
    ansible.builtin.file:
      src: /webdev
      dest: /var/www/html/webdev
      state: link
  - name: Copy using inline content
    ansible.builtin.copy:
      content: 'Development'
      dest: /webdev/index.html
      setype: httpd_sys_content_t

13. 生成硬件报告

生成硬件报告

创建一个名为 /home/greg/ansible/hwreport.yml 的 playbook ,它将在所有受管节点上生成含有以下信息的输出文件 /root/hwreport.txt

  • xz
  • MB 表示的总内存大小
  • BIOS 版本
  • 磁盘设备 vda 的大小
  • 磁盘设备 vdb 的大小
  • 输出文件中的每一行含有一个 key=value 对

您的 playbook 应当:

  • http://classroom/materials/hwreport.empty 下载文件,并将它保存为 /root/hwreport.txt
  • 使用正确的值改为 /root/hwreport.txt
  • 如果硬件项不存在,相关的值应设为 NONE

搜索魔法变量、
$ ansible all -m setup > setup.txt
创建
vim /home/greg/ansible/hwreport.yml

name: 生成硬件报告
hosts: all 
tasks:

- name: Download foo.conf
  ansible.builtin.get_url:
   url: http://materials/hwreport.empty
   dest: /root/hwreport.txt
  
- name: Ensure 1
  ansible.builtin.lineinfile:
   path: /root/hwreport.txt
   regexp: '^HOST='
   line: HOST={{ inventory_hostname | default('admin', true) }}
  
- name: Ensure 2
  ansible.builtin.lineinfile:
   path: /root/hwreport.txt
   regexp: '^MEMORY='
   line: MEMORY={{ ansible_memtotal_mb }}
  
- name: Ensure 3
  ansible.builtin.lineinfile:
   path: /root/hwreport.txt
   regexp: '^BIOS='
   line: BIOS={{ ansible_bios_version }}
  
- name: Ensure 4
  ansible.builtin.lineinfile:
   path: /root/hwreport.txt
   regexp: '^DISK_SIZE_VDA='
   line: DISK_SIZE_VDA={{ ansible_devices.vda.size }}
  
- name: Ensure 5
  ansible.builtin.lineinfile:
   path: /root/hwreport.txt
   regexp: '^DISK_SIZE_VDB='
   line: DISK_SIZE_VDB={{ ansible_devices.vdb.size | default('NONE', true) }}

14. 创建密码库

创建密码库

按照下方所述,创建一个 Ansible 库来存储用户密码:

  • 库名称为 /home/greg/ansible/locker.yml
  • 库中含有两个变量,名称如下:
    • pw_developer,值为 Imadev
    • pw_manager,值为 Imamgr
  • 用于加密和解密该库的密码为 whenyouwishuponastar
    • 密码存储在文件 /home/greg/ansible/secret.txt

密码本
$ echo whenyouwishuponastar > /home/greg/ansible/secret.txt

$ vim ansible.cfg

...内容省略...
vault_password_file = /home/greg/ansible/secret.txt

ansible-vault create /home/greg/ansible/locker.yml

---
pw_developer: Imadev
pw_manager: Imamgr

查看内容
$ ansible-vault view /home/greg/ansible/locker.yml
内容无法查看
$ cat /home/greg/ansible/locker.yml

15. 创建用户帐户

创建用户帐户

  • http://classroom/materials/user_list.yml 下载要创建的用户的列表,并将它保存到 /home/greg/ansible
  • 在本次练习中使用在其他位置创建的密码库 /home/greg/ansible/locker.yml 。创建名为 /home/greg/ansible/users.yml 的 playbook ,从而按以下所述创建用户帐户:
    • 职位描述为 developer 的用户应当:
      • devtest 主机组中的受管节点上创建
      • pw_developer 变量分配密码
      • 密码最大有效期30
      • 是补充组 devops 的成员
    • 职位描述为 manager 的用户应当:
      • prod 主机组中的受管节点上创建
      • pw_manager 变量分配密码
      • 密码最大有效期30
      • 是补充组 opsmgr 的成员
  • 密码采用 sha512 哈希格式。
  • 您的 playbook 应能够在本次练习中使用在其他位置创建的库密码文件 /home/greg/ansible/secret.txt 正常运行。
---
- name: 创建用户帐户 1
  hosts: dev,test
  vars_files:
  - /home/greg/ansible/locker.yml
  - /home/greg/ansible/user_list.yml
  tasks:
  - name: Ensure group 1
    ansible.builtin.group:
      name: devops
      state: present
  - name: Add the user 1
    ansible.builtin.user:
      name: "{{ item.name }}"
      groups: devops
      password: "{{ pw_developer | password_hash('sha512') }}"
      password_expire_max: "{{ item.password_expire_max }}"
    loop: "{{ users }}"
    when: item.job == 'developer'

- name: 创建用户帐户 2
  hosts: prod
  vars_files:
  - /home/greg/ansible/locker.yml
  - /home/greg/ansible/user_list.yml
  tasks:
  - name: Ensure group 2
    ansible.builtin.group:
      name: opsmgr
      state: present
  - name: Add the user 2
    ansible.builtin.user:
      name: "{{ item.name }}"
      groups: opsmgr
      password: "{{ pw_manager | password_hash('sha512') }}"
      password_expire_max: "{{ item.password_expire_max }}"
    loop: "{{ users }}"
    when: item.job == 'manager'

标签:name,.........,RHel9,builtin,ansible,Linux,vim,RHCS,yml
From: https://blog.csdn.net/qq_35911309/article/details/139397242

相关文章

  • Linux读写者管理sharefile文件,多个客户端向服务器输送信息,由服务器为中转站将信息存入
    Linux系统读写者将文件存入sharefile文件中,同时由多个客户端向服务器输入通信信息,并由服务器为中转站,将信息传入sharefile文件中(由于读写者存入sharefile文件的路径问题,sharefile文件要放入Linux虚拟机的“公共”文件中,不然不能运行,同时要将文件分开每个Makefile文件都要放在对......
  • L0- Linux+InternStudio 关卡
    一、使用密码进行SSH远程连接1.打开电脑powerShell终端  使用Win+R快捷键打开运行框,输入powerShell,打开powerShell终端2.回到开发机平台 进入开发机页面找到创建的开发机,点击SSH连接3.复制登录命令  粘贴到powershell中,然后按回车 出现以下页面:4.复制密码......
  • Linux上chrony配置时间同步、主从时间同步设备配置
    一.计算机设备上的两种时间1.硬件时间计算机主板BIOS上依靠主板电池供电维持运行的时间,设备关机后依然在持续计时,计算机系统开机启动时会自动读取这个时间。2.系统时间软件系统上的时间,软件启动后会去读取硬件时间,之后会独立于硬件时间运行。二.配置同步时间服务器1.安装服务(1)安装c......
  • C#实现信创国产Linux桌面录制成MP4(源码,银河麒麟、统信UOS)
    信创国产化已是大势所趋,在国产操作系统上的应用开发的需求越来越多,比如,有客户需要在银河麒麟和统信UOS上实现录制桌面生成一个mp4文件。那么这个要如何实现了?一.技术方案要完成这些功能,具体来说,需要解决如下几个技术问题:(1)桌面图像数据采集。(2)视频数据编码(H264)。(3)将编码后的......
  • 学Linux费用多少?有什么好处?
    Linux是一款开源、稳定、安全的操作系统,在云计算、大数据、物联网、金融、教育、电子商务等多个领域得到了广泛应用。尤其是随着互联网技术的发展,Linux专业人才需求量持续增长,其薪资待遇也较为丰厚,吸引了很多小伙伴前来学习。那么北京Linux培训要多少钱?包括哪些服务?以下是具......
  • 【Linux】Shell 编程规范及检查工具推荐
    本文内容均来自个人笔记并重新梳理,如有错误欢迎指正!如果对您有帮助,烦请点赞、关注、转发、订阅专栏!专栏订阅入口| 精选文章 | Kubernetes |Docker |Linux |羊毛资源 | 工具推荐 |往期精彩文章【Docker】(全网首发)KylinV10下MySQL容器内存占用异常的解决......
  • Linux 文件压缩和解压缩命令
    Linux文件压缩和解压缩命令在Linux操作系统中,文件压缩和解压缩是日常管理和维护任务中的重要一环。通过压缩文件,可以显著减少存储空间的使用,并加快网络传输速度。Linux提供了多种压缩和解压缩工具,每种工具都有其特定的格式和优势。以下是一些常用的Linux文件压缩和解压缩命令及......
  • 【PAM】Linux登录认证限制
    PAM(PluggableAuthenticationModules,可插拔认证模块)是一种灵活的认证框架,用于在Linux和其他类Unix系统上管理用户的身份验证。PAM允许系统管理员通过配置不同的认证模块来定制应用程序和服务的认证方式,而不需要修改这些应用程序的源代码。0、PAM介绍PAM的核心概念......
  • g++。gcc在linux下的适用
    gcc和g++编译器的常用命令行参数非常丰富,这些参数在编译过程中起着至关重要的作用。以下是一些常用的命令行参数及其解释:一、编译过程控制预处理(Pre-processing)-E:只执行预处理操作,不进行编译、汇编和链接。预处理过程包括宏替换、条件编译、头文件展开、删除注释等,输出预处理......
  • Linux网络命令
    1.ping测试网络连通性-c指定ping次数      ping -c4   4次停-i   指定间隔时间-s   指定数据包的大小2.ifconfig查询本机网络信息  作用与  ipa|addr相同ifconfig命令使用方法命令:ifconfig              ......