Ansible 项目管理核心要点总结

Ansible 项目管理核心要点总结

一、引用主机清单

在playbook中引用hosts时,如果对应的主机清单中没有配置该主机,是无法执行的

如果主机清单中配置的是主机名称,那么在playbook中hosts字段后写的是ip或者主机名,那么也是无法执行的,示例如下:

复制代码
[student@master ansible]$ vim a.yml 
---     
- name: test
  hosts: 192.168.122.10
  tasks:
    - name: test1
      debug:
        msg: 123
~  
//跳过该任务,无法执行
[student@master ansible]$ ansible-playbook a.yml 
[WARNING]: Could not match supplied host pattern, ignoring: 192.168.122.10

PLAY [test] ********************************************************************
skipping: no hosts matched

PLAY RECAP *********************************************************************

在引用主机清单时,一定要注意playbook里面hosts字段后写的内容一定只能时主机清单里面编辑的内容

使用playbook引用主机清单的方式有很多种,如下

Hosts: node1

Hosts: node1.example.com

Hosts: 172.16.30.10

Hosts: all ----所有的受控主机

Hosts: net ----主机组net

Hosts: '*' ----所有的主机

Hosts: '*.example.com'

Hosts: '172.16.30.*'

Hosts: 'web*' ---通过匹配符*来匹配

Hosts: net:webserver ----取net组和webserver组的并集

Hosts: net:&webserver ---取交集

Hosts: net:!node1 ---net组所有的主机,但是除了node1

Hosts: node[1-5]

Hosts: node[a-d]

二、配置并行

当ansible处理playbook时,会按顺序运行每个play。确定play的主机列表后,ansible将按顺序运行每个任务。通常,所有主机必须在任何主机在play中启动下一个任务之前完成任务

理论上,ansible可以连接到play中的所有主机以执行每项任务。这非常适用于小型主机列表。但如果该play以数百台主机为目标,则可能会给控制节点带来沉重的负担

Ansible所进行的最大同时连接数由ansible配置文件的forks参数控制。默认值为5.

比如一个play具有10台受控主机,我们forks的值为5,那么,首先前5台主机,同时运行第一个play,当这5台主机运行完成第一个play后,后5台主机同时运行第一个play,等到10台主机运行完成第一个play时,才开始运行第二个play,以此类推

当受控主机是linux主机时,我们执行play的时候,大多数的任务是在受控主机上运行的,ansible控制节点得负载就少了,这种情况下呢,我们可以把forks的值设置得更高一些

当受控主机是网络设备时,比如路由器交换机时,大多数得模块是在控制节点中运行的,这时控制节点的负载就会很高,这个时候我们就不能去提高forks的值了

通常情况下,ansible运行play时,它会确保所有的受控主机在启动任何进行下一项任务之前已完成了每个任务。在所有受控主机完成所有任务后,将运行任何通知的处理器

比如说,给所有webserver主机组安装httpd软件包时,安装成功后会重启服务,那么我们使用触发器进行配置

复制代码
---     
- name: web station
  hosts: webserver
  tasks:
    - name: install httpd
      yum:
        name: httpd
        state: latest
      notify:           //触发器
        - restart httpd

  handlers:             //处理器
    - name: restart httpd
      service:
        name: httpd
        state: restarted
~  

那么加入webserver此时有非常非常多的主机,当我们中间某个更新httpd失败时,那么handlers还会执行吗?我们都知道,handlers它是在我们执行完所有的play之后,才会去执行的,但是node1、node2都更新成功了,node3这里失败了,那么整个play就直接中断了,不会去执行handlers了。那么就有问题了,那我们如何来解决这个问题呢?

就可以用到serial参数,加入给该参数设置为2,那么意思就是先从webserver中选择2台主机进行运行play,当我这两台主机全部运行play完成后,再从webserver中未执行play的主机中选择2台进行执行play,以此类推。设置如下:

示例:

复制代码
[student@master ansible]$ vim a.yml 
---
- name: test
  hosts: node1,node2,node3
  tasks:
    - name: test1
      debug:
        msg: 123
          
    - name: test2
      debug:
        msg: 456
~  
[student@master ansible]$ ansible-playbook a.yml 

PLAY [test] ********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [node1]
ok: [node2]
ok: [node3]

