自动化运维工具——Ansible学习(三)——playbook学习完结

目录

一、批量创建文件

1.脚本内容

2.执行脚本

3.执行结果

二、变量封装成一个文件

1.定义变量文件

2.编写脚本

3.检查与执行脚本

4.运行结果

二、templates——模板

1.安装nginx

2.创建templates文件

3.复制nginx的配置文件到templates中,并重命名

4.编辑脚本

5.检查并执行脚本——nginx的worker进程根据被控机的cpu个数来指定

6.nginx的worker进程改为cpu的2倍

(1)修改模板

(2)修改前是auto

(3)cpu的个数需要变量来表示,因此,先查看被控机的cpu个数

(4)修改后

(5)修改配置文件,需要重启服务——handlers

(6)检查并执行脚本

7.修改每台被控机nginx的端口号

(1)在主机清单中设置端口号

(2)找到j2文件的监听内容,配置变量

(3)执行脚本

(4)检查被控机各自的端口号是否更改 ​编辑

8.将变量写在playbook中

9.当变量在命令行中定义,命令行中的变量优先级最高

三、when ——条件测试

1.when概述

2.变量的优先级

3.when使用示例

(1)编写脚本

(2)修改j2配置文件

(3)修改nginx.conf6.j2文件的用户

(4)执行脚本

(5)查看被控机端口信息

四、with_items——迭代

(一)批量下载程序 

1.脚本示例 

2.执行脚本并检查

(二)批量创建用户组 

1.编写脚本

2.检查group是否成功创建

(三)迭代嵌套子变量——批量创建用户名

1.编写脚本

2.查看脚本执行结果

五、playbook中template for if

(一)遍历生成文件的内容

1.编写脚本 

2.执行脚本并检查结果 

(二)键值对形式的for循环

1.编写脚本 

2.执行脚本并检查结果 

(三)多层嵌套 

1.编写脚本

2.执行脚本并检查结果

(四)if判断的用法 

1.编写脚本

2.执行脚本并检查结果


书接上回《自动化运维工具——Ansible学习(二)

一、批量创建文件

在被控机的/data/目录下创建以各个被控机主机名为文件名的.log文件

1.脚本内容

vim var.yml


---
- hosts: websrvs
  remote_user: root

  tasks:
    - name: create log file
      file: name=/data/{{ ansible_fqdn }}.log state=touch mode=600 owner=lxm

2.执行脚本

# 检查语法
[root@ansible145 ansible]# ansible-playbook -C var.yml


# 执行脚本
[root@ansible145 ansible]# ansible-playbook var.yml

3.执行结果

二、变量封装成一个文件

如果变量过多,就可以将变量封装为一个文件。

1.定义变量文件

[root@ansible145 ansible]# vim vars.yml

var1: httpd
var2: vsftpd

2.编写脚本

[root@ansible145 ansible]# vim testvar.yml


---
- hosts: websrvs
  remote_user: root
  vars_files:
    - vars.yml

  tasks:
    - name: install package
      yum: name={{ var1 }}
    - name: create file
      file: name=/data/{{ var2 }}.log state=touch

3.检查与执行脚本

# 检查脚本
[root@ansible145 ansible]# ansible-playbook -C testvar.yml

# 执行脚本
[root@ansible145 ansible]# ansible-playbook testvar.yml

4.运行结果

二、templates——模板

即用一个文件作为模板,传送到远程的被控机上去,并且针对被控机的配置去改写文件,一般是配置文件。

template不能作为命令行调用,只能写在playbook中进行调用。

// 是整除的意思,例如9/2=4.5,9//2=4

**是幂次方,取指数

1.安装nginx

2.创建templates文件

[root@ansible145 ansible]# mkdir templates

3.复制nginx的配置文件到templates中,并重命名

[root@ansible145 ansible]# cp /etc/nginx/nginx.conf templates/nginx.conf.j2
[root@ansible145 ansible]# vim templates/nginx.conf.j2

4.编辑脚本

---
- hosts: websrvs
  remote_user: root

  tasks:
    - name: install package
      yum: name=nginx
    - name: copy template
      template: src=/nginx.conf.j2 dest=/ect/nginx/nginx.conf
    - name: start service
      service: name=nginx state=started enabled=yes

注意:

        如果j2文件放在templates文件下,可以直接写template: src=nginx.conf.j2,ansible可以自动识别出来;

        如果j2文件没有放在templates文件下,需要加上绝对路径template: src=xx/xx/nginx.conf.j2

5.检查并执行脚本——nginx的worker进程根据被控机的cpu个数来指定

[root@ansible145 ansible]# ansible-playbook -C testtempl.yml

[root@ansible145 ansible]# ansible-playbook testtempl.yml

[root@ansible145 ansible]# ansible websrvs -m shell -a 'rpm -q nginx'

# 检查端口
[root@ansible145 ansible]# ansible websrvs -m shell -a 'ss -ntpl'

[root@ansible145 ansible]# ansible websrvs -m shell -a 'ps aux | grep nginx'

102有4个nginx的worker进程

