1. 在playbook中实现以下目标
1. 从主控节点复制一个文件到其他机器。
这里可以使用copy模块实现。
- copy模块的效果字如其名,就是把主控节点的东西复制到被控节点下。
- 把被控节点的东西拉取到主控,可以看第三点的fetch模块。
假设我们要把主控模块的/opt/AAA.txt复制到其他机器的/opt下,则:
- name : copy file
hosts: all
tasks:
- name : config copy
copy :
src: /opt/AAA.txt
dest: /opt/
2. 更新被控节点的系统。
如果要更新被控节点系统,则使用apt模块即可。(适用于ubuntu、debian系统)
- yum模块则是在centos,红帽使用
- 它的主要作用都是管理,安装,卸载,更新安装包。
- 在进行这些操作时最好使用
become:yes这个参数提高权限至root。
- name:update
hosts:all
become:yes #安装软件包需要系统管理权限
tasks:
- name: update package #更新
apt:
update_cache: yes
- name: upgrade package #相当于执行apt-get update
apt:
upgrade: yes #相当于执行aptitude safe-upgrade
3. 复制某个被控节点的文件到主控节点。
负责被控节点的文件到本地也可以理解为拉取被控节点的文件,我们使用Fetch模块来实现这个功能。
假设我们要把被控节点/etc/bbb.txt拉取到主控节点/opt/pull/下时:
- name: fetch file
host: all
tasks:
- name: just fetch
fetch:
src: /etc/bbb.txt
dest: /opt/pull/
4. 使用apt模块在被控节点上安装Nginx,并设置为开机不启动。
这里我们可以拆分为两个task来做。
- 第一个task用apt模块安装nginx
- 第二个则使用systemd模块来设置开机不启动。
这两个模块的功能都有点类似linux里自带的程序,systemd可以理解为用来管理进程的模块
- name: Nginx config
hosts: all
become: yes
tasks:
- name: install nginx
apt:
name: nginx
state: present
- name: nginx disable
systemd:
name: nginx
enabled: no
state: stopped
5. 在playbook中定义一个变量,通过变量的形式将每个机器的IP地址写入到被控机器中的/opt/ip.txt中。
变量可以使用内置的ansible_default_ipv4.address获取每个ip的地址,再用template模块进行渲染。
ansible_default_ipv4.address是什么
- 获取到每个ip值的内置变量
template模块的作用
- 生成配置文件或其他文本文件
- 发送到被控节点中(指定src,dest等)
.j2是什么?
- 一个模板文件
- 除了变量的值因机而异外,其他的都一样。
我们把主机的j2写在/templates(一般都在这个下边)下,并传到被控的/opt下即可
- name: var into iptxt
hosts: all
become: yes
vars:
node_ip: "{{ansible_default_ipv4.address}}"
task:
- name: ip file
template:
src: templates/ip.j2
dest: /opt/ip.txt
6. 替换上面/opt/ip.txt的IP地址,IP地址的前两段替换为111.222。
替换的模块则可以使用replace。
replace的作用:
- 顾名思义,替换内容
- 一般通过正则表达式或是
replace参数来替换。
要将ip地址的前两段替换成111.222,则需要使用正则表达式替换。
- name: Replace IP
hosts: all
become: yes
tasks:
- name: Replace
replace:
path: /opt/ip.txt
regexp: '(\d+\.\d+)\.\d+\.\d+'
replace: '111.222.\\3.\\4' #替换后的结果
7. 在playbook中插入一个task,使用错误的shell命令(比如:aabb /xxx),并忽略错误让playbook可以继续执行。
忽略错误让playbook继续执行,只需要加入ignore_errors参数就可以了。
- ignore_errors参数能够忽略错误让playbook继续执行。
- name: ignore errors
hosts: all
tasks:
- name: echo
shell:
cmd: echo "AAA"
- name: aaa
shell:
cmd: aaa?
ignore_errors: yes
- name: echo 2
shell:
cmd: echo "2"
2. Ansible项目相关内容
1. 为什么使用Ansible项目,而不是直接使用系统的Ansible配置。
解答这个问题,我们首先要明白Ansible项目和Ansible系统配置的区别。
1. 什么是ansible配置
在我们安装完成ansible时,系统会自动给我们生成如/ansible/ansible.cfg,/ansible/inventory,/ansible/hosts这类配置文件。我们称之为ansible系统配置文件。
这些配置文件通常是影响全局的,如果直接使用系统的ansible配置,后续的备份修改也麻烦,处于生产环境下就容易产生混乱,所以我们就引出了ansible项目的概念。
2. 什么是ansible项目
ansible项目其实就是把所有ansible目录放在自己指定的文件路径下的意思。
- 本质上是一个包括所有资源的,具有结构化特点的目录结构(?)
- 通常版本控制的(比如Git)目录结构
- 包含了用于配置和管理一组服务器(或任何资源)所需的所有Ansible资源。
2. Ansible项目由哪些目录组成。
大概由这些核心目录构成:
- ansible.cfg
- README.md
- inventory/
- group_vars/
- host_vars/
- roles/
- playbooks/
大概长这样:
3. 这些目录的作用是什么
- ansible.cfg
- Ansible项目的配置文件,定义了Ansible如何运行。包括但不限于:
- 默认的主机清单文件位置
- 默认的远程用户
- README.md
- Ansible项目的说明文档。一般是用来解释整个项目,包括但不限于:
- 如何设置和使用这个项目。
- 项目的作用
- inventory/
- 定义Ansible要管理的主机列表。包括但不限于:
- 定义指定主机的IP地址或域名
- 对被控主机进行分组
- groupvars/(AOE?)
- 放着按主机组定义的变量文件。(相当于局部变量存储点)
- 文件名会对应主机组,存放自定义的变量
- 对应组会自动应用这些变量
- hostvars/(单体)
- 存放着按单个主机名定义的变量文件。
- 优先级大于group_var,遇上时会覆盖groupvars
- 不会影响同个组的其他主机,仅对单体有用
- playbooks/
- 存放着Play文件,每一个play里边存放着roles列表
- 是定义了达成什么目的(蓝图),实际上执行操作的地方
- 定义了:
- 哪些主机或主机组(通过 hosts 指定)需要执行任务。
- 具体要执行哪些任务(通过 tasks 列表指定)。
- 在哪些情况下执行特定操作(例如 handlers,在某个任务成功后才触发)。
- ….
- 它相当于我们linux的用户,当进行某一类操作时,通过调用指定的模块来完成具体的动作(?
- 就像我们在linux上负责东西使用 cp /opt/AAA.txt /file/ 一样
- 他也是一开始封装内置在/usr/bin下边的
- 而在ansible,我们会在roles下边先写好这个task,等到要用的时候调用就可以了
- 就像我们在linux上负责东西使用 cp /opt/AAA.txt /file/ 一样
- roles/
- Roles是一个结构化的目录集合,包含用于完成特定任务(如安装Web服务器、配置数据库)所需的所有内容。不过它不是执行的地方,是被封装起来的结构。
- 就有点像linux的命令,命令被放在usr/bin目录下,但是真正派上用场是等用户的调用操作。
- playbook就相当于用户的角色
- 就有点像linux的命令,命令被放在usr/bin目录下,但是真正派上用场是等用户的调用操作。