• Ansible中的任务执行控制


    目录

    循环

    简单循环

    循环散列或字典列表

    条件

    触发器

    处理失败任务

    ignore_errors

    force_handlers

     changed_when

    failed_when

    block


    循环

    简单循环

    1. {{item}} 迭代变量名称
    2. loop:
    3. - value1
    4. - value2
    5. - ... //赋值列表
    6. {{item}} //迭代变量名称

    循环散列或字典列表

    1. - name: create file
    2. hosts: host1
    3. tasks:
    4. - name: file moudle
    5. service:
    6. name: "{{ item.name }}"
    7. state: "{{ item.state }}"
    8. loop:
    9. - name: httpd
    10. state: started
    11. - name: vsftpd
    12. state: stopped
    13. ~

    条件

    1. when:
    2. - 条件1
    3. - 条件2

     条件判断

    1. = //value == “字符串”,value == 数字 解释
    2. < //value < 数字
    3. > //value > 数字
    4. <= //value <= 数字
    5. >= //value >= 数字
    6. != //value != 数字
    7. is defined value //value is defined 变量存在
    8. is not defined //value is not defined 变量不存在
    9. in //value is in value 变量为
    10. not in //value is not in value 变量不为
    11. bool变量 为true value //value的值为true
    12. bool变量 false not value //value的值为false

     多条条件组合

    1. when
    2. 条件1 and 条件2
    3. - 条件1
    4. - 条件2 //当条件1和条件2都为真
    5. when:
    6. 条件1 or 条件2 //满足其中一个
    7. when: >
    8. 条件1
    9. or
    10. 条件2 //满足其中一个

     创建两个用户 user1 和 user2, user1 的 UID 是 6666,注释是 user1 commentuser2 的 UID 是 7777,没有注释。

    1. vim userlist.yml
    2. userlist:
    3. - name: user1
    4. id: 6666
    5. comment: user1 comment
    6. - name: user2
    7. id: 7777
    8. vim usercreate.yml
    9. - name: create user
    10. hosts: all
    11. vars_files: ./userlist.yml
    12. tasks:
    13. - name: create user with comment
    14. user:
    15. name: "{{item.name}}"
    16. uid: "{{item.id}}"
    17. comment: "{{item.comment}}"
    18. state: present
    19. when: item.comment is defined
    20. loop:
    21. "{{userlist}}"
    22. - name: create user without comment
    23. user:
    24. name: "{{item.name}}"
    25. uid: "{{item.id}}"
    26. state: present
    27. when: item.comment is not defined
    28. loop:
    29. "{{userlist}}"

    触发器

    1. notify: //触发器当遇到更改是触发handlers
    2. handlers: //触发器触发后执行的动作

     在指定的服务器上部署网站,并创建一个简单的主页

    1. vim webs.yml
    2. webs:
    3. - name: bbs.westos.org
    4. doc: /var/www/virtual/westos.org/bbs/html
    5. index: "bbs.westos.org's page"
    6. - name: login.westos.org
    7. doc: /var/www/virtual/westos.org/login/html
    8. index: "login.westos.org's page"
    9. - name: www.westos.org
    10. doc: /var/www/html
    11. index: "www.westos.org's page"

    1. vim html.j2
    2. {% for web in webs %}
    3. {% if web.name is not defined %}
    4. <VirtualHost _default_:80>
    5. {% elif web.name is defined %}
    6. <VirtualHost *:80>
    7. ServerName {{web.name}}
    8. {% endif %}
    9. DocumentRoot {{web.doc}}
    10. </VirtualHost>
    11. {% endfor %}

    1. vim web.yml
    2. - name: Create website index page
    3. hosts: all
    4. vars_files: ./webs.yml
    5. tasks:
    6. - name: install httpd
    7. yum:
    8. name: httpd
    9. state: present
    10. - name: service
    11. service:
    12. name: httpd
    13. state: started
    14. enabled: no
    15. - name: Create index.html for each website
    16. template:
    17. src: ./html.j2
    18. dest: "/etc/httpd/conf.d/vhost.conf"
    19. notify: restart httpd
    20. - name: create directory
    21. lineinfile:
    22. path: "{{item.doc}}/index.html"
    23. line: "{{ item.index }}"
    24. create: yes
    25. loop: "{{webs}}"
    26. handlers:
    27. - name: restarted httpd
    28. service:
    29. name: httpd
    30. state: restarted

    处理失败任务

    ignore_errors

    作用:当play遇到任务失败时会终止

    ignore_errors:yes        //将会忽略任务失败使下面的任务运行
    1. - name: ignore
    2. hosts: all
    3. tasks:
    4. - name: test file
    5. shell: test -e /mnt/test
    6. ignore_errors: no/yes
    7. - debug:
    8. msg: hello

    force_handlers

    作用: 当任务失败后play被终止也会调用触发器进程

    1. - name: ignore
    2. hosts: all
    3. force_handlers: yes
    4. tasks:
    5. - name: test file
    6. shell: test -e /mnt/test
    7. notify: DEBUG
    8. - name: error
    9. yum:
    10. name: haha
    11. handlers:
    12. - name: DEBUG
    13. debug:
    14. msg: hello

     changed_when

    作用:控制任务在何时报告它已进行更改,用于指定一个条件,当这个条件成立时,任务将被标记为已更改。

    1. - name: ignore
    2. hosts: all
    3. force_handlers: yes
    4. tasks:
    5. - name: test file
    6. lineinfile:
    7. path: /mnt/test
    8. line: "hello world"
    9. notify: DEBUG
    10. changed_when: false
    11. handlers:
    12. - name: DEBUG
    13. debug:
    14. msg: hello

    failed_when

    作用:当符合条件时会强制任务失败

    1. - name: ignore
    2. hosts: all
    3. force_handlers: yes
    4. tasks:
    5. - name: test file
    6. shell: echo hello
    7. register: HA
    8. failed_when: "'hello' in HA.stdout"

    block

    1. block: //定义要运行的任务
    2. rescue: //定义当block句子中出现失败任务后运行的任务
    3. always: //定义最终独立运行的任务

    给/dev/sdb分区,如果/dev/sdb不存在请输入:/dev/sdb is not exist ,如果/dev/sdb不足1.5G请输出/dev/sdb is less than 1.5G

    并建立800M大小的/dev/sdb1,挂载到/westos上

    1. - name: fdisk
    2. hosts: all
    3. vars:
    4. mount_point: /westos
    5. device: /dev/sdb
    6. tasks:
    7. - name: Check if device exists
    8. stat:
    9. path: "{{ device }}"
    10. register: device_stat
    11. ignore_errors: yes
    12. - name: Fail if device does not exist
    13. debug:
    14. msg: "/dev/sdb is not exist"
    15. when: not device_stat.stat.exists
    16. - name: create /dev/sdb1
    17. block:
    18. - name: create 1500M
    19. parted:
    20. device: "{{device}}"
    21. number: 1
    22. state: present
    23. part_end: 1500GiB
    24. when: device_stat.stat.exists
    25. - debug:
    26. msg: /dev/sdb is lee than 1.5G
    27. rescue:
    28. - name: create 800M
    29. parted:
    30. device: "{{device}}"
    31. number: 1
    32. state: present
    33. part_end: 800MiB
    34. when: device_stat.stat.exists
    35. notify:
    36. - Format partition
    37. - Mount partition
    38. handlers:
    39. - name: Format partition
    40. filesystem:
    41. fstype: ext4
    42. dev: "{{device}}1"
    43. - name: Mount partition
    44. mount:
    45. path: "{{ mount_point }}"
    46. src: "{{ device}}1"
    47. fstype: ext4
    48. state: mounted

  • 相关阅读:
    【问题处理】WPS提示不能启动此对象的源应用程序如何处理?
    记一次密码重置到后台GetShell
    Windows 10系统下载----生成iso镜像文件
    RabbitMQ消息队列
    e签宝,再「进化」
    QT+OSG/osgEarth编译之四十三:osgGA+Qt编译(一套代码、一套框架,跨平台编译,版本:OSG-3.6.5核心库osgGA)
    Kafka消费异常报Failing OffsetCommit request since the consumer
    Maven
    ElasticSearch是什么?有哪些应用?有哪些优缺点?
    LeetCode530.二叉搜索树的最小绝对差 501二叉搜索树中的众数 236二叉树的最近公共祖先
  • 原文地址:https://blog.csdn.net/m0_64028800/article/details/134191126