当前位置: 首页 > news >正文

Linux入门DAY24

Linux入门DAY24

Ansible

实施任务控制

实验环境

[phoenix@controller ~ 10:55:24]$ cat ansible.cfg 
[defaults]
remote_user = phoenix
inventory = ./inventory[privilege_escalation]
become = True
become_user = root
become_method = sudo
become_ask_pass = False[phoenix@controller ~ 10:55:06]$ cat inventory 
controllernode1
node2
node3
node4

编写循环任务

简单循环
#准备测试文件
[phoenix@controller ~ 10:32:35]$ vim deploy_web1.yml#playbook
---
- name: Enable intranet serviceshosts: node1tasks:- name: latest version of httpd and firewalld installedyum:name:- httpd- firewalldstate: latest- name: test html page is installedcopy:content: "Welcome tp {{ansible_hostname}}  WebSite!\n"dest: /var/www/html/index.html- name: firewalld enabled and runningservice:name: "{{ item }}"enabled: truestate: startedloop:- httpd- firewalld - name: firewalld permits access to httpd servicefirewalld:service: httppermanent: truestate: enabledimmediate: yes- name: httpd enabled and runningservice:name: httpdenabled: truestate: started- name: Test intranet web serverhosts: localhostbecome: notasks:- name: connect to intranet web serveruri:url: http://node1return_content: yesstatus_code: 200...[phoenix@controller ~ 10:39:22]$ ansible-playbook deploy_web1.yml PLAY [Enable intranet services] ***************************************************************************TASK [Gathering Facts] ************************************************************************************
ok: [node1]TASK [latest version of httpd and firewalld installed] ****************************************************
ok: [node1]TASK [test html page is installed] ************************************************************************
changed: [node1]TASK [firewalld enabled and running] **********************************************************************
ok: [node1] => (item=httpd)
ok: [node1] => (item=firewalld)TASK [firewalld permits access to httpd service] **********************************************************
ok: [node1]TASK [httpd enabled and running] **************************************************************************
ok: [node1]PLAY [Test intranet web server] ***************************************************************************TASK [Gathering Facts] ************************************************************************************
ok: [localhost]TASK [connect to intranet web server] *********************************************************************
ok: [localhost]PLAY RECAP ************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node1                      : ok=6    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   #测试
[phoenix@controller ~ 10:39:29]$ curl node1
Welcome tp node1  WebSite!
[phoenix@controller ~ 10:39:39]$ curl node2
Hello World From node2
[phoenix@controller ~ 10:39:44]$ curl node3
Hello World From node3
[phoenix@controller ~ 10:39:46]$ curl node4
Hello World From node4
循环散列
#loop用户
[phoenix@controller ~ 10:51:39]$ vim deploy_web2.yml1 ---                           2 - name: add several users3   hosts: node14   gather_facts: no5   vars:6     users:7       - name: jane8         groups: wheel9       - name: joe10         groups: root11   tasks:12     - name: add users 13       user:14         name: "{{ item.name }}"15         state: present16         groups: "{{ item.groups }}"  17       loop: "{{ users }}"18 ...  [phoenix@controller ~ 10:52:21]$ ansible-playbook deploy_web2.yml PLAY [add several users] **********************************************************************************TASK [add users] ******************************************************************************************
changed: [node1] => (item={u'name': u'jane', u'groups': u'wheel'})
changed: [node1] => (item={u'name': u'joe', u'groups': u'root'})PLAY RECAP ************************************************************************************************
node1                      : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
循环关键字

with items

- name: test loophosts: node1gather_facts: notasks:- name: add usersuser:name: "{{ item }}"state: presentgroups: "wheel"with_items:- jane- joe

ping loop