6.nginx的worker进程改为cpu的2倍

(1)修改模板
[root@ansible145 ansible]# vim templates/nginx.conf.j2
(2)修改前是auto

(3)cpu的个数需要变量来表示,因此,先查看被控机的cpu个数
[root@ansible145 ansible]# ansible websrvs -m setup | grep "cpu"
        "ansible_processor_vcpus": 4, 
        "ansible_processor_vcpus": 4, 
(4)修改后

(5)修改配置文件,需要重启服务——handlers
---
- hosts: websrvs
  remote_user: root

  tasks:
    - name: install package
      yum: name=nginx
    - name: copy template
      template: src=/nginx.conf.j2 dest=/etc/nginx/nginx.conf
      notify: restart service
    - name: start service
      service: name=nginx state=started enabled=yes
  
   handlers:
    - name: restart service
      service: name=nginx state=restarted
(6)检查并执行脚本
[root@ansible145 ansible]# ansible-playbook -C testtempl.yml

[root@ansible145 ansible]# ansible-playbook testtempl.yml

[root@ansible145 ansible]# ansible websrvs -m shell -a 'ps aux | grep nginx'

7.修改每台被控机nginx的端口号

(1)在主机清单中设置端口号
[root@ansible145 ansible]# vim /etc/ansible/hosts

[websrvs]
192.168.22.141 http_port=81
192.168.22.142 http_port=82
(2)找到j2文件的监听内容,配置变量

(3)执行脚本
[root@ansible145 ansible]# ansible-playbook testtempl.yml
(4)检查被控机各自的端口号是否更改

8.将变量写在playbook中

---
- hosts: websrvs
  remote_user: root
  vars:
    - http_port: 88
  
  tasks:
    - name: install package
      yum: name=nginx
    - name: copy template
      template: src=/nginx.conf.j2 dest=/etc/nginx/nginx.conf
      notify: restart service
    - name: start service
      service: name=nginx state=started enabled=yes
  
   handlers:
    - name: restart service
      service: name=nginx state=restarted

即使主机清单中已经定义了端口号,但是playbook优先于主机清单

修改后的端口号:

9.当变量在命令行中定义,命令行中的变量优先级最高

[root@ansible145 ansible]# ansible-playbook -e "http_port=99" testtempl.yml

三、when ——条件测试

1.when概述

2.变量的优先级

-e 命令行<----playbook<-----主机清单中的普通变量<-----主机清单中的组变量

3.when使用示例

当CentOS版本不同时,选择不同的配置文件

注意:提前在未安装nginx的被控机上安装好nginx

(1)编写脚本
---
- hosts: all
  remote_user: root
  vars:
    - http_port: 88
  
  tasks:
    - name: install package
      yum: name=nginx
    - name: copy template for cnetos7
      template: src=/nginx.conf7.j2 dest=/etc/nginx/nginx.conf
      when: ansible_distribution_major_version == "7"
      notify: restart service
    - name: copy template for cnetos7
      template: src=/nginx.conf6.j2 dest=/ect/nginx/nginx.conf
      when: ansible_distribution_major_version == "6"
      notify: restart service
    - name: start service
      service: name=nginx state=started enabled=yes
  
   handlers:
    - name: restart service
      service: name=nginx state=restarted
(2)修改j2配置文件

将不同版本的CentOS上的nginx配置文件复制到主控机后再修改!

(3)修改nginx.conf6.j2文件的用户

(4)执行脚本
[root@ansible145 ansible]# ansible-playbook testtempl.yml

(5)查看被控机端口信息
# 查看端口号
[root@ansible145 ansible]# ansible all -m shell -a 'ss -ntl'

# 查看nginx进程
[root@ansible145 ansible]# ansible all -m shell -a 'ps aux | grep nginx'

四、with_items——迭代

(一)批量下载程序 

1.脚本示例 

[root@ansible145 ansible]# vim testitem.yml


---
- hosts: all
  remote_user: root

  tasks:
    - name: create some files
      file: name=/data/{{ item }} state=touch
      when: ansible_distribution_major_version == "7"
      with_items:
        - file1
        - file2
        - file3
    - name: install some packages
      yum: name={{ item }}
      with_items:
        - htop
        - sl
        - hping3

2.执行脚本并检查

[root@ansible145 ansible]# ansible-playbook testitem.yml

(二)批量创建用户组 

1.编写脚本

[root@ansible145 ansible]# vim testitem2.yml


---
- hosts: all
  remote_user: root

  tasks:
    - name: create some group
      group: name={{ item }}
      when: ansible_distribution_major_version == "7"
      with_items:
        - g1
        - g2
        - g3

2.检查group是否成功创建

[root@ansible145 ansible]# ansible all -m shell -a 'getent group'

(三)迭代嵌套子变量——批量创建用户名

1.编写脚本

[root@ansible145 ansible]# vim testitem3.yml


