ansible中配置并行以及包含和导入

ansible中配置并行以及包含和导入

一、引用主机清单

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

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

示例如下:
powershell 复制代码
[student@master ansible]$ vim inventory 
[student@master ansible]$ vim a.yml
[student@master ansible]$ ansible-playbook a.yml
[WARNING]: Could not match supplied host pattern, ignoring: 192.168.122.10
[WARNING]: Could not match supplied host pattern, ignoring: node2.example.com

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

PLAY RECAP *****************************************************************************
主机清单:
powershell 复制代码
[student@master ansible]$ cat inventory 
node1
node2
node3
node4
node5

[test01]
node1

[test02]
node2

[web]
node3
node4

[test05]
node5

[webtest:children]
web
a.yml:
powershell 复制代码
---
- name: test
  hosts: 192.168.122.10,node2.example.com
  tasks:
    - name: debug1
      debug:
        msg: 123
执行a.yml这个playbook的时候,就会发现有问题了,直接跳过该任务,无法执行
所以在引用主机清单时,一定要注意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* ' ---通过匹配符*来匹配(所有以web开头的组里面的主机)

Hosts: net:webserver ----取net组和webserver组的并集
Hosts: net:&webserver ---取交集
Hosts: net:!node1 ---net组所有的主机,但是除了node1

Hosts: node[ 1-5 ] (受控主机node1node5)

Hosts: node[ a-d ]

Hosts:node[ 1:5 ] (受控主机node1node5)

三、配置并行(forks)

当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,以此类推

以三台主机和两个任务为例:
先主机node1、node2、node3先完成任务debug1,再主机node1、node2、node3完成任务debug2
powershell 复制代码
[student@master ansible]$ vim a.yml
[student@master ansible]$ ansible-playbook a.yml

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

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

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

TASK [debug2] **************************************************************************
ok: [node1] => {
    "msg": 234
}
ok: [node2] => {
    "msg": 234
}
ok: [node3] => {
    "msg": 234
}

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   
powershell 复制代码
---
- name: test
  hosts: node1,node2,node3
  tasks:
    - name: debug1
      debug:
        msg: 123

    - name: debug2
      debug:
        msg: 234

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

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

四、notify handlers用法(当完成....任务时,则进行....任务)

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

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

注:已经配置了yum仓库
powershell 复制代码
[student@master ansible]$ vim httpd.yml
[student@master ansible]$ ansible-playbook httpd.yml 

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

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

TASK [install httpd1] ******************************************************************
changed: [node1]
changed: [node3]
changed: [node2]

RUNNING HANDLER [restart httpd] ********************************************************
changed: [node3]
changed: [node2]
changed: [node1]

PLAY RECAP *****************************************************************************
node1                      : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node2                      : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node3                      : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  
powershell 复制代码
---
- name: install httpd
  hosts: node1,node2,node3
  tasks:
    - name: install httpd1
      yum:
        name: httpd
        state: present
      notify:
        - restart httpd

  handlers:
    - name: restart httpd
      service:
        name: httpd
        state: restarted

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

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

五、serial参数

例1:
powershell 复制代码
[student@master ansible]$ vim httpd.yml
[student@master ansible]$ ansible-playbook httpd.yml 

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

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

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

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

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

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

PLAY RECAP *****************************************************************************
node1                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node2                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node3                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
powershell 复制代码
---
- name: install httpd
  hosts: node1,node2,node3
  serial: 2
  tasks:
    - name: install httpd1
      yum:
        name: httpd
        state: present
      notify:
        - restart httpd

  handlers:
    - name: restart httpd
      service:
        name: httpd
        state: restarted
例2:
powershell 复制代码
[student@master ansible]$ vim a.yml 
[student@master ansible]$ ansible-playbook a.yml 

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

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

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

TASK [debug2] **************************************************************************
ok: [node1] => {
    "msg": 234
}
ok: [node2] => {
    "msg": 234
}

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

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

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

TASK [debug2] **************************************************************************
ok: [node3] => {
    "msg": 234
}

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   
powershell 复制代码
---
- name: test
  hosts: node1,node2,node3
  serial: 2
  tasks:
    - name: debug1
      debug:
        msg: 123

    - name: debug2
      debug:
        msg: 234

