RHCS认证-Linux(RHel9)-Ansible

news2024/11/14 22:22:11

文章目录

  • 一、ansible 简介
  • 二 、ansible部署
  • 三、ansible服务端测试
  • 四 、ansible 清单inventory
  • 五、Ad-hot 点对点模式
  • 六、YAML语言模式
  • 七、RHCS-Ansible
    • 附:安装CentOS-Stream 9系统
    • 7.1 ansible 执行过程
    • 7.2 安装ansible,ansible-navigator
    • 7.2 部署ansible
    • 7.3 ansible-navigator
    • 7.4 YAML
    • 7.5 管理变量和事实
    • 7.6 管理机密
    • 7.7 管理事实
    • 7.8 实施任务控制
      • 循环使用变量
      • 有条件的运行任务
      • 处理程序handlers
      • 错误处理
    • 7.9 管理复杂的playbook
      • 创建角色
  • 八.训练题
    • 1. 安装和配置 Ansible安装ansible
    • 2. 配置系统以使用默认存储库
    • 3. 安装软件包
    • 4. 配置collection
    • 5.使用 RHEL 系统角色
    • 6.使用 Ansible Galaxy 安装角色
    • 7. 创建和使用角色
    • 8.从 Ansible Galaxy 使用角色
    • 9.创建和使用分区
    • 10. 生成主机文件
    • 11. 修改文件内容
    • 12. 创建 Web 内容目录
    • 13. 生成硬件报告
    • 14. 创建密码库
    • 15. 创建用户帐户

一、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 root@192.168.10.92
ssh-copy-id root@192.168.10.93

)定义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'

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2161706.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

点亮一个LED灯

一、任务分析 一个灯怎么样才会亮? 图中的小灯两端接正负极,小灯就会点亮,但是我们不能主动控制灯的亮灭,于是加入了开关。开关打开断开小灯正极,小灯就会熄灭,反之则点亮。 在板子上的灯是如何连接的&…

Spring Boot集成Redis向量数据库实现相似性搜索

1.什么是Redis向量数据库? Redis 是一个开源(BSD 许可)的内存数据结构存储,用作数据库、缓存、消息代理和流式处理引擎。Redis 提供数据结构,例如字符串、哈希、列表、集合、带范围查询的有序集合、位图、超对数日志、…

Qt开发-comboBox 所有槽函数介绍(2024.09)

activated(int): 触发于ComboBox中某一项被激活时,参数为该项的索引。 currentIndexChanged(QString)/currentIndexChanged(int): 当前选中项变化时触发,前者传递文本,后者传递索引。 currentTextChanged(QString): 当前选中项的文字变更时触…

Ubuntu 与Uboot网络共享资源

1、NFS 1.1 Ubuntu 下 NFS 服务开启 sudo apt-get install nfs-kernel-server rpcbind 等待安装完成,安装完成以后在用户根目录下创建一个名为“Linux”的文件夹,以后所有 的东西都放到这个“Linux”文件夹里面,在“Linux”文件夹里面新建…

Qt获取本机Mac地址、Ip地址

一、简述 今天给大家分享一个获取本机IP地址和Mac地址的方法,经过多次测试,台式机、笔记本等多个设备,暂时没有发现问题。 由于很多时候本地安装了虚拟机、蓝牙、无线网卡或者其他设备等,会有多个Mac地址,所以需要进…

【828华为云征文|如何轻松部署“未知表白墙”项目:华为云Flexus X实例指南】

文章目录 华为云 Flexus X 实例:开启高效云服务的新纪元部署【未知表白墙】项目准备工作具体操作指南服务器环境确认宝塔软件商店操作域名解析未知表白墙登录页修改管理员账号和密码未知表白墙管理页面基础设置表白管理 未知表白墙效果查看 总结 华为云 Flexus X 实…

c++924

2 #include <iostream> #include <cstring>using namespace std;class MyString { private:char *str; // 记录C风格的字符串int size; // 记录字符串的实际长度public:// 定义无参构造MyString() : size(0) {str new char[1];str[0] \0;cou…

Unity中Rigidbody 刚体组件和Rigidbody类是什么?

Rigidbody 刚体组件 Rigidbody 是 Unity 中的一个组件&#xff0c;它可以让你的游戏对象像真实世界中的物体一样移动和碰撞。想象一下&#xff0c;你有一个小球&#xff0c;你希望它像真实世界中的球一样滚动、弹跳和碰撞&#xff0c;那么你就可以给这个小球添加一个 Rigidbod…

JavaScript中的日期和时间

日期和时间 JS语言核心包括Date()构造函数&#xff0c;用来创建表示日期和时间的对象。提供了简单的API. 代码实现&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>3.1.5 日期和时间</title></hea…