---
- hosts: all
  remote_user: root

  tasks:
    - name: create some group
      group: name={{ item }}
      when: ansible_distribution_major_version == "7"
      with_items:
        - g1
        - g2
        - g3
    - name: create some user
      user: name={{ item.name }} group {{ item.group }}
      with_items:
        - { name: 'user1', group: 'g1' }
        - { name: 'user2', group: 'g2' }
        - { name: 'user3', group: 'g3' }

2.查看脚本执行结果

[root@ansible145 ansible]# ansible all -m shell -a 'getent passwd '

用户名的属组对应组ID

五、playbook中template for if

(一)遍历生成文件的内容

1.编写脚本 

[root@ansible145 ansible]# vim testfor.yml


---
- hosts: websrvs
  remote_user: root
  vars:
     ports:
       - 81
       - 82
       - 83

  tasks:
     - name: copy conf
       template: src=for1.conf.j2 dest=/data/for1.conf
[root@ansible145 templates]# vim for1.conf.j2


{% for port in ports %}
server{
        listen {{ port }}
}
{% endfor %}

2.执行脚本并检查结果 

[root@ansible145 ansible]# ansible-playbook testfor.yml

(二)键值对形式的for循环

1.编写脚本 

[root@ansible145 ansible]# vim testfor2.yml 


---
- hosts: websrvs
  remote_user: root
  vars:
     ports:
       - listen_port: 81
       - listen_port: 82
       - listen_port: 83

  tasks:
     - name: copy conf
       template: src=for1.conf.j2 dest=/data/for1.conf
[root@ansible145 ansible]# vim ./templates/for1.conf.j2 

{% for port in ports %}
server{
       listen {{ port.listen_port }}
}
{% endfor %}

2.执行脚本并检查结果 

[root@ansible145 ansible]# ansible-playbook testfor2.yml

(三)多层嵌套 

1.编写脚本

[root@ansible145 ansible]# vim testfor3.yml 

---
- hosts: websrvs
  remote_user: root
  vars:
     ports:
       - web1:
         port: 81
         name: node141
         rootdir: /data/website1
       - web2:
         port: 82
         name: node142
         rootdir: /data/website2
       - web3:
         port: 83
         name: node143
         rootdir: /data/website3

  tasks:
     - name: copy conf
       template: src=for3.conf.j2 dest=/data/for3.conf
[root@ansible145 ansible]# vim ./templates/for3.conf.j2

{% for p in ports %}
server{
   listen {{ p.port }}
   servername {{ p.name }}
   documentroot {{ p.rootdir }}
}
{% endfor %}

2.执行脚本并检查结果

[root@ansible145 ansible]# ansible-playbook testfor3.yml

(四)if判断的用法 

1.编写脚本

[root@ansible145 ansible]# vim testfor4.yml 

---
- hosts: websrvs
  remote_user: root
  vars:
     ports:
       - web1:
         port: 81
         # name: node141
         rootdir: /data/website1
       - web2:
         port: 82
         name: node142
         rootdir: /data/website2
       - web3:
         port: 83
         # name: node143
         rootdir: /data/website3

  tasks:
     - name: copy conf
       template: src=for4.conf.j2 dest=/data/for4.conf
[root@ansible145 ansible]# vim templates/for4.conf.j2

{% for p in ports %}
server{
   listen {{ p.port }}
{% if p.name is defined %}
   servername {{ p.name }}
{% endif %}
   documentroot {{ p.rootdir }}
}
{% endfor %}

2.执行脚本并检查结果

[root@ansible145 ansible]# ansible-playbook testfor4.yml

至此,playbook学习完结。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自动化运维工具——ansible是一款开源的IT自动化工具,广泛应用于软件部署、配置管理和任务协同等领域。它的最大特点是简单易用、功能强大且跨平台。 首先,ansible具有简单易用的特点。它使用简单的YAML语言作为配置文件,无需编写复杂的脚本。用户只需要简单地定义主机和操作即可完成任务的执行。这使得即便是非开发人员,也能轻松上手使用ansible进行自动化管理。 其次,ansible功能强大。它支持广泛的操作系统、云平台和网络设备,并提供了丰富的模块化功能。通过在任务中使用ansible的模块,我们可以实现系统配置、软件安装、文件传输等各种常见操作。此外,ansible不仅支持并发执行任务,还能够将任务分组执行,并提供了强大的变量和条件控制功能。 再次,ansible跨平台。无论是在Linux、Unix还是Windows系统上,ansible都能够良好地运行。此外,它还支持云平台,如AWS、Azure等,以及网络设备,如Cisco、Juniper等。这使得ansible成为一个非常灵活的自动化运维工具,能够满足各种不同环境和需求的自动化管理。 最后,ansible还具有良好的社区支持。ansible拥有庞大的用户社区和活跃的开发者社区,有大量的文档、示例和插件可供参考和使用。这使得我们在使用ansible时能够获得快速解答和支持,同时也能够从社区中学习到更多的技巧和经验。 总而言之,ansible是一款简单易用、功能强大且跨平台的自动化运维工具。它在软件部署、配置管理和任务协同等方面具有广泛的应用,并且得到了良好的社区支持。无论是企业还是个人,都可以通过ansible来提高工作效率和自动化管理水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值