[phoenix@controller ~ 11:31:25]$ vim testnode2.yml
1 ---  2 - name: test loop3   hosts: node14   gather_facts: no5   tasks:6     - shell: ping -c1 -w 2 node2                                                                       7       register: result8       until: result.rc == 09       retries: 2010       delay: 111 ...[phoenix@controller ~ 11:31:14]$ ansible-playbook testnode2.yml PLAY [test loop] ******************************************************************************************TASK [shell] **********************************************************************************************
changed: [node1]PLAY RECAP ************************************************************************************************
node1                      : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   [phoenix@controller ~ 11:31:18]$ ansible-playbook testnode2.yml --ask-vault-pass
Vault password: PLAY [test loop] ******************************************************************************************TASK [shell] **********************************************************************************************
changed: [node1]PLAY RECAP ************************************************************************************************
node1                      : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

编写条件任务

when 语句
[phoenix@controller ~ 14:06:25]$ cat test.yml
---
- name: testhosts: node1gather_facts: novars:username: devopssupergroup: wheeltasks:- name: gather user informationshell: id {{ username }}register: result- name: Task run if user is in supergroupsuser:name: "{{ username }}"groups: "{{ supergroup }}"append: yeswhen: supergroup not in result.stdout
...#运行
[phoenix@controller ~ 13:44:26]$ ansible-playbook test.yml PLAY [test] ***********************************************************************************************TASK [gather user information] ****************************************************************************
changed: [node1]TASK [Task run if user is in supergroups] *****************************************************************
changed: [node1]PLAY RECAP ************************************************************************************************
node1                      : ok=2    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
变量判断
[phoenix@controller ~ 14:06:29]$ cat test1.yml 
---
- name: testhosts: node1 node3gather_facts: notasks:- name: install httpdyum: name: httpdstate: presentwhen: inventory_hostname in groups.webs- name: install mariadbyum:name: mariadbstate: presentwhen: inventory_hostname in groups.dbs
...#运行
[phoenix@controller ~ 14:02:34]$ ansible-playbook test1.yml PLAY [test] ***********************************************************************************************TASK [install httpd] **************************************************************************************
skipping: [node3]
ok: [node1]TASK [install mariadb] ************************************************************************************
skipping: [node1]
changed: [node3]PLAY RECAP ************************************************************************************************
node1                      : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
node3                      : ok=1    changed=1    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   

loop 和 when 联合

  1 ---2 - name: Combining Loops and Conditional Play3   hosts: node14   tasks:5   - name: install mariadb-server if enough space on root6     yum:7       name: mariadb-server8       state: latest9     loop: "{{ ansible_mounts }}"10     when:11       - item.mount == "/"12       - item.size_available > 30000000013 ...                                                                                                    
~       #运行
[phoenix@controller ~ 14:25:14]$ ansible-playbook test3.yml PLAY [Combining Loops and Conditional Play] ***************************************************************TASK [Gathering Facts] ************************************************************************************
ok: [node1]TASK [install mariadb-server if enough space on root] *****************************************************
skipping: [node1] => (item={u'block_used': 35554, u'uuid': u'd43a42ec-932d-441b-b612-bc418aff8ea0', u'size_total': 1063256064, u'block_total': 259584, u'mount': u'/boot', u'block_available': 224030, u'size_available': 917626880, u'fstype': u'xfs', u'inode_total': 524288, u'options': u'rw,relatime,attr2,inode64,noquota', u'device': u'/dev/sda1', u'inode_used': 326, u'block_size': 4096, u'inode_available': 523962}) 
changed: [node1] => (item={u'block_used': 491363, u'uuid': u'5573248a-295f-49ea-a0f0-10d7e246a26a', u'size_total': 50432839680, u'block_total': 12312705, u'mount': u'/', u'block_available': 11821342, u'size_available': 48420216832, u'fstype': u'xfs', u'inode_total': 24637440, u'options': u'rw,relatime,attr2,inode64,noquota', u'device': u'/dev/mapper/centos-root', u'inode_used': 33463, u'block_size': 4096, u'inode_available': 24603977})PLAY RECAP ************************************************************************************************
node1                      : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

Ansible Handlers

Handlers(处理器) 是 Ansible 中一种特殊的任务,它 不会立即执行,而是 被其他任务 notify(通知)后,在 Playbook 的末尾统一执行

Handlers 主要用于 管理服务的重启、配置重载等操作,确保它们只在 真正发生变更时执行,避免不必要的重启

