1. 首页 > Linux教程 > 正文

Linux教程FG405-Ansible条件与循环

内容简介:本文风哥教程参考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

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息