六、包含与导入

导入:1、导入任务 2、导入playbook
包含:只包含任务
1、导入playbook:(repo.yml导入到httpd.yml中)
repo.yml:
powershell 复制代码
---
- name: repo
  hosts: all
  tasks:
    - name: repo1
      yum_repository:
        name: aa
        description: aa1
        baseurl: http://ansible.example.com/rhel9/BaseOS
        enabled: yes
        gpgcheck: no

    - name: repo2
      yum_repository:
        name: bb
        description: aa2
        baseurl: http://ansible.example.com/rhel9/AppStream
        enabled: yes
        gpgcheck: no
httpd.yml:
powershell 复制代码
---
- name: import repo
  import_playbook: repo.yml
- name: install httpd
  hosts: node4
  tasks:
    - name: install httpd1
      yum:
        name: httpd
        state: present

    - name: restart httpd
      service:
        name: httpd
        state: restarted
运行httpd.yml剧本
powershell 复制代码
[student@master ansible]$ ansible-playbook httpd.yml 

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

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

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

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

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

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

TASK [install httpd1] ******************************************************************
changed: [node4]

TASK [restart httpd] *******************************************************************
changed: [node4]

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   
node4                      : ok=6    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node5                      : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
2、导入任务(将vsftpd.yml导入到httpd.yml中)
vsftpd.yml:
powershell 复制代码
---
- name: install vsftpd
  yum:
    name: vsftpd
    state: present

- name: restarted vsftpd
  service:
    name: vsftpd
    state: restarted
httpd.yml:
powershell 复制代码
---
- name: import repo
  import_playbook: repo.yml
- name: install httpd
  hosts: node4
  tasks:
    - name: install httpd1
      yum:
        name: httpd
        state: present

    - name: restart httpd
      service:
        name: httpd
        state: restarted
    - import_tasks: vsftpd.yml
运行httpd.yml剧本
powershell 复制代码
[student@master ansible]$ ansible-playbook httpd.yml 

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

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

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

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

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

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

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

TASK [restart httpd] *******************************************************************
changed: [node4]

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

TASK [restarted vsftpd] ****************************************************************
changed: [node4]

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   
node4                      : ok=8    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node5                      : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  
3、包含任务
powershell 复制代码
[student@master ansible]$ ansible-playbook httpd.yml 

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

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

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

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

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

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

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

TASK [restart httpd] *******************************************************************
changed: [node4]

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

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

TASK [restarted vsftpd] ****************************************************************
changed: [node4]

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   
node4                      : ok=9    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node5                      : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 
powershell 复制代码
---
- name: import repo
  import_playbook: repo.yml
- name: install httpd
  hosts: node4
  tasks:
    - name: install httpd1
      yum:
        name: httpd
        state: present

    - name: restart httpd
      service:
        name: httpd
        state: restarted
    - include_tasks: vsftpd.yml
相关推荐
Akshsjsjenjd3 小时前
Ansible 核心功能:循环、过滤器、判断与错误处理全解析
java·数据库·ansible
路溪非溪4 小时前
Linux驱动开发重要操作汇总
linux·运维·驱动开发
kiwixing4 小时前
集群无法启动CRS-4124: Oracle High Availability Services startup failed
java·运维·数据库·mysql·postgresql·oracle
weixin_456904274 小时前
DevOps部署与监控
运维·devops
CZZDg4 小时前
部署jenkins并基于ansible部署Discuz应用
运维·ansible·jenkins
Coision.4 小时前
硬件:51单片机的按键、中断、定时器、PWM及蜂鸣器
linux·嵌入式硬件·51单片机
小阳睡不醒4 小时前
小白成长之路-develops -jenkins部署lnmp平台
android·运维·jenkins
悟空聊架构5 小时前
一次Feign超时引发的血案:生产环境故障排查全记录
运维·后端·架构
wydxry5 小时前
Linux 系统上配置 GitHub 账号并克隆私有仓库
linux·github