文章目录
- 一、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由红帽公司收购,并逐渐成为运维工程师必备的技能之一。该工具具有以下特点:
- 部署简单:只需在主控端部署Ansible环境,被控端无需做任何
- 操作。 默认使用SSH协议:对设备进行管理,保障通信安全。
功能模块丰富:拥有大量常规运维操作模块,可实现日常绝大部分操作。- 支持Playbooks:通过定义多个任务的YAML文件来定制配置和状态管理。
- 轻量级:无需在客户端安装agent,更新时只需在操作机上进行一次更新即可。
Ansible命令的执行过程包括加载配置文件和模块文件、生成并传输临时Python文件、在远程服务器上执行命令、返回结果并删除临时文件。
以下是详细的步骤:
加载配置文件:Ansible首先会加载配置文件,通常为ansible.cfg,这个文件包含了Ansible运行的各种参数和设置。
加载模块文件:根据使用的具体模块(如command、shell等),加载相应的模块文件。这些模块定义了要在远程服务器上执行的具体操作。
生成传输临时Python文件:Ansible将模块或命令生成一个临时的Python(.py)文件,并通过SSH传输到远程服务器的$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件中。
执行命令:Ansible给临时文件添加执行权限,然后在远程服务器上执行这个临时文件,具体命令通过nohup方式在后台运行,确保即使SSH连接断开,命令也能继续执行。
返回结果:命令执行完成后,结果会被传回Ansible主控端,同时输出到终端或保存到指定文件中。
删除临时文件:为了安全性,执行完成后,临时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
的用户应当:
- 在
dev
和test
主机组中的受管节点上创建- 从
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'