目录

一、item---loop

1.给定数据如下: 使用loop来输出 My name is zhangsan/lisi My age is 18/20

2.给定数据Services,要求使用loop来重启服务:提示:将services定义为变量         可以使用lookup('dict', services)来进行转换或者使用{{ services | dict2items }}   services:        httpd:           name: httpd           state: restarted       firewalld:          name: firewalld         state: restarted

二、when条件任务语法

1.使用when,当条件成立时才执行任务:测试给定一个0/1,

2.给定一个未定义的变量,

3.给定一个变量当变量>10时才执行

4.使用and 和 or来连接两个条件: True and False , True or False

5.loop和when联合使用 1 中,当name == firewalld时不执行任务

三、notify和handler的使用

1.定义一个任务:使用shell模块执行 echo "123", 使用notify通知handler 任务 debug info

2.定义handler: 包含一个任务:debug info: 执行 输出: I handled the notify

3.tags使用:定义三个任务:分别打上标签:tag1, tag2, tag2

4.执行playbook, 且指定只执行tag2

四、处理任务失败

1.ignore_errors的使用: 定义任务使用command模块执行 test1111,

2.再定义一个任务:使用debug模块输出: This is test for ignore errors(确保这个任务可以正常执行)

3.failed_when: 定义一个任务: 使用shell模块执行echo 123, 将此任务设置为执行失败

4.changed_when: 定义一个任务: 使用shell模块执行echo 123 > /root/changed_test, 将此任务的changed状态改为0

5.block, rescue, always: 在block定义两个任务,在rescue中定义两个任务,在always中定义两个任务,让rescue中的任务可以执行

五、使用jinja2模板部署自定义文件

1. 构建一个jinja2模板:

要求:在模板中输出1-10, 打印主机的全限定名称, 输出默认的IP地址

如果权限定名称为node1.example.com 将其输出为: node1

六、并行处理forks seria

1.forks和serial的区别

七、playbook的文件导入

1.导入playbook和task  建立一个import_playbook.yaml 然后将其导入另一个playbook: main_playbook.yaml

建立一个import_task.yaml里面只写任务:将其导入main_task_playbook.yaml中


一、item---loop

1.给定数据如下: 使用loop来输出 My name is zhangsan/lisi My age is 18/20

users:
     - name: zhangsan
       age: 18
     - name: lisi
        age: 20

[root@good ~]# vim playbook2.yml ---
- name:hosts: rhcetasks:- name:shell: "{{ item }}"loop:- name: zhangsanage: 18- name: lisiage: 20
...
[root@good ~]# ansible-playbook playbook2.yml -CPLAY [rhce] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [rhce]TASK [shell] *******************************************************************
skipping: [rhce] => (item={'name': 'zhangsan', 'age': 18})
skipping: [rhce] => (item={'name': 'lisi', 'age': 20}) PLAY RECAP *********************************************************************
rhce                       : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0

2.给定数据Services,要求使用loop来重启服务:
提示:将services定义为变量
         可以使用lookup('dict', services)来进行转换或者使用{{ services | dict2items }}
   services: 
       httpd:
           name: httpd
           state: restarted
       firewalld: 
         name: firewalld
         state: restarted

# 编辑文件
[root@good ~]# vim playbook2.yml ---
- name:hosts: rhcetasks:- name:service:name: "{{ item.name }}"state: "{{ item.state }}"loop:- name: httpdstate: restarted- name: firewalldstate: restarted
...# 执行命令
[root@good ~]# ansible-playbook playbook2.yml -CPLAY [rhce] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [rhce]TASK [service] *****************************************************************
changed: [rhce] => (item={'name': 'httpd', 'state': 'restarted'})
changed: [rhce] => (item={'name': 'firewalld', 'state': 'restarted'})PLAY RECAP *********************************************************************
rhce                       : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

二、when条件任务语法

1.使用when,当条件成立时才执行任务:测试给定一个0/1,