TASK [test1] *******************************************************************
ok: [node1] => {
    "msg": 123
}
ok: [node2] => {
    "msg": 123
}
ok: [node3] => {
    "msg": 123
}

TASK [test2] *******************************************************************
ok: [node1] => {
    "msg": 456
}
ok: [node2] => {
    "msg": 456
}
ok: [node3] => {
    "msg": 456
}

PLAY RECAP *********************************************************************
node1                      : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node2                      : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node3                      : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[student@master ansible]$ vim a.yml 
---
- name: test
  hosts: node1,node2,node3
  serial: 2
  tasks:
    - name: test1
      debug:
        msg: 123

    - name: test2
      debug:
        msg: 456
~  
[student@master ansible]$ ansible-playbook a.yml 

PLAY [test] ********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [node1]
ok: [node2]

TASK [test1] *******************************************************************
ok: [node1] => {
    "msg": 123
}
ok: [node2] => {
    "msg": 123
}

TASK [test2] *******************************************************************
ok: [node1] => {
    "msg": 456
}
ok: [node2] => {
    "msg": 456
}

PLAY [test] ********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [node3]

TASK [test1] *******************************************************************
ok: [node3] => {
    "msg": 123
}

TASK [test2] *******************************************************************
ok: [node3] => {
    "msg": 456
}

PLAY RECAP *********************************************************************
node1                      : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node2                      : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node3                      : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

包含和导入:导入 playbook,部署httpd站点

示例:

复制代码
[student@master ansible]$ cat repo.yml 
---
- name: repo
  hosts: all
  tasks:
    - name: repo1
      yum_repository:
        name: baseos
        description: aa1
        baseurl: http://ansible.example.com/rhel9/BaseOS
        enabled: yes
        gpgcheck: no

    - name: repo2
      yum_repository:
        name: appstream
        description: ee1
        baseurl: http://ansible.example.com/rhel9/AppStream
        enabled: yes
        gpgcheck: no

    - name: install lvm2
      yum:
        name: lvm2
        state: present
[student@master ansible]$ vim httpd.yml
---
- name: import repo
  import_playbook: repo.yml
- name: install httpd
  hosts: node1
  tasks:
    - name: install httpd1
      yum:
        name: httpd
        state: present
~ 
[student@master ansible]$ ansible-playbook httpd.yml 

PLAY [repo] ********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [node3]
ok: [node1]
ok: [node2]
ok: [node5]
ok: [node4]

TASK [repo1] *******************************************************************
ok: [node4]
ok: [node3]
ok: [node5]
ok: [node1]
ok: [node2]

TASK [repo2] *******************************************************************
ok: [node2]
ok: [node1]
ok: [node3]
ok: [node5]
ok: [node4]

TASK [install lvm2] ************************************************************
ok: [node3]
ok: [node1]
ok: [node2]
ok: [node5]
ok: [node4]

PLAY [install httpd] ***********************************************************

TASK [Gathering Facts] *********************************************************
ok: [node1]

TASK [install httpd1] **********************************************************
ok: [node1]

PLAY RECAP *********************************************************************
node1                      : ok=6    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node2                      : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node3                      : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node4                      : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node5                      : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[student@master ansible]$ vim vsftpd.yml
--- 
- name: install vsftpd
  yum:
    name: vsftpd
    state: present
~  
[student@master ansible]$ vim httpd.yml 
---
- name: import repo
  import_playbook: repo.yml
- name: install httpd
  hosts: node1
  tasks:
    - name: install httpd1
      yum:
        name: httpd
        state: present
    - import_tasks: vsftpd.yml
~  
[student@master ansible]$ ansible-playbook httpd.yml 

PLAY [repo] ********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [node4]
ok: [node3]
ok: [node1]
ok: [node5]
ok: [node2]

TASK [repo1] *******************************************************************
ok: [node1]
ok: [node5]
ok: [node2]
ok: [node3]
ok: [node4]

TASK [repo2] *******************************************************************
ok: [node1]
ok: [node3]
ok: [node2]
ok: [node5]
ok: [node4]

TASK [install lvm2] ************************************************************
ok: [node3]
ok: [node2]
ok: [node4]
ok: [node1]
ok: [node5]

