环境版本说明
- RedHat9 [Red Hat Enterprise Linux release 9.0]
- Ansible [core 2.13.3]
- Python [3.9.10]
- jinja [3.1.2]
1. 主机管理
主机模式的常用方式
- ad-hoc 方式
ansible node1 -m ping
- Playbook中的hosts字段
---
- name:
hosts: node1
清单中的主机匹配方式
[192.168.1.[1:100] # 表示 182.168.1.1--192.168.1.100
server[a:d].example.com # 表示 servera.example.com---serverd.example.com
all # 代表清单中的所有主机
ungrouped # 不属于任何主机组的主机
Playbook中的hosts字段
- 使用特殊字符,必须添加单引号
&
代表与的意思!
代表非的意思
hosts: '*' # 代表清单中的所有主机,必须添加单引号
hosts: '*.example.com' # 代表example.com域中的所有主机
hosts: all # 代表清单中的所有主机
hosts: servera,serverb # 代表主机servera和serverb
hosts: group1,&group2 # 匹配同时属于group1和group2的主机
hosts: group1,!group2 # 匹配属于group1但是不属于group2的主机
2. 并发数设置
在Ansible的配置文件中,存在forks字段,默认值为5,可以同时并发处理5台主机
可以通过将值修改为2台主机,然后运行一个简单的基本,看到细微的效果
forks=2
[Step1]:
编写playbook文件,文件内容如下:
vim forks.yml
# 文件内容如下
---
- name: play1
hosts: all
tasks:
- name: forks2
ansible.builtin.debug:
msg: "forks=2"
[Step2]:
运行playbook,可以看到两台主机两台主机的运行
ansible-navigator run forks.yml -m stdout
3. 滚动更新
实现效果:将serial设置为2,两台主机运行完整运行完成后,后续主机再接着完成
例如:清单文件有servera、serverb、serverc、serverd;在设置滚动更新为2时,会先在servera和serverb上运行完所有Play,然后才在serverc、serverd上运行。
[Step1]:
编写playbook文件,文件内容如下:
vim serial.yml
# 文件内容如下
---
- name: play1
hosts: node1,node2,node3,node4
serial: 2 # 设置滚动更新
tasks:
- name: debug msg
ansible.builtin.debug:
msg: debug {{ inventory_hostname }} # 打印信息
[Step2]:
运行playbook,可以看到先在node1和node2上完整执行完Play后,再在node3和node4上执行
ansible-navigator run serial.yml -m stdout
4. 导入playbook
当一个playbook很长很复杂时,可以拆分为较小的文件以便于管理,通过模块化管理,可以将多个不功能的Play,组合成一个主要的playbook,在文件中的人物列表插入Play,这样可以将这种模块化的Play应用到不同的场景。
[Step1]:
编写子playbook文件install_apache.yml,文件内容如下:
vim install_apache.yml
# 文件内容如下
---
- name:
hosts: node1
tasks:
- name: Install the latest version of Apache
ansible.builtin.dnf: # 安装Apache服务
name: httpd
state: latest
[Step2]:
编写子playbook文件start_httpd.yml,文件内容如下:
vim start_httpd.yml
# 文件内容如下
---
- name:
hosts: node1
tasks:
- name: Start service httpd, if not started
ansible.builtin.service: # 启动Apache服务
name: httpd
state: started
[Step3]:
编写子playbook文件mode_index.yml,文件内容如下:
vim mode_index.yml
# 文件内容如下
---
- name:
hosts: node1
tasks:
- name: Index
ansible.builtin.copy: # 添加索引页
content: 'Hello World'
dest: /var/www/html/index.hmtl
[Step4]:
编写主playbook文件master.yml,文件内容如下:
vim master.yml
# 文件内容如下
---
- name: play1
hosts: node1
tasks:
- name: import install_apache # 可以不写
import_playbook: install_apache.yml # 导入playbook
- name: import mode_index
import_playbook: mode_index.yml
- name: import start_httpd
import_playbook: start_httpd.yml
[Step5]:
验证playbook语法
ansible-navigator run master.yml -m stdout --syntax-check
[Step6]:
运行playbook
ansible-navigator run master.yml -m stdout
5. 包含与导入
包含和导入只是单纯的将任务导入,而非整个playbook导入。Ansible有两种方法可以将文件放入playbook中
- 包含:内容是一个动态操作。在playbook运行期间,Ansible会在内容到达时处理所包含的内容
- 导入:内容是一个静态操作。在运行开始之前,Ansible会在最初解析playbook时预处理导入的内容。
包含和导入的书写方式
---
- name:
hosts: node1
tasks:
- include_tasks: tasks.yml
- import_tasks: tasks.yml