#给1
- name: Simple Boolean task Demohosts: rhcevars:run_my_task: 1tasks:- name: httpd package is installedyum:name: httpdwhen: run_my_task
#给0
- name: Simple Boolean task Demohosts: rhcevars:run_my_task: 0tasks:- name: httpd package is installedyum:name: httpdwhen: run_my_task

2.给定一个未定义的变量,

- name: Simple Boolean task Demohosts: rhcetasks:- name: httpd package is installedyum:name: httpdwhen: run_my_task

3.给定一个变量当变量>10时才执行

- name: Simple Boolean task Demohosts: rhcevars:run_my_task: 11tasks:- name: httpd package is installedyum:name: httpdwhen: run_my_task > 10

4.使用and 和 or来连接两个条件: True and False , True or False

# and 运算必须两个都为真
---
- name:hosts: rhcevars:true: 0false: 1tasks:- name:yum:name: httpdwhen: true == 1 and false == 1
...
不执行# or 一个为真就可以---
- name:hosts: rhcevars:true: 0false: 1tasks:- name:yum:name: httpdwhen: true == 1 or false == 1
...
执行

5.loop和when联合使用 1 中,当name == firewalld时不执行任务

# 编写playbook
---
- name:hosts: rhcetasks:- name:service:name: "{{ item.name }}"state: startedloop:- name: firewalld- name: httpdwhen: item.name == "firewalld"
...# 执行playbook
[root@good ~]# ansible-playbook playbook4.yml -CPLAY [rhce] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [rhce]TASK [service] *****************************************************************
changed: [rhce] => (item={'name': 'firewalld'})
skipping: [rhce] => (item={'name': 'httpd'}) PLAY RECAP *********************************************************************
rhce                       : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

三、notify和handler的使用

1.定义一个任务:使用shell模块执行 echo "123", 使用notify通知handler 任务 debug info

# 编写playbook
---
- name:hosts: rhcetasks:- name:debug:msg: echo'123'notify:- debug infohandlers:- name: debug infoshell: echo'123'
...#执行
[root@good ~]# ansible-playbook playbook5.yml -CPLAY [rhce] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [rhce]TASK [debug] *******************************************************************
ok: [rhce] => {"msg": "echo'123'"
}PLAY RECAP *********************************************************************
rhce                       : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

2.定义handler: 包含一个任务:debug info: 执行 输出: I handled the notify

# 编写playbook
---
- name:hosts: rhcetasks:- name:debug:msg: I handled the notifynotify:- debug infohandlers:- name: debug infoshell: echo'123'
...#执行
[root@good ~]# ansible-playbook playbook5.yml -CPLAY [rhce] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [rhce]TASK [debug] *******************************************************************
ok: [rhce] => {"msg": "I handled the notify"
}PLAY RECAP *********************************************************************
rhce                       : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

3.tags使用:定义三个任务:分别打上标签:tag1, tag2, tag2

tags标签: 通过此标签来指定playbook文件执行哪条命令
- hosts: rhceremote_user: roottasks:- name: copycopy: content="apple" dest=/tmp/mama.txttags: copy1  # 标签名是copy1,在下面执行文件时会用到- name: copycopy: content="banana" dest=/tmp/mama.txttags: copy2  # 标签名是copy2,在下面执行文件时会用到- name: copycopy: content="egg" dest=/tmp/mama.txttags: copy3  # 标签名是copy3,在下面执行文件时会用到

4.执行playbook, 且指定只执行tag2

#ansible-playbook -t copy2 pbook.yml  #执行文件中第二条copy2命令

四、处理任务失败

1.ignore_errors的使用: 定义任务使用command模块执行 test1111,

