RHCE 考试笔记

考试速查笔记

  • 查找模块
1
ansible-doc -l | grep <关键字>
  • 模块说明
1
ansible-doc -s <模块名>
  • 导航器预演剧本 (--check)
    一定要保证执行剧本时位于 ansible.cfg 同目录下。
1
ansible-navigator run -C <playbook.yml>
  • 保存事实变量为文件方便查阅
1
ansible servera -m setup > facts
  • 查找软件包安装的 roles 位置
1
2
3
yum search roles
rpm -ql rhel-system-roles
ls /usr/share/ansible/roles/
  • 修改容器镜像仓库配置文件
1
vim /etc/containers/registries.conf     # 无需重启

第 1 题:安装和配置 Ansible

题目

按照下方所述,在控制节点 workstation.lab.example.com 上安装和配置 Ansible:

  1. 安装所需的软件包
  2. 创建名为 /home/devops/ansible/inventory 的静态清单文件, 以满足以下需求:
    • serveradev 主机组的成员
    • serverbtest 主机组的成员
    • servercserverdprod 主机组的成员
    • bastionbalancers 主机组的成员
    • prod 组是 webservers 主机组的成员
  3. 创建名为 /home/devops/ansible/ansible.cfg 的配置文件, 以满足以下要求:
    • 主机清单文件为 /home/devops/ansible/inventory
    • playbook 中使用的角色的位置包括 /home/devops/ansible/roles
    • playbook 中使用的集合的位置包括 /home/devops/ansible/mycollections

笔记 ansible.cfg

1
2
3
4
5
6
7
8
# 安装必须软件,复制配置文件
yum install ansible-core ansible-navigator -y
su - devops
cp /etc/ansible ~

# 将原有主机清单文件重命名并编辑
mv hosts inventory
vim inventory
  • inventory 示例
1
2
3
4
5
6
7
8
9
10
11
[dev]
servera
[test]
serverb
[prod]
serverc
serverd
[balancers]
bastion
[webservers:children] # 注意嵌套组的写法!
prod
  • ansible.cfg 示例,可通过 ansible-config init > /tmp/ansible.cfg 生成完整示例