[phoenix@controller ~ 14:33:50]$ vim testhandlers.yml
---
- name: deploy web serverhosts: node1tasks:- name: install packagesyum:name: httpdstate: presentnotify:- enable and restart apache- name: install httpd-manualyum:name: httpd-manualstate: presentnotify:- enable and restart apache- debug: msg: last task in taskshandlers:- name: enable and restart apacheservice:name: httpdstate: restartedenabled: yes
...#运行
[phoenix@controller ~ 14:41:04]$ ansible-playbook testhandlers.yml PLAY [deploy web server] **********************************************************************************TASK [Gathering Facts] ************************************************************************************
ok: [node1]TASK [install packages] ***********************************************************************************
ok: [node1]TASK [install httpd-manual] *******************************************************************************
changed: [node1]TASK [debug] **********************************************************************************************
ok: [node1] => {"msg": "last task in tasks"
}RUNNING HANDLER [enable and restart apache] ***************************************************************
changed: [node1]PLAY RECAP ************************************************************************************************
node1                      : ok=5    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

meta 模块

[phoenix@controller ~ 19:42:36]$ vi testmeta.yml 1 ---2 - name: deploy db server3   hosts: node14   tasks:5     - name: install mariadb6       yum:7         name:8           - mariadb-server9           - MySQL-python10         state: present11       notify:12         - enable_and_start_db13  14     - meta: flush_handlers15  16     - name: add mariadb user17       mysql_user:18         name: phoenix0119         password: 120  21   handlers:22     - name: enable_and_start_db23       service:24         name: mariadb25         state: started26 ...                                                                                           
[phoenix@controller ~ 19:42:27]$ ansible-playbook testmeta.ymlPLAY [deploy db server] ***********************************************************************************TASK [Gathering Facts] ************************************************************************************
ok: [node1]TASK [install mariadb] ************************************************************************************
changed: [node1]RUNNING HANDLER [enable_and_start_db] *********************************************************************
ok: [node1]TASK [add mariadb user] ***********************************************************************************
[WARNING]: The value ******** (type int) in a string field was converted to u'********' (type string). If
this does not look like what you expect, quote the entire value to ensure it does not change.
[WARNING]: Module did not set no_log for update_password
changed: [node1]PLAY RECAP ************************************************************************************************
node1                      : ok=4    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

errors

fail模块

[phoenix@controller ~ 14:49:00]$ vim failedtest.yml
[phoenix@controller ~ 15:00:48]$ ansible-playbook faildtest.yml 
ERROR! the playbook: faildtest.yml could not be found
[phoenix@controller ~ 15:00:59]$ ansible-playbook failedtest.yml PLAY [test failed_when] ***********************************************************************************TASK [Gathering Facts] ************************************************************************************
ok: [node1]TASK [shell] **********************************************************************************************
changed: [node1]PLAY RECAP ************************************************************************************************
node1                      : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   [phoenix@controller ~ 15:01:09]$ vim failedtest.yml
[phoenix@controller ~ 15:03:01]$ ansible-playbook failedtest.yml PLAY [test fail module] ***********************************************************************************TASK [Gathering Facts] ************************************************************************************
ok: [node1]TASK [shell] **********************************************************************************************
fatal: [node1]: FAILED! => {"changed": true, "cmd": "/root/adduser", "delta": "0:00:00.003069", "end": "2025-08-14 15:03:06.261860", "msg": "non-zero return code", "rc": 127, "start": "2025-08-14 15:03:06.258791", "stderr": "/bin/sh: /root/adduser: 没有那个文件或目录", "stderr_lines": ["/bin/sh: /root/adduser: 没有那个文件或目录"], "stdout": "", "stdout_lines": []}PLAY RECAP ************************************************************************************************
node1                      : ok=1    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0   

force_handlers

当hanlers处理任务失败后,可以选择–force强制执行