默认情况下任务失败时play会终止。可以通过ingnore乎略失败,其他任务可以继续执行。
---
- name:hosts: rhcetasks:- name:command: ignore_errors: yes- name:service:name: httpdstate: started...
#执行跳过失败[root@good ~]# ansible-playbook playbook6.yml -CPLAY [rhce] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [rhce]TASK [command] *****************************************************************
fatal: [rhce]: FAILED! => {"changed": false, "cmd": null, "delta": null, "end": null, "msg": "no command given", "rc": 256, "start": null, "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
...ignoringTASK [service] *****************************************************************
changed: [rhce]PLAY RECAP *********************************************************************
rhce                       : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=1

2.再定义一个任务:使用debug模块输出: This is test for ignore errors(确保这个任务可以正常执行)

---
- name:hosts: rhcetasks:- name:debug:msg: This is test for ignore errorsignore_errors: yes- name:service:name: httpdstate: started...# 执行
[root@good ~]# ansible-playbook playbook6.yml -CPLAY [rhce] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [rhce]TASK [debug] *******************************************************************
ok: [rhce] => {"msg": "This is test for ignore errors"
}TASK [service] *****************************************************************
changed: [rhce]PLAY RECAP *********************************************************************
rhce                       : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

3.failed_when: 定义一个任务: 使用shell模块执行echo 123, 将此任务设置为执行失败

vim playbook.yml
---
- name:hosts: rhcetasks:- name:shell: echo '123' register: return_value #将echo的标准输出定义到return_value变量中failed_when: "'123' in return_value.stdout"  # 当'123' 在return_value中则执行失败...[root@good ~]# ansible-playbook playbook.yml PLAY [rhce] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [rhce]TASK [shell] *******************************************************************
fatal: [rhce]: FAILED! => {"changed": true, "cmd": "echo '123'", "delta": "0:00:00.003196", "end": "2022-08-08 22:13:54.989842", "failed_when_result": true, "msg": "", "rc": 0, "start": "2022-08-08 22:13:54.986646", "stderr": "", "stderr_lines": [], "stdout": "123", "stdout_lines": ["123"]}PLAY RECAP *********************************************************************
rhce                       : ok=1    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0 

4.changed_when: 定义一个任务: 使用shell模块执行echo 123 > /root/changed_test, 将此任务的changed状态改为0

---
- name:hosts: rhcetasks:- name:shell: echo '123' > /root/changed_testchanged_when: false...#当设置changed_when 为false,则该任务执行后永远不会返回changed状态,只返回ok或者failed。[root@good ~]# ansible-playbook playbook6.yml PLAY [rhce] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [rhce]TASK [shell] *******************************************************************
ok: [rhce]PLAY RECAP *********************************************************************
rhce                       : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

5.block, rescue, always: 在block定义两个任务,在rescue中定义两个任务,在always中定义两个任务,让rescue中的任务可以执行

  • block: 定义要运行的主要的任务。
  • rescue: 定义要在block子句中定义的任务失败时运行的任务。
  • always:定义始终都独立运行的任务,不论block和rescue子句中定义的任务是否成功还是失败。
# 编写playbook
---
- name:hosts: rhcetasks:- name:block:- name:yum:name: 123rescue:- name:service:name: httpdstate: startedalways:- name:service:name: firewalldstate: started...# 执行
[root@good ~]# ansible-playbook playbook6.yml -CPLAY [rhce] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [rhce]TASK [yum] *********************************************************************
fatal: [rhce]: FAILED! => {"changed": false, "failures": ["123 没有能够与之匹配的软件包: 123"], "msg": "Failed to install some of the specified packages", "rc": 1, "results": []}TASK [service] *****************************************************************
changed: [rhce]TASK [service] *****************************************************************
changed: [rhce]PLAY RECAP *********************************************************************
rhce                       : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=1    ignored=0

五、使用jinja2模板部署自定义文件

1. 构建一个jinja2模板:
          要求:在模板中输出1-10, 打印主机的全限定名称, 输出默认的IP地址
                    如果权限定名称为node1.example.com 将其输出为: node1

在受控主机中会按照jinja2动态模板文件,生成相对应的主机信息。[student@workstation ~]$ cat playbook.yml
---
- name: 1hosts: allremote_user: roottasks:- name: deplay /etc/hoststemplate:src: templates/hosts.j2dest: /etc/myhosts[student@workstation ~]$ cat templates/hosts.j2
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
{% for host in groups['all'] %}
{{ hostvars[host]['ansible_facts']['default_ipv4']['address'] }} {{ hostvars[host]['ansible_facts']['fqdn'] }} {{ hostvars[host]['ansible_facts']['hostname'] }}
{% endfor %}
{#hostvars[host]不能加引号host是命令Hostvars[cmd]['变量名'] #}
[student@workstation ~]$ ssh servera
Activate the web console with: systemctl enable --now cockpit.socketLast login: Wed Dec 29 20:07:19 2021 from 172.25.250.9
[student@servera ~]$ cat /etc/myhosts 127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.250.10 servera.lab.example.com servera
172.25.250.11 serverb.lab.example.com serverb
172.25.250.12 serverc.lab.example.com serverc
172.25.250.13 serverd.lab.example.com serverd

六、并行处理forks seria

1.forks和serial的区别

forks(广度优先)
        依据 forks 参数,决定一次在多少个服务器上并行执行相应的 task,对于包含多个 task 的场景,这种方式会先将 1 个 task 在指定的所有服务器上都执行完成之后,才会执行后续的 task。所以对于一个包含多个 task 的 playbook 来说,此时所有服务器的状态都是不完整的,都是处于中间状态的。但是当这个包含多个 task 的 playbook 执行完成之后,所有执行成功的服务器的状态都是被更新完成的。这种方式适合对服务器的中间状态不敏感的场景,其优点是可以对指定的所有主机执行同步的配置操作;缺点是更新过程中所有服务器都是未完成配置的中间状态。比如下面的场景,有 4 台服务器需要配置(nodeA, nodeB, nodeC, nodeD),playbook 中定义了 2 个 task,forks 指定的参数是 5,而每个 task 执行的耗时为 5 秒。

serial(深度优先)
        而对于深度优先的执行方式,则是在指定数目的服务器上执行完 playbook 的所有 task 之后,才会继续在剩余的其他主机上执行这个 playbook 中定义的 task。这是通过在 playbook 中指定 serial 关键字实现的,所以其是在 forks 参数的基础上,进一步进行约定,从而实现指定数目的服务器执行完成 playbook 之后,才会在其他服务器上执行的操作。这种方式类似于滚动更新。比如,此时仍然为 4 台服务器,forks 仍然设置为 5,然后在 playbook 中增加 serial 关键字,并将其值设置为 2,playbook 中仍然有 2 个 task,且每个 task 执行耗费时间为5秒。

七、playbook的文件导入

1.导入playbook和task
  建立一个import_playbook.yaml 然后将其导入另一个playbook: main_playbook.yaml

# main_playbook.yaml
---
- name:import_playbook: import_playbook.yml
- name: main playhosts: rhcetasks:- name: main taskdebug:msg: "this is my main playbook"
...# import_playbook.yaml---
- name:hosts: rhcetasks:- name: import play bookdebug:msg: "this is to import playbook"
...

建立一个import_task.yaml里面只写任务:将其导入main_task_playbook.yaml中

# import_task.yaml
---
- name: import_tasksdebug:msg: "this is to import tasks"
...# main_task_playbook.yaml
---
- name:hosts: rhcetasks:- name:import_tasks: import_tasks.yml- name:debug:msg: "this is main tasks"
...

ansible之when条件语法、处理任务失败、jinja2模板和项目管理相关推荐

  1. Ansible中的条件判断、handlers

    1.有条件地运行任务 Ansible可使用conditionals在符合特定条件时执行任务或play. 所以我们可以利用条件来区分不同的受管主机,并根据它们所符合的条件来分配功能角色.Playbook ...

  2. Ansible Jinja2 模板

    1.jinja2渲染NginxProxy配置文件 jinja2 房屋建筑设计固定的? jinja2模板与Ansible关系 Ansible如何使用jinja2模板 template模块 拷贝文件? t ...

  3. flask基础之jinja2模板-语法定义

    懂得MVC的人都知道,模型.视图.控制,下面要要介绍的jinja就是视图层的一个渲染模板,类似于jsp,下面来学习 一.jinja2基本语法 jinja2模板可以保存在任何基于文本的文件中,比如XML ...

  4. ifeq makefile 或语句_makefile中的“ifeq”条件语法

    由于条件指令ifeq经常用于比较从变量(通常包含空格)扩展的单词,我们可能希望并且实际上需要Make来去除任何前导或尾随空格. 事实上,你可能有一个相反的观点,即Make应该逐字记录ifeq条件的所有 ...

  5. (二)nodejs循序渐进-nodejs基本类型和循环条件语法篇(基础篇)

    目录 入门之helloworld 进阶之helloworld  http服务器 步骤一.引入 required 模块 步骤二.创建服务器

  6. Jinja2模板基本语法

    当下学Jinja2的语法只是为了能展示网页,所以这里只介绍其基本语法.后续若有更高需求,会持续补充   Jinja2是基于python的模板引擎,是Flask作者开发的一个模板系统.起初是仿djang ...

  7. Jinja2模板引擎语法

    模板案例 eg: <!doctype html> <title>Hello template</title> {% if name %}<h1>Hell ...

  8. laytpl语法_浅谈laytpl 模板空值显示null的解决方法及简单的js表达式

    浅谈laytpl 模板空值显示null的解决方法及简单的js表达式 laytpl 模板语法 {{ d.field }} 输出一个普通字段,不转义html 官方的说明 但d.field 为空时会显示nu ...

  9. phpcms模板解析php标签失败,phpcms模板解析嵌套标签解析失败

    PHPCMS的模板解析函数是/phpcms/libs/classes/template_cache.class.php这个类中的template_parse函数. 我把这个文件拿出来,然后在下面直接写 ...

最新文章

  1. 尾递归调用 高阶函数 map filter reduce
  2. slimftp超小型的FTP服务器
  3. 实战SSM_O2O商铺_41【前端展示】店铺列表页面Dao+Service+Controller层的实现
  4. activity启动流程与任务执行
  5. MFC为窗口创建线程,以及线程与窗口间的通信
  6. BodyFusion: Real-time Capture of Human Motion and Surface Geometry Using a Single Depth Camera
  7. bzoj 1002: [FJOI2007]轮状病毒
  8. proteus微型计算机梯形波,接口芯片dac0832的应用 三角波、梯形波两种波形.doc
  9. [数据结构] 树链剖分
  10. 【CS224n】(lecture1)课程介绍和word2vec
  11. numpy缩放图片/调整图片大小
  12. 观李永乐老师讲音律有感——《管子·地员》之“三分损益法”的探究
  13. 苹果钱包(AppleWallet)接入操作手册,超详细
  14. Docker 学习前置,网络IP地址以及交互
  15. 咸鱼ZTMS实例—心率检测
  16. 摄像头8mm可以看多远_家用监控摄像头镜头焦距该如何选择_弱电工程
  17. 段错误(SIGSEGV)与总线错误(SIGBUS)
  18. 实训(学生管理系统)
  19. 移动考勤满足企业实时管理
  20. 2021年低压电工模拟考试题库及低压电工考试试题

热门文章

  1. python中patch的使用
  2. python产品质量分析报告范文_Python Jinja2 徒手生成数据分析报告
  3. 系统初始化配置资源失败教程
  4. JMeter 远程启动报错:java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is:
  5. 尘福通:智慧城市建设、运营、演进路径思考
  6. utc时间戳java_java利用时间戳来获取UTC时间
  7. 基于数字电路典型分频电路设计
  8. 从零开始学python项目_从零开始学Python程序设计
  9. svn 分支 合并
  10. 关于人工智能的一些思考