内容简介:本文风哥教程参考Linux官方文档、Red Hat Enterprise Linux官方文档、Ansible Automation Platform官方文档、Docker官方文档、Kubernetes官方文档和Podman官方文档等内容,详细介绍了相关技术的配置和使用方法。
风哥提示:
本文档介绍Ansible条件判断和循环的高级用法。
Part01-条件判断
1.1 when条件
[root@ansible ~]# cat > /fglinux/ansible/playbooks/conditions.yml << 'EOF' --- - name: 条件判断演示 hosts: all become: yes vars: app_env: production enable_firewall: true supported_os: - Rocky - RedHat - CentOS tasks: - name: Rocky系统安装软件 dnf: name: nginx state: present when: ansible_distribution == 'Rocky' - name: Ubuntu系统安装软件 apt: name: nginx state: present when: ansible_distribution == 'Ubuntu' - name: 生产环境配置 debug: msg: "配置生产环境参数" when: app_env == 'production' - name: 测试环境配置 debug: msg: "配置测试环境参数" when: app_env == 'testing' - name: 内存大于4GB的服务器配置 sysctl: name: vm.swappiness value: '10' state: present when: ansible_memtotal_mb > 4096
– name: 支持的操作系统检查
debug:
msg: “操作系统 {{ ansible_distribution }} 在支持列表中”
when: ansible_distribution in supported_os
– name: 配置防火墙
firewalld:
service: http
permanent: yes
state: enabled
when: enable_firewall | bool
– name: 多条件判断
debug:
msg: “生产环境且内存充足”
when:
– app_env == ‘production’
– ansible_memtotal_mb > 4096
– name: 或条件判断
debug:
msg: “Web服务器或数据库服务器”
when: “‘webservers’ in group_names or ‘dbservers’ in group_names”
– name: 条件取反
debug:
msg: “非测试环境”
when: not (app_env == ‘testing’)
EOF
# 执行条件判断Playbook
[root@ansible ~]# ansible-playbook /fglinux/ansible/playbooks/conditions.yml
PLAY [条件判断演示] **********************************************************
TASK [Gathering Facts] ******************************************************
ok: [web1.fgedu.net.cn]
ok: [web2.fgedu.net.cn]
TASK [Rocky系统安装软件] *****************************************************
ok: [web1.fgedu.net.cn]
ok: [web2.fgedu.net.cn]
TASK [Ubuntu系统安装软件] ****************************************************
skipping: [web1.fgedu.net.cn]
skipping: [web2.fgedu.net.cn]
TASK [生产环境配置] **********************************************************
ok: [web1.fgedu.net.cn] => {
“msg”: “配置生产环境参数”
}
ok: [web2.fgedu.net.cn] => {
“msg”: “配置生产环境参数”
}
TASK [测试环境配置] **********************************************************
skipping: [web1.fgedu.net.cn]
skipping: [web2.fgedu.net.cn]
TASK [内存大于4GB的服务器配置] ************************************************
changed: [web1.fgedu.net.cn]
changed: [web2.fgedu.net.cn]
TASK [支持的操作系统检查] ****************************************************
ok: [web1.fgedu.net.cn] => {
“msg”: “操作系统 Rocky 在支持列表中”
}
ok: [web2.fgedu.net.cn] => {
“msg”: “操作系统 Rocky 在支持列表中”
}
PLAY RECAP ******************************************************************
web1.fgedu.net.cn : ok=6 changed=1 unreachable=0 failed=0 skipped=2
web2.fgedu.net.cn : ok=6 changed=1 unreachable=0 failed=0 skipped=2
Part02-循环结构
2.1 loop循环
[root@ansible ~]# cat > /fglinux/ansible/playbooks/loops.yml << 'EOF' --- - name: 循环演示 hosts: webservers become: yes vars: users: - name: fgedu uid: 1001 shell: /bin/bash - name: appuser uid: 1002 shell: /sbin/nologin - name: backup uid: 1003 shell: /bin/bash directories: - /opt/fgedu - /opt/fgedu/logs - /opt/fgedu/data - /opt/fgedu/config firewall_services: - http - https - ssh packages: nginx: present mysql: present redis: present nodejs: absent tasks: - name: 创建多个用户 user: name: "{{ item.name }}" uid: "{{ item.uid }}" shell: "{{ item.shell }}" state: present loop: "{{ users }}" - name: 创建多个目录 file: path: "{{ item }}" state: directory mode: '0755' loop: "{{ directories }}" - name: 开放防火墙端口 firewalld: service: "{{ item }}" permanent: yes state: enabled loop: "{{ firewall_services }}" notify: Reload Firewall - name: 安装/卸载软件包 dnf: name: "{{ item.key }}" state: "{{ item.value }}" loop: "{{ packages | dict2items }}" - name: 使用with_items debug: msg: "处理项目: {{ item }}" with_items: - alpha - beta - gamma - name: 使用with_nested嵌套循环 debug: msg: "{{ item[0] }} - {{ item[1] }}" with_nested: - ['A', 'B'] - ['1', '2', '3'] - name: 使用with_together并行循环 debug: msg: "{{ item.0 }} -> {{ item.1 }}”
with_together:
– [‘server1’, ‘server2’, ‘server3’]
– [‘192.168.1.1’, ‘192.168.1.2’, ‘192.168.1.3’]
– name: 使用with_fileglob文件匹配
copy:
src: “{{ item }}”
dest: /tmp/
with_fileglob:
– /etc/ansible/*.cfg
handlers:
– name: Reload Firewall
service:
name: firewalld
state: reloaded
EOF
# 执行循环Playbook
[root@ansible ~]# ansible-playbook /fglinux/ansible/playbooks/loops.yml
PLAY [循环演示] **************************************************************
TASK [Gathering Facts] ******************************************************
ok: [web1.fgedu.net.cn]
TASK [创建多个用户] **********************************************************
changed: [web1.fgedu.net.cn] => (item={‘name’: ‘fgedu’, ‘uid’: 1001, ‘shell’: ‘/bin/bash’})
changed: [web1.fgedu.net.cn] => (item={‘name’: ‘appuser’, ‘uid’: 1002, ‘shell’: ‘/sbin/nologin更多学习教程公众号风哥教程itpux_com’})
changed: [web1.fgedu.net.cn] => (item={‘name’: ‘backup’, ‘uid’: 1003, ‘shell’: ‘/bin/bash’})
TASK [创建多个目录] **********************************************************
changed: [web1.fgedu.net.cn] => (item=/opt/fgedu)
changed: [web1.fgedu.net.cn] => (item=/opt/fgedu/logs)
changed: [web1.fgedu.net.cn] => (item=/opt/fgedu/data)
changed: [web1.fgedu.net.cn] => (item=/opt/fgedu/config)
TASK [开放防火墙端口] ********************************************************
changed: [web1.fgedu.net.cn] => (item=http)
changed: [web1.fgedu.net.cn] => (item=https)
changed: [web1.fgedu.net.cn] => (item=ssh)
TASK [安装/卸载软件包] *******************************************************
ok: [web1.fgedu.net.cn] => (item={‘key’: ‘nginx’, ‘value’: ‘present’})
ok: [web1.fgedu.net.cn] => (item={‘key’: ‘mysql’, ‘value’: ‘present’})
ok: [web1.fgedu.net.cn] => (item={‘key’: ‘redis’, ‘value’: ‘present’})
ok: [web1.fgedu.net.cn] => (item={‘key’: ‘nodejs’, ‘value’: ‘absent’})
TASK [使用with_items] *******************************************************
ok: [web1.fgedu.net.cn] => (item=alpha) => {
“msg”: “处理项目: alpha”
}
ok: [web1.fgedu.net.cn] => (item=beta) => {
“msg”: “处理项目: beta”
}
ok: [web1.fgedu.net.cn] => (item=gamma) => {
“msg”: “处理项目: gamma”
}
TASK [使用with_nested嵌套循环] ***********************************************
ok: [web1.fgedu.更多视频教程www.fgedu.net.cnnet.cn] => (item=[‘A’, ‘1’]) => {
“msg”: “A – 1”
}
ok: [web1.fgedu.net.cn] => (item=[‘A’, ‘2’]) => {
“msg”学习交流加群风哥微信: itpux-com: “A – 2”
}
ok: [web1.fgedu.net.cn] => (item=[‘A’, ‘3’]) => {
“msg”: “A – 3”
}
ok: [web1.fgedu.net.cn] => (item=[‘B’, ‘1’]) => {
“msg”: “B – 1”
}
ok: [web1.fgedu.net.cn] => (item=[‘B’, ‘2’]) => {
“msg”: “B – 2”
}
ok: [web1.fgedu.net.cn] => (item=[‘B’, ‘3’]) => {
“msg”: “B – 3”
}
RUNNING HANDLER [Reload Firewall] *******************************************
changed: [web1.fgedu.net.cn]
PLAY RECAP ******************************************************************
web1.fgedu.net.cn : ok=9 changed=4 unreachable=0 failed=0
- 使用明确的条件表达式
- 合理组织循环数据结构
- 避免过深的嵌套循环
- 使用过滤器简化数据处理
- 注意循环性能优化
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