3D模型在UI设计中应用越来越多,给UI带来了什么?

当前3D模型在UI设计中应用很多&#xff0c;极大地拓展了UI设计的发挥空间&#xff0c;也拓宽了UI的应用领域&#xff0c;本文分享下UI中引入3D模型到底能带来什么价值. 3D模型在UI设计中的应用可以给用户界面带来以下几个方面的好处&#xff1a; 更真实的视觉体验&#xff1a;…

【2024W36】肖恩技术周刊(第 14 期):什么是完美副业?

周刊内容: 对一周内阅读的资讯或技术内容精品&#xff08;个人向&#xff09;进行总结&#xff0c;分类大致包含“业界资讯”、“技术博客”、“开源项目”和“工具分享”等。为减少阅读负担提高记忆留存率&#xff0c;每类下内容数一般不超过3条。 更新时间: 星期天 历史收录:…

2016年国赛高教杯数学建模C题电池剩余放电时间预测解题全过程文档及程序

2016年国赛高教杯数学建模 C题 电池剩余放电时间预测 铅酸电池作为电源被广泛用于工业、军事、日常生活中。在铅酸电池以恒定电流强度放电过程中&#xff0c;电压随放电时间单调下降&#xff0c;直到额定的最低保护电压&#xff08;Um&#xff0c;本题中为9V&#xff09;。从充…

TAPD多类别需求管理

本文档将介绍&#xff1a;什么是 TAPD 多类别需求管理&#xff0c;以及如何配置或创建新的需求类别。 一、概述 在研发管理过程中&#xff0c;团队经常会遇到规模扩张、不同特性团队间研发模式差异化大等问题。以上问题导致团队中的需求无法进行统一管理。为解决上述情况&…

54 螺旋矩阵

解题思路&#xff1a; \qquad 这道题可以直接用模拟解决&#xff0c;顺时针螺旋可以分解为依次沿“右-下-左-上”四个方向的移动&#xff0c;每次碰到“边界”时改变方向&#xff0c;边界是不可到达或已经到达过的地方&#xff0c;会随着指针移动不断收缩。 vector<int>…

Adobe Illustrator吸管工具提取的颜色与原色之间存在色差

问题原因&#xff1a; 被提取颜色的对象是外部链接图片&#xff0c;对其提取的颜色会与AI中看到的颜色不同 如下图所示&#xff0c;中间的矩形与外部矩形的内部颜色存在色差 解决办法&#xff1a; 方法一&#xff1a;将该外部图片利用屏幕截图的形式&#xff0c;粘贴到AI中。…

【Linux】fork入门级使用

目录 一、前置准备 1、进程的基本概念 2、进程标识符PID、PPID 1&#xff09;pid介绍 2&#xff09;获取pid和ppid 二、fork函数 1、fork的基本介绍 1&#xff09;fork&#xff08;&#xff09;&#xff1a; 创建子进程 2&#xff09;对于函数具体的描述 3&#xff09…

深入探索卷积神经网络(CNN)

深入探索卷积神经网络&#xff08;CNN&#xff09; 前言图像的数字表示灰度图像RGB图像 卷积神经网络&#xff08;CNN&#xff09;的架构基本组件卷积操作填充&#xff08;Padding&#xff09;步幅&#xff08;Strides&#xff09; 多通道图像的卷积池化层全连接层 CNN与全连接…

应急响应--来不来得及走流程...

免责声明&#xff1a;本文仅做分享&#xff01; 应急响应详解 概述 应急响应是现代信息安全管理中的重要一环。随着网络威胁的日益复杂化&#xff0c;企业和组织必须具备快速响应安全事件的能力&#xff0c;以最大限度地减少数据泄露、业务中断以及经济损失。本文将从应急响应…

华为全联接大会2024 | 一文回顾华为云开发者联盟重磅干货

目录 华为开发者空间预置更多工具资源&#xff0c;带来丰富场景案例 携手鲲鹏、鸿蒙、昇腾等根生态&#xff0c;使能开发者创新 学习体验、内容体系全面升级&#xff0c;助力开发者高效学习根技术 参与丰富线上体验活动&#xff0c;赢取精美礼品 在刚刚结束的华为全联接大会…

香港科技大学广州|金融科技学域博士招生宣讲会——武汉大学、华中科技大学

&#x1f514;&#x1f514;&#x1f514;明日宣讲&#x1f514;&#x1f514;&#x1f514; &#x1f490;香港科技大学广州&#xff5c;金融科技学域博士招生宣讲会 &#x1f4cd;武汉大学专场 &#x1f559;时间&#xff1a;2024年9月24日&#xff08;星期二&#xff09;1…