[phoenix@controller ~ 19:48:44]$ vim force.yml
---
- name: testhosts: node1force_handlers: yestasks:- name: a task which always notifies its handlercommand: /bin/truenotify: restart the sshd- name:  fails because the package doesn't existyum:name: notexistpkgstate: latesthandlers:- name: restart the sshdservice:name: sshdstate: restarted
...       [phoenix@controller ~ 19:54:14]$ ansible-playbook force.yml PLAY [test] ***********************************************************************************************TASK [Gathering Facts] ************************************************************************************
ok: [node1]TASK [a task which always notifies its handler] ***********************************************************
changed: [node1]TASK [fails because the package doesn't exist] ************************************************************
fatal: [node1]: FAILED! => {"changed": false, "msg": "No package matching 'notexistpkg' found available, installed or updated", "rc": 126, "results": ["No package matching 'notexistpkg' found available, installed or updated"]}RUNNING HANDLER [restart the sshd] ************************************************************************
changed: [node1]PLAY RECAP ************************************************************************************************
node1                      : ok=3    changed=2    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0   

failed_when

[phoenix@controller ~ 19:54:29]$ vim failedwhen.yml- name: test failed_whenhosts: node1tasks:- shell: /root/adduserregister: command_resultfailed_when: "'failed' in command_result.stdout"#运行
[phoenix@controller ~ 19:57:09]$ ansible-playbook failedwhen.yml PLAY [test failed_when] **********************************************************************************TASK [Gathering Facts] ***********************************************************************************
ok: [node1]TASK [shell] *********************************************************************************************
changed: [node1]PLAY RECAP ***********************************************************************************************
node1                      : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

changed when

[phoenix@controller ~ 19:57:23]$ vim changewhen.yml- name: changed_whenhosts: node1tasks:- name: upgrade-databaseshell: /usr/local/bin/upgrade-databaseregister: resultchanged_when: "'Success' in result.stdout"notify:- restart_databasehandlers:- name: restart_databaseservice:name: mariadbstate: restarted[phoenix@controller ~ 19:59:49]$ ansible-playbook changewhen.yml PLAY [changed_when] **************************************************************************************TASK [Gathering Facts] ***********************************************************************************
ok: [node1]TASK [upgrade-database] **********************************************************************************
fatal: [node1]: FAILED! => {"changed": false, "cmd": "/usr/local/bin/upgrade-database", "delta": "0:00:00.002910", "end": "2025-08-14 20:00:04.136268", "msg": "non-zero return code", "rc": 127, "start": "2025-08-14 20:00:04.133358", "stderr": "/bin/sh: /usr/local/bin/upgrade-database: 没有那个文件或目录", "stderr_lines": ["/bin/sh: /usr/local/bin/upgrade-database: 没有那个文件或目录"], "stdout": "", "stdout_lines": []}PLAY RECAP ***********************************************************************************************
node1                      : ok=1    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0   

Ansible block

多个任务作为block子条目,block作为多个任务整体

示例
  • 在research卷组中创建逻辑卷:

    • 逻辑卷名称为data

    • 逻辑卷大小为4000MiB

    • 使用ext4文件系统格式化逻辑卷

    • 将逻辑卷挂载到/data目录

    • 如果无法创建请求的逻辑卷大小,应显示错误信息:Could not create logical volume of that size 并且应改为使用大小800MiB。

  • 如果卷组research不存在,应显示错误信息:Volume does not exist

[phoenix@controller ~ 19:48:39]$ cat createlv.yml 
---
- name: create and user lv hosts: alltasks:- block:- name: create a lv of 4000mlvol:vg: researchlv: datasize: 4000rescue:- debug:msg: Could not create logical volume of that size- name: Create a logical volume of 800mlvol:vg: researchlv: datasize: 800always:- name: Create a ext4filesystem:fstype: ext4dev: /dev/research/data- name: create directory /datafile:path: /datastate: directory- name: Mount /dev/research/datamount:path: /datasrc: /dev/research/datafstype: ext4state: mountedwhen: ansible_lvm.vgs.research is defined- name: Volume group does not existdebug:msg: Volume group does not existwhen: ansible_lvm.vgs.research is not defined

运行


[phoenix@controller ~ 16:02:34]$ ansible-playbook createlv.ymlPLAY [create and user lv] *********************************************************************************TASK [Gathering Facts] ************************************************************************************
ok: [node1]
ok: [node3]
ok: [node2]
ok: [node4]
ok: [controller]TASK [create a lv of 4000m] *******************************************************************************
skipping: [controller]
skipping: [node3]
skipping: [node4]
[WARNING]: The value 4000 (type int) in a string field was converted to u'4000' (type string). If this
does not look like what you expect, quote the entire value to ensure it does not change.
fatal: [node2]: FAILED! => {"changed": false, "err": "  Volume group \"research\" has insufficient free space (255 extents): 1000 required.\n", "msg": "Creating logical volume 'data' failed", "rc": 5}
changed: [node1]TASK [debug] **********************************************************************************************
ok: [node2] => {"msg": "Could not create logical volume of that size"
}TASK [Create a logical volume of 800m] ********************************************************************
[WARNING]: The value 800 (type int) in a string field was converted to u'800' (type string). If this does
not look like what you expect, quote the entire value to ensure it does not change.
changed: [node2]TASK [Create a ext4] **************************************************************************************
skipping: [controller]
skipping: [node4]
skipping: [node3]
changed: [node2]
changed: [node1]TASK [create directory /data] *****************************************************************************
skipping: [controller]
skipping: [node3]
skipping: [node4]
changed: [node1]
changed: [node2]TASK [Mount /dev/research/data] ***************************************************************************
skipping: [controller]
skipping: [node3]
skipping: [node4]
changed: [node1]
changed: [node2]TASK [Volume group does not exist] ************************************************************************
ok: [controller] => {"msg": "Volume group does not exist"
}
skipping: [node1]
skipping: [node2]
ok: [node3] => {"msg": "Volume group does not exist"
}
ok: [node4] => {"msg": "Volume group does not exist"
}PLAY RECAP ************************************************************************************************
controller                 : ok=2    changed=0    unreachable=0    failed=0    skipped=4    rescued=0    ignored=0   
node1                      : ok=5    changed=4    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
node2                      : ok=6    changed=4    unreachable=0    failed=0    skipped=1    rescued=1    ignored=0   
node3                      : ok=2    changed=0    unreachable=0    failed=0    skipped=4    rescued=0    ignored=0   
node4                      : ok=2    changed=0    unreachable=0    failed=0    skipped=4    rescued=0    ignored=0   
http://www.lryc.cn/news/621019.html

相关文章:

  • Python中的函数入门二
  • 小白做亚马逊广告,空烧成本不出单怎么办
  • 20道JavaScript进阶相关前端面试题及答案
  • DataHub IoT Gateway:工业现场设备与云端平台安全互联的高效解决方案
  • Git 中切换到指定 tag
  • 电子电路学习日记
  • 嵌入式Linux学习-编译内核源码
  • 17 ABP Framework 项目模板
  • 微信公众号推送文字消息与模板消息
  • ActionChains 鼠标操作笔记
  • 恐鬼症 单机+联机(Phasmophobia)免安装中文版
  • SQL181 第二快/慢用时之差大于试卷时长一半的试卷
  • 【昇腾】VirtualBox虚拟机下搭建Ubuntu 22.04环境给TF卡制卡报读写IO错误的问题处理_20250814
  • 自动化测试|持续集成Git使用详解
  • elasticsearch冷热数据读写分离!
  • 快速搭建python HTTP Server测试环境
  • gitlab的ci/cd变量如何批量添加
  • STL算法【常用的算数生成算法】
  • 分享10个ai生成ppt网站(附ai生成ppt入口)
  • 力扣top100(day03-02)--图论
  • 回流(Reflow)与重绘(Repaint):浏览器渲染性能优化核心
  • SpringMVC请求与响应
  • 【Linux】库制作与原理
  • PyTorch回忆(三)U-net
  • java 学习 贪心 + 若依 + 一些任务工作
  • FTP服务器搭建(Linux)
  • opencv:傅里叶变换有什么用?怎么写傅里叶变换?
  • 软件著作权产生与登记关键点
  • 从单机到分布式:用飞算JavaAI构建可扩展的TCP多人聊天系统
  • 算法基础 第3章 数据结构