1
2
3
4
5
6
7
8
9
10
11
[defaults]
inventory = /home/devops/ansible/inventory
roles_path = /home/devops/ansible/roles
collections_path = /home/devops/ansible/mycollections:/usr/share/ansible/collections # 后面这个路径不能删!
remote_user = devops # 指定远程用户!
host_key_checking = false # 免密!
[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False

第 2 题:创建受管节点存储库

题目

请按照下方所述, 创建一个名为/home/devops/ansible/yum_repo.yml的playbook, 该剧本在各个受管
节点上安装yum存储库:

  • 存储库1:
    • 存储库的名称为 rh294_BASE
    • 描述为 rh294 base software
    • 基础 URL 为 http://content.example.com/rhel9.0/x86_64/dvd/BaseOS
    • GPG 签名检查为启用状态
    • GPG 密钥 URL 为 http://content.example.com/rhel9.0/x86_64/dvd/RPM-GPG-KEY-redhat-release
    • 存储库为开启状态
  • 存储库2:
    • 存储库的名称为 rh294_STREAM
    • 描述为 rh294 stream software
    • 基础 URL 为 http://content.example.com/rhel9.0/x86_64/dvd/AppStream
    • 签名检查为启用状态
    • GPG 密钥 URL 为 http://content.example.com/rhel9.0/x86_64/dvd/RPM-GPG-KEY-redhat-release
    • 存储库为开启状态

笔记:模块yum_repository

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# yum_repo.yml
- name: 管理 yum 仓库
hosts: all
tasks:
- name: BaseOS
yum_repository:
name: rh294_BASE
description: rh294 base software
baseurl: http://content.example.com/rhel9.0/x86_64/dvd/BaseOS
gpgcheck: yes
gpgkey: http://content.example.com/rhel9.0/x86_64/dvd/RPM-GPG-KEY-redhat-release
enabled: yes
- name: STREAM
yum_repository:
name: rh294_STREAM
description: rh294 stream software
baseurl: http://content.example.com/rhel9.0/x86_64/dvd/AppStream
gpgcheck: yes
gpgkey: http://content.example.com/rhel9.0/x86_64/dvd/RPM-GPG-KEY-redhat-release
enabled: yes

验证:

1
ansible all -m shell -a 'yum clean all && yum makecache'

第 3 题:安装软件包

题目

创建一个名为 /home/devops/ansible/packages.yml 的 playbook:

  1. phpmariadb 软件包安装到 devtestprod 主机组中的主机上
  2. Development Tools 软件包组安装到 dev 主机组中的主机上
  3. dev 主机组中主机上的所有软件包更新为最新版本

笔记:模块 yum

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# packages.yml
- name: 安装软件包
hosts: dev,test,prod
tasks:
- name: install php mariadb
yum:
name: "{{ item }}" # 可以不用变量,分两次写
state: present
loop:
- php
- mariadb

- name: 安装和升级
hosts: dev
tasks:
- name: 安装软件包组
yum:
name: "@Development Tools" # 软件包组用 @ 开头
state: present
- name: 升级所有软件
yum:
name: "*" # 通配符
state: latest

"{{ var }}" jinja2 引用变量时要用双引号括起来。

第 4 题:使用 Timesync RHEL 系统角色

题目

安装 RHEL 系统角色软件包,并创建符合以下条件的 playbook /home/devops/ansible/timesync.yml

  1. 在所有受管节点上运行
  2. 使用 timesync 角色
  3. 配置该角色,以使用当前有效的 NTP 提供
  4. 配置该角色,以使用时间服务器 classroom.example.com

笔记:角色 timesync

  • timesync.yml 示例
1
2
3
4
5
6
7
8
- name: 使用 timesync 角色
hosts: all
vars:
timesync_ntp_servers:
- hostname: classroom.example.com
iburst: yes
roles:
- timesync
  • 可以直接复制角色的 README 的示例。
  • 考试使用的角色都来自 rhel-system-roles 软件包,位于 /usr/share/ansible/roles/

第 5 题:使用 SELINUX RHEL 系统角色

题目

安装 RHEL 角色,并使用 seLinux 角色,要求在所有节点运行,将 SELINUX 设置为强制模式

笔记:角色 selinux

1
2
3
4
5
6
7
8
- name: 使用 selinux 角色
hosts: all
vars:
selinux_policy: targeted
selinux_state: enforcing
roles:
- role: selinux
become: true

第 6 题:使用 Ansible Galaxy 安装角色

题目

使用 Ansible Galaxy 和要求文件 /home/devops/ansible/roles/requirements.yml,从以下 URL 下载
角色并安装到 /home/devops/ansible/roles

笔记:命令 ansible-galaxy role install

编辑依赖列表

1
2
3
4
- name: balancer
src: http://classroom.example.com/content/haproxy.tar.gz
- name: phpinfo
src: http://classroom.example.com/content/phpinfo.tar.gz
1
2
3
4
5
6
# 默认安装到当前目录 ansible.cfg 指定的位置,保险起见加上 -p 指定安装位置
# -r 指定依赖列表文件
ansible-galaxy role install -r /home/devops/ansible/roles/requirements.yml -p /home/devops/ansible/roles

# 检查
ll /home/devops/ansible/roles

第 7 题:安装集合

题目

http://content.example.com/ 以下集合,下载到 /home/devops/ansible/mycollections 目录下,并
面向用户 devops

  • ansible-posix-1.5.1.tar.gz
  • community-general-6.3.0.tar.gz

笔记:命令 ansible-galaxy collection install

1
2
3
# 默认安装到当前目录 ansible.cfg 指定的位置,保险起见加上 -p 指定安装位置
ansible-galaxy collection install http://content.example.com/ansible-posix-1.5.1.tar.gz -p /home/devops/ansible/mycollections
ansible-galaxy collection install http://content.example.com/community-general-6.3.0.tar.gz -p /home/devops/ansible/mycollections

第 8 题:创建和使用角色

题目

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

  1. httpd 软件包已安装,设为在系统启动时启用
  2. 防火墙已启用并正在运行,并使用允许访问 Web 服务器的规则
  3. 模板文件 index.html.j2 已存在,用于创建具有以下输出的文件 /var/www/html/index.html
    • Welcome to HOSTNAME on IPADDRESS
    • 其中,HOSTNAME 是受管节点的完全限定域名,IPADDRESS 则是受管节点的 IP 地址。
  4. 按照下方所述,创建一个使用此角色的 playbook /home/devops/ansible/newrole.yml
    • 该 playbook 在 webservers 主机组中的主机上运行

笔记:命令 ansible-galaxy role init

  • roles 目录下初始化一个 role
1
ansible-galaxy role init apache --init-path /home/devops/ansible/roles
  • 编辑模板文件 roles/apache/templates/index.html.j2
1
Welcome to {{ ansible_hostname }} on {{ ansible_default_ipv4.address }}

事实变量提前使用 setup 模块重定向到文件查阅。

  • 编辑任务 roles/apache/tasks/main.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
- name: 安装 httpd
yum:
name: httpd
state: present

- name: 设置服务
systemd:
name: {{ item }}
enabled: yes # 开机自启
state: started # 立即启动
loop:
- firewalld
- httpd

- name: 设置防火墙规则
firewalld:
service: http
zone: public
permanent: true # 永久生效
immediate: true # 立即生效
state: enabled

- name: 使用模板
template:
src: index.html.j2
dest: /var/www/html/index.html

第 9 题:从 Ansible Galaxy 使用角色

题目

根据下列要求,创建一个名为 /home/devops/ansible/roles.yml 的 playbook:

  1. playbook 中包含一个 play,该 play 在 balancers 主机组中的主机上运行并将使用 balancer 角色。
    • 此角色配置一项服务,以在 webservers 主机组中的主机之间平衡 Web 服务器请求的负载。
    • 浏览到 balancers 主机组中的主机(例如 http://bastion.lab.example.com/)将生成以下输出:
      • Welcome to serverc.example.com on 172.25.250.12
    • 重新加载浏览器将从另一 Web 服务器生成输出:
      • Welcome to serverd.example.com on 172.25.250.13
  2. playbook 中包含一个 play,该 play 在 webservers 主机组中的主机上运行并将使用 phpinfo 角色。
    • 通过 URL /hello.php 浏览到 webservers 主机组中的主机将生成以下输出:
      • Hello PHP World from FQDN
      • 其中,FQDN是主机的完全限定名称。
    • 例如,浏览到 http://serverc.lab.example.com/hello.php 会生成以下输出:
      • Hello PHP World from serverc.lab.example.com
      • 另外还有 PHP 配置的各种详细信息,如安装的PHP 版本等。
    • 同样,浏览到 http://serverd.lab.example.com/hello.php 会生成以下输出:
      • Hello PHP World from serverd.lab.example.com
      • 另外还有 PHP 配置的各种详细信息,如安装的PHP 版本等。

笔记:使用角色

  • roles.yml 示例
1
2
3
4
5
6
7
8
9
10
11
- hosts: webservers     # 用于采集事实变量

- name: balancer
hosts: balancers
roles:
- balancer

- name: webserver
hosts: webservers
roles:
- phpinfo

第 10 题:创建和使用逻辑卷

题目

创建一个名为 /home/devops/ansible/lv.yml 的 playbook,它将在所有受管节点上运行以执行下列任务

  1. 创建符合以下要求的逻辑卷:
    • 逻辑卷创建在 research 卷组中
    • 逻辑卷名称为 data
    • 逻辑卷大小为 600MiB
  2. 使用 ext4 文件系统格式化逻辑卷
  3. 如果无法创建请求的逻辑卷大小,应显示错误消息
    • Could not create logical volume of that size,并且应改为使用大小 400MiB
  4. 如果卷组 research 不存在 ,应显示错误消息
    • Volume group does not exist
  5. 不要以任何方式挂载逻辑卷。

笔记:模块 lvol filesystem

  • lv.yml 示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
- hosts: all
tasks:
- name: 存在 research vg
block:
- name: 创建 600m lv
lvol:
vg: research
size: 600m
lv: data
rescue:
- name: 上面报错,则创建 400m lv
lvol:
vg: research
size: 400m
lv: data
- name: 输出信息
debug:
msg: Could not create logical volume of that size
always:
- name: 格式化
filesystem:
fstype: ext4
dev: /dev/research/data
when: "'research' in ansible_lvm.vgs" # 判断条件
- name: 不存在 research vg 则输出信息
debug:
msg: Volume group does not exist
when: "'research' not in ansible_lvm.vgs" # 判断条件

第 11 题:创建分区(难点)

题目

创建一个名为 /home/devops/ansible/parted.yml 的 playbook,它将在 dev 主机组上运行下列任务

  1. 如果磁盘 /dev/vdd 存在,则创建 1500m 分区
  2. 如果无法创建请求的分区大小,应显示错误消息
    • Could not create partition of that size,并且应改为使用大小 800m
  3. 如果磁盘/dev/vdd不存在 ,应显示错误消息
    • disk /dev/vdd does not exist
  4. 如果磁盘 /dev/vdb 存在,则创建 1500m 分区
  5. 如果无法创建请求的分区大小,应显示错误消息

笔记:模块 parted filesystem mount

  • parted.yml 示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
- hosts: dev
tasks:
- name: vdd 存在则
block:
- name: 创建 1500m 分区
parted:
device: /dev/vdd
state: present
part_end: 1501MiB # 注意单位
number: 1
rescue:
- name: 报错则创建 800m 分区
parted:
device: /dev/vdd
state: present
part_end: 801MiB # 注意单位
number: 1
- name: 输出信息
debug:
msg: Could not create partition of that size
always:
- name: 格式化
filesystem:
fstype: ext4
dev: /dev/vdd1
force: true # 如果前面做过错误尝试,加这个
- name: 挂载
mount:
path: /mnt/fs01
src: /dev/vdd1
fstype: ext4
state: mounted
when: "'vdd' in ansible_devices"

- name: vdd 不存在则
block:
- name: 输出信息
debug:
msg: disk /dev/vdd does not exist
when: "'vdd' not in ansible_devices"

- name: vdb 存在则
block:
- name: 创建 1500m 分区
parted:
device: /dev/vdb
state: present
part_end: 1501MiB # 注意单位
number: 1
rescue:
- name: 创建 800m 分区
parted:
device: /dev/vdb
state: present
part_end: 801MiB # 注意单位
number: 1
- name: 输出信息
debug:
msg: Could not create partition of that size
always:
- name: 格式化
filesystem:
fstype: ext4
dev: /dev/vdb1
force: true # 如果前面做过错误尝试,加这个
- name: 挂载
mount:
path: /mnt/fs01
src: /dev/vdb1
fstype: ext4
state: mounted
when: "'vdb' in ansible_devices"
  • 分区默认从 1MiB 开始,所以要在 n+1MiB 结束
  • 务必在被控节点使用 lsblk 检查结果

第 12 题:生成主机文件(难点)

题目

  1. 编写模板文件 /home/devops/ansible/hosts.j2,针对每个清单主机包含一行内容,其格式与 /etc/hosts 相同。
  2. 创建名为 /home/devops/ansible/hosts.ymlplaybook,它将使用此模板在 dev 主机组中的主机上生成文件 /etc/myhosts
  3. 该 playbook 运行后,dev 主机组中主机上的文件 /etc/myhosts 应针对每个受管主机包含一行内容。

笔记: 魔法变量

  • hosts.j2 示例
1
2
3
4
5
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_fqdn }} {{ hostvars[host].ansible_hostname }}
{% endfor %}
  • hosts.yml 示例