PLAY [install httpd] ***********************************************************

TASK [Gathering Facts] *********************************************************
ok: [node1]

TASK [install httpd1] **********************************************************
ok: [node1]

TASK [install vsftpd] **********************************************************
changed: [node1]

PLAY RECAP *********************************************************************
node1                      : ok=7    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node2                      : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node3                      : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node4                      : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node5                      : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

包含:在tasks中包含任务,安装vsftpd软件包,并启动vsftpd服务

复制代码
[student@master ansible]$ vim httpd.yml 
---
- name: import repo
  import_playbook: repo.yml
- name: install httpd
  hosts: node1
  tasks:
    - name: install httpd1
      yum:
        name: httpd
        state: present
    - include_tasks: vsftpd.yml
~  
[student@master ansible]$ ansible-playbook httpd.yml 

PLAY [repo] ********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [node5]
ok: [node1]
ok: [node4]
ok: [node3]
ok: [node2]

TASK [repo1] *******************************************************************
ok: [node2]
ok: [node1]
ok: [node3]
ok: [node5]
ok: [node4]

TASK [repo2] *******************************************************************
ok: [node3]
ok: [node4]
ok: [node1]
ok: [node5]
ok: [node2]

TASK [install lvm2] ************************************************************
ok: [node5]
ok: [node1]
ok: [node3]
ok: [node2]
ok: [node4]

PLAY [install httpd] ***********************************************************

TASK [Gathering Facts] *********************************************************
ok: [node1]

TASK [install httpd1] **********************************************************
ok: [node1]

TASK [include_tasks] ***********************************************************
included: /home/student/ansible/vsftpd.yml for node1

TASK [install vsftpd] **********************************************************
ok: [node1]

PLAY RECAP *********************************************************************
node1                      : ok=8    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node2                      : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node3                      : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node4                      : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node5                      : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[student@master ansible]$ vim vsftpd.yml 
---
- name: install vsftpd
  yum:
    name: mariadb-server
    state: present
~  
[student@master ansible]$ ansible-playbook httpd.yml 

PLAY [repo] ********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [node4]
ok: [node2]
ok: [node1]
ok: [node5]
ok: [node3]

TASK [repo1] *******************************************************************
ok: [node2]
ok: [node1]
ok: [node5]
ok: [node4]
ok: [node3]

TASK [repo2] *******************************************************************
ok: [node1]
ok: [node2]
ok: [node4]
ok: [node3]
ok: [node5]

TASK [install lvm2] ************************************************************
ok: [node2]
ok: [node4]
ok: [node1]
ok: [node5]
ok: [node3]

PLAY [install httpd] ***********************************************************

TASK [Gathering Facts] *********************************************************
ok: [node1]

TASK [install httpd1] **********************************************************
ok: [node1]

TASK [include_tasks] ***********************************************************
included: /home/student/ansible/vsftpd.yml for node1

TASK [install vsftpd] **********************************************************
changed: [node1]

PLAY RECAP *********************************************************************
node1                      : ok=8    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node2                      : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node3                      : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node4                      : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node5                      : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
相关推荐
@Ryan Ding6 小时前
Jenkins调用Ansible构建LNMP平台
linux·数据库·ansible·jenkins
半梦半醒*6 小时前
ansible中的角色(roles)
linux·运维·自动化·ssh·ansible·负载均衡
Insist7536 小时前
jenkins调用ansible部署lnmp平台-Discuz论坛
运维·服务器
误入运维泥潭6 小时前
Ansible Playbook自动化运维全攻略
ansible·yaml·playbook·facts
KellenKellenHao6 小时前
Jenkins调用ansible部署lnmp
servlet·ansible·jenkins
布列瑟农的星空6 小时前
html中获取容器部署的环境变量
运维·前端·后端
一匹电信狗6 小时前
【Linux我做主】细说进程等待
linux·运维·服务器·c++·ubuntu·小程序·开源
THMAIL7 小时前
机器学习从入门到精通 - 卷积神经网络(CNN)实战:图像识别模型搭建指南
linux·人工智能·python·算法·机器学习·cnn·逻辑回归
无法无天霸王龙7 小时前
云计算培训为什么这么贵?
linux·运维·学习·云计算