内容简介:本文风哥教程参考Linux官方文档、Red Hat Enterprise Linux官方文档、Ansible Automation Platform官方文档、Docker官方文档、Kubernetes官方文档和Podman官方文档等内容,详细介绍了相关技术的配置和使用方法。
本文
风哥提示:
档介绍Ansible变量与模板的高级用法。
Part01-变量类型
1.1 变量定义方式
[root@ansible ~]# cat > /etc/ansible/host_vars/web1.fgedu.net.cn.yml << 'EOF' ansible_host: 192.168.1.20 ansible_user: root nginx_port: 80 app_env: production EOF # 组变量定义 [root@ansible ~]# cat > /etc/ansible/group_vars/webservers.yml << 'EOF' http_port: 80 https_port: 443 max_connections: 1024 document_root: /var/www/html packages: - nginx - php-fpm - mysql services: - nginx - php-fpm EOF # 在Playbook中定义变量 [root@ansible ~]# cat > /fglinux/ansible/playbooks/vars_demo.yml << 'EOF' --- - name: 变量演示 hosts: webservers become: yes vars: app_name: fgedu_app更多学习教程公众号风哥教程itpux_com app_version: 2.0.0 config_items: - name: timeout value: 30 - name: retries value: 3 - name: cache_size value: 1024 tasks: - name: 显示简单变量 debug: msg: "应用: {{ app_name }} 版本: {{ app_version }}" - name: 显示列表变量 debug: msg: "软件包: {{ packages | join(', ') }}" - name: 显示字典变量 debug: msg: "配置项: {{ item.name }} = {{ item.value }}" loop: "{{ config_items }}" - name: 显示Facts变量 debug: msg: | 主机名: {{ ansible_hostname }} IP地址: {{ ansible_default_ipv4.address }} 系统: {{ ansible_distribution }} {{ ansible_distribution_version }} 内存: {{ ansible_memtotal_mb }} MB CPU核心: {{ ansible_processor_vcpus }} EOF # 执行变量演示 [root@ansible ~]# ansible-playbook /fglinux/ansible/playbooks/vars_demo.yml PLAY [变量演示] ************************************************************** TASK [Gathering Facts] ****************************************************** ok: [web1.fgedu.net.cn] TASK [显示简单变量] ********************************************************** ok: [web1.fgedu.netfrom PG视频:www.itpux.com.cn] => {
“msg”: “应用: fgedu_app 版本: 2.0.0”
}
TASK [显示列表变量] *********************************************************学习交流加群风哥微信: itpux-com*
ok: [web1.fgedu.net.cn] => {
“msg”: “软件包: nginx, php-fpm, mysql”
}
TASK [显示字典变量] **********************************************************
ok: [web1.fgedu.net.cn] => (item={‘name’: ‘timeout’, ‘value’: 30}) => {
“msg”: “配置项: timeout = 30”
}
ok: [web1.fgedu.net.cn] => (item={‘name’: ‘retries’, ‘value’: 3}) => {
“学习交流加群风哥QQ113257174msg”: “配置项: retries = 3”
}
ok: [web1.fgedu.net.cn] => (item={‘name’: ‘cache_size’, ‘value’: 1024}) => {
“msg”: “配置项: cache_size = 1024”
}
TASK [显示Facts变量] *********************************************************
ok: [web1.fgedu.net.cn] => {
“msg”: “主机名: web1\nIP地址: 192.168.1.20\n系统: Rocky 9.3\n内存: 8192 MB\nCPU核心: 4”
}
PLAY RECAP ******************************************************************
web1.fgedu.net.cn : ok=5 changed=0 unreachable=0 failed=0
Part02-Jinja2模板
2.1 模板语法
[root@ansible ~]# cat > /fglinux/ansible/templates/app_config.j2 << 'EOF' # 应用配置文件 # Generated by Ansible # from:www.itpux.com.qq113257174.wx:itpux-com [server] host = {{ ansible_default_ipv4.address }} port = {{ app_port | default(8080) }} workers = {{ ansible_processor_vcpus * 2 }} max_connections = {{ max_connections | default(1024) }} [database] {% if db_type == 'mysql' %} host = {{ db_host }} port = {{ db_port | default(3306) }} name = {{ db_name }} user = {{ db_user }} password = {{ db_password }} {% elif db_type == 'postgresql' %} host = {{ db_host }} port = {{ db_port | default(5432) }} name = {{ db_name }} user = {{ db_user }} password = {{ db_password }} {% endif %} [cache] {% if cache_enabled | default(false) %} backend = {{ cache_backend | default('redis') }} host = {{ cache_host }} port = {{ cache_port | default(6379) }} ttl = {{ cache_ttl | default(3600) }} {% else %} backend = none {% endif %} [logging] level = {{ log_level | default('INFO') }} file = {{ log_file | default('/var/log/app/app.log') }} max_size = {{ log_max_size | default('100M') }} backup_count = {{ log_backup_count | default(5) }} {% if extra_config is defined %} [extra] {% for key, value in extra_config.items() %} {{ key }} = {{ value }} {% endfor %} {% endif %} # 环境特定配置 {% if app_env == 'production' %} debug = false profiling = false {% elif app_env == 'staging' %} debug = true profiling = false {% else %} debug = true profiling = true {% endif %} EOF # 使用模板的Playbook [root@ansible ~]# cat > /fglinux/ansible/playbooks/template_demo.yml << 'EOF' --- - name: 模板演示 hosts: webservers become: yes vars: app_port: 8080 db_type: mysql db_host: 192.168.1.30 db_name: fgedudb db_user: fgedu db_password: Password@123 cache_enabled: true cache_host: 192.168.1.40 app_env: production log_level: INFO extra_config: feature_x: enabled feature_y: disabled tasks: - name: 创建配置目录 file: path: /opt/fgedu/config state: directory mode: '0755' - name: 部署应用配置 template: src: ../templates/app_config.j2 dest: /opt/fgedu/config/app.ini owner: root group: root mode: '0644' backup: yes - name: 显示生成的配置 command: cat /opt/fgedu/config/app.ini register: config_content changed_when: false - name: 输出配置内容 debug: var: config_content.stdout_lines EOF # 执行模板演示 [root@ansible ~]# ansible-playbook /fglinux/ansible/playbooks/template_demo.yml PLAY [模板演示] ************************************************************** TASK [Gathering Facts] ****************************************************** ok: [web1.fgedu.net.cn] TASK [创建配置目录] ********************************************************** changed: [web1.fgedu.net.cn] TASK [部署应用配置] ********************************************************** changed: [web1.fgedu.net.cn] TASK [显示生成的配置] ******************************************************** ok: [web1.fgedu.net.cn] TASK [输出配置内容] ********************************************************** ok: [web1.fgedu.net.cn] => {
“config_content.stdout_lines”: [
“# 应用配置文件”,
“# Generated by Ansible”,
“”,
“[server]”,
“host = 192.168.1.20”,
“port = 8080”,
“workers = 8”,
“max_connections = 1024”,
“”,
“[database]”,
“host = 192.168.1.30”,
“port = 3306”,
“name = fgedudb”,
“user = fgedu”,
“password = Password@123”,
“”,
“[cache]”,
“backend = redis”,
“host = 192.168.1.40”,
“port = 6379”,
“ttl = 3600”,
“”,
“[logging]”,
“level = INFO”,
“file = /var/log/app/app.log”,
“max_size = 100M”,
“backup_count = 5”,
“”,
“[extra]”,
“feature_x = enabled”,
“feature_y = disabled”,
“”,
“debug = false”,
“profiling = false”
]
}
PLAY RECAP ******************************************************************
web1.fgedu.net.cn : ok=5 changed=2 unreachable=0 failed=0
- 合理组织变量层级结构
- 使用默认值提高灵活性
- 敏感信息使用Vault加密
- 模板添加注释说明
- 使用过滤器处理数据
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