1
2
3
4
5
6
7
- hosts: all    # 收集事实变量
- hosts: dev
tasks:
- name: 使用模板
template:
src: hosts.j2
dest: /etc/myhosts
  • groups 魔法变量,含主机清单中所有主机的列表,其中 groups.allall 分组下的所有主机的列表;
  • host 自定义变量,在 groups.all 中遍历(servera, serverb 等);
  • hostvars 魔法变量,含主机清单中所有主机的变量,hostvars[host] 则是每次循环按顺序变成主机列表中某台主机的变量(hostvars[servera], hostvars[serverb] 等);
  • ansible_default_ipv4.address ansible_fqdn ansible_hostname 事实变量,可通过 setup 模块单独收集。

第 13 题:修改文件内容

题目

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

  1. 该 playbook 将在所有清单主机上运行
  2. 该 playbook 会将 /etc/issue 的内容替换为下方所示的一行文本:
    • dev 主机组中的主机上,这行文本显示为:Development
    • test 主机组中的主机上,这行文本显示为:Test
    • prod 主机组中的主机上,这行文本显示为:Production

笔记:模块 copy 魔法变量 group_names

  • issue.yml 示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
- hosts: all
tasks:
- copy:
content: "Devlopment\n" # 注意换行
dest: /etc/issue
when: "'dev' in group_names"
- copy:
content: "Test\n" # 注意换行
dest: /etc/issue
when: "'test' in group_names"
- copy:
content: "Production\n" # 注意换行
dest: /etc/issue
when: "'pord' in group_names"

第 14 题:创建 Web 内容目录

题目

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

  1. 该 playbook 在 dev 主机组中的受管节点上运行
  2. 创建符合下列要求的目录 /webdev
    • 拥有组为 devops
    • 具有常规权限:owner=read+write+execute,group=read+write+execute,other=read+execute
    • 具有特殊权限: set group ID
  3. 用符号链接将 /var/www/html/webdev 链接到 /webdev
  4. 创建文件 /webdev/index.html,其中包含如下所示的单行文本:Development
  5. 在 dev 主机组中主机上浏览此目录(例如 http://servera.lab.example.com/webdev/ )将生成以下输出:
    • Development

笔记:模块 file

  • webcontent.yml 示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
- hosts: dev
tasks:
- name: 安装 httpd
yum:
name: httpd
state: present
- name: 开机自启 httpd
systemd:
name: httpd
enabled: yes # 开机启动
state: started # 立即启动
- name: 防火墙放行
firewalld:
service: http
immediate: yes # 立即生效
permanent: yes # 永久生效
state: enabled
- name: 创建目录
file:
path: /webdev
state: directory
owner: root
group: devops
mode: '2775'
setype: httpd_sys_content_t # selinux 类型
- name: 创建文件
copy:
content: "Devlopment"
dest: /webdev/index.html
setype: httpd_sys_content_t # selinux 类型
- name: 创建软链接
file:
src: /webdev
dest: /var/www/html/webdev
state: link # 软链接

第 15 题:生成硬件报告

题目

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

  • 清单主机名称
  • 以 MB 表示的总内存大小
  • BIOS 版本
  • 磁盘设备 vda 的大小
  • 磁盘设备 vdb 的大小
  • 输出文件中的每一行含有一个 key=value 对。
    您的 playbook 应当:
  1. http://172.25.254.254/content/hwreport.empty 下载文件,并将它保存为 /root/hwreport.txt
  2. 使用正确的值修改 /root/hwreport.txt
  3. 如果硬件项不存在,相关的值应设为 NONE

笔记:模块 get_url replace

  • hwreport.yml 示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
- hosts: all
tasks:
- name: 下载文件
get_url:
url: http://172.25.254.254/content/hwreport.empty
dest: /root/hwreport.txt
- name: 替换清单主机名称
replace:
path: /root/hwreport.txt
regexp: 'inventoryhostname'
replace: '{{ inventory_hostname }}' # 魔法变量
- name: 替换内存总大小
replace:
path: /root/hwreport.txt
regexp: 'memory_in_MB'
replace: "{{ ansible_memtotal_mb}}"
- name: 替换 BIOS 版本号
replace:
path: /root/hwreport.txt
regexp: 'BIOS_version'
replace: "{{ ansible_bios_version }}"
- name: 替换 vda 大小
replace:
path: /root/hwreport.txt
regexp: 'disk_vda_size'
replace: "{{ ansible_devices.vda.size | default('NONE') }}"
- name: 替换 vdb 大小
replace:
path: /root/hwreport.txt
regexp: 'disk_vdb_size'
replace: "{{ ansible_devices.vdb.size | default('NONE') }}"

大部分是事实变量,通过 setup 模块单独收集后查询。

第 16 题:创建密码库

题目

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

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

笔记:命令 ansible-vault encrypt

  • locker.yml 示例
1
2
pw_developer: Imadev
pw_manager: Imamgr
  • 加密文件
1
ansible-vault encrypt locker.yml
  • 保存密码
1
echo fgydsxsxsbxs > secret.txt

第 17 题:创建用户账户(难点)

题目

  1. http://172.25.254.254/content/user_list.yml 下载要创建的用户的列表,并将它保存到 /home/devops/ansible,用户密码来自于 /home/devops/ansible/locker.yml 文件。
  2. 创建名为 /home/devops/ansible/users.yml 的 playbook,从而按以下所述创建用户帐户:
    • 职位描述为 developer 的用户应当:
      • devtest 主机组中的受管节点上创建
      • pw_developer 变量分配密码
      • 是附加组 devops 的成员
    • 职位描述为 manager 的用户应当:
      • prod 主机组中的受管节点上创建
      • pw_manager 变量分配密码
      • 是附加组 opsmgr 的成员
  3. 密码应采用 SHA512 哈希格式。
  4. 您的 playbook 应能够在本次考试中使用在其他位置创建的库密码文件 /home/devops/ansible/secret.txt 正常运行。

笔记:模块 user group

  • 下载文件
1
wget http://172.25.254.254/content/user_list.yml
  • users.yml 示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
- hosts: dev, test
vars_files:
- locker.yml
- user_list.yml
tasks:
- name: devops 组存在
group:
name: devops
state: present
- name: 遍历 users,只在 job developer 时创建用户
user:
name: "{{ item.name }}"
uid: "{{ item.uid }}"
groups: devops
password: "{{ pw_developer | password_hash('sha512') }}" # 密码需要哈希
loop: "{{ users }}"
when: item.job == 'developer'

- hosts: prod
vars_files:
- locker.yml
- user_list.yml
tasks:
- name: 保证 opsmgr 组存在
group:
name: opsmgr
state: present
- name: 遍历 users,只在 job manager 时创建用户
user:
name: "{{ item.name }}"
uid: "{{ item.uid }}"
groups: opsmgr
password: "{{ pw_manager | password_hash('sha512') }}" # 密码需要哈希
loop: "{{ users }}"
when: item.job == 'manager'
  • jinja2 对密码进行哈希的语法是 {{ password | password_hash('sha512') }}
  • ansible-navigator run 指定密码文件的方法是 --vault-password-file

user_list.yml 这个例子中

1
2
3
4
5
6
7
8
9
10
users:
- name: bob
job: developer
uid: 1101
- name: sally
job: manager
uid: 1102
- name: fred
job: developer
uid: 1103
  • users 对应的变量值是一个列表,列表中每个元素是一个字典
  • loop列表里的所有元素进行遍历,
  • item 在每一轮循环拿一个元素(在这里是字典),
  • item.name 引用字典中 name 键值对应的变量值

第 18 题:更新 Ansible 库的密钥

题目

按照下方所述,更新现有 Ansible 库的密钥:

  1. http://172.25.254.254/content/salaries.yml 下载 Ansible 库到 /home/devops/ansible
  2. 当前的库密码为 insecure4sure
  3. 新的库密码为 bbe2de98389b
  4. 库使用新密码保持加密状态

笔记:命令 ansible-vault rekey

1
2
wget http://172.25.254.254/content/salaries.yml
ansible-vault rekey salaries.yml

第 19 题:创建计划任务

题目

natasha 创建一个计划任务,要求每隔 2 分钟执行一次 echo hello,playbook 文件名为 cron.yml,该 playbook 在 dev 主机组上运行。

笔记:模块 cron

  • cron.yml 示例
1
2
3
4
5
6
7
8
9
10
11
12
- hosts: dev
tasks:
- name: 保证用户存在
user:
name: natasha
state: present
- name: 创建计划任务
cron:
name: "exec tasks every 2 minute"
minute: "*/2"
user: natasha
job: "echo hello"