当前位置: 首页 > article >正文

回炉重造十一------ansible批量安装服务

1.playbook的核心组件

  • Hosts 执行的远程主机列表
  • Tasks 任务集,由多个task的元素组成的列表实现,每个task是一个字典,一个完整的代码块功能需最
    少元素需包括 name 和 task,一个name只能包括一个task
  • Variables 内置变量或自定义变量在playbook中调用
  • Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
  • Handlers 和 notify 结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
  • ags 标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此
    会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地
    长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断

1.1ansible命令执行过程

1. 加载自己的配置文件,默认/etc/ansible/ansible.cfg
2. 加载自己对应的模块文件,如:command
3. 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户
   $HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
4. 给文件+x执行
5. 执行并返回结果
6. 删除临时py文件,退出

1.2 ansible常用工具

ansible-vault
ansible-galaxy
ansible-vault [create|decrypt|edit|encrypt|rekey|view]
ansible-vault encrypt hello.yml #加密
ansible-vault decrypt hello.yml #解密
ansible-vault view hello.yml #查看
ansible-vault edit hello.yml #编辑加密文件
ansible-vault rekey hello.yml #修改口令
ansible-vault create new.yml #创建新文件

1.3host组件

1.3.1概念:

aybook中的每一个play的目的都是为了让特定主机以某个指定的用户身份执行任务。hosts用
于指定要执行指定任务的主机,须事先定义在主机清单中

1.3.2 host文件的书写

[servera]  #组名
172.17.8.1
172.17.8.2
172.17.8.3

[serverb]
172.17.8.1
172.17.8.4
172.17.8.5

[serverc]
servera:serverb  #取servera和serverb的并集
#相当于
172.17.8.1
172.17.8.2
172.17.8.3
172.17.8.4
172.17.8.5

[serverd]
servera:&server #取servera和serverb组的交集
servera:!serverb #在serevra中但不在serverb中

1.2 task列表和action组件

1.2.1 概念

play的主体部分是task list,task list中有一个或多个task,各个task 按次序逐个在hosts中指定的所有主
机上执行,即在所有主机上完成第一个task后,再开始第二个task,task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致.每个task都应该有其name,用于playbook的执行结果输出,建议其内容能清晰地描述任务执行步骤。如果未提供name,则action的结果将用于输出。

1.2.2 task格式

tasks:
 - name: install httpd
  yum: name=httpd
  
#或者
tasks:
 - name: install httpd
   yum: 
     name: httpd

2.编写playbook文件

2.1playbook的命令

--syntax-check    #语法检查,可缩写成--syntax, 相当于bash -n
-C --check #模拟执行,只检测可能会发生的改变,但不真正执行操作,dry run
--list-hosts   #列出运行任务的主机
--list-tags #列出tag
--list-tasks #列出task
--limit 主机列表 #只针对主机列表中的特定主机执行
-i INVENTORY     #指定主机清单文件,通常一个项对应一个主机清单文件
--start-at-task START_AT_TASK #从指定task开始执行,而非从头开始,START_AT_TASK为任务的
name
-v -vv  -vvv #显示过程

2.2setup变量的调用

查看远程主机默认的setup变量
ansible 172.17.8.11 -m setup
#常用的setup变量
"ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "172.17.8.11"
        ],
  "ansible_default_ipv4": {
            "address": "172.17.8.11", 
            "alias": "eth0", 
            "broadcast": "172.17.8.255", 
            "gateway": "172.17.8.2", 
            "interface": "eth0", 
            "macaddress": "00:0c:29:87:53:a2", 
            "mtu": 1500, 
            "netmask": "255.255.255.0", 
            "network": "172.17.8.0", 
            "type": "ether"
  #调用setup中的变量
  格式:{{ 变量名["变量名下的分支"] }}
  - hosts: host

  tasks:
    - name: show host ip
      file: 
        path: /data/{{ ansible_default_ipv4["address"] }}_{{ ansible_date_time["date"] }}.log  
        state: touch

2.3文件中定义变量

#调用文件中的变量
vim var1.yml
---
- hosts: host
  vars:  #定义变量
    user: weng  #变量名:定义变量的值
    group: shiqiang

  tasks:
    - name: print debug 
      debug:
        msg: my name is {{ user }} ,my group is {{ group }}  #{{ $name }}引用变量 
        
#文件中的变量相互调用
---
  - hosts: host
 remote_user: root
 vars:
  collect_info: "/data/test/{{ansible_default_ipv4['address']}}/"
 tasks:
   - name: create IP directory
   file: name="{{collect_info}}" state=directory
   
   
 #使用变量文件
 vim vars.yml
---
# variables file
package_name: mariadb-server
service_name: mariadb
vim var5.yml
---
#install package and start service
- hosts: dbsrvs
remote_user: root
vars_files:
  - vars.yml
tasks:
  - name: install package
  yum: name={{ package_name }}
  tags: install
  - name: start service
   service: name={{ service_name }} state=started enabled=yes

3、实战案例

3.1 基于角色安装mysql5.6

[root@dns-master ansible]# tree
.
├── mysql_role.yml
├── nginx
└── roles 
    └── mysql
        ├── files     #存放数据库的配置文件和安装包
        │   ├── my.cnf  #配置文件
        │   └── mysql-8.0.25-el7-x86_64.tar.gz  #mysql的安装包
        ├── tasks  #任务列表
        │   ├── group.yml   
        │   ├── init_data.yml
        │   ├── install.yml
        │   ├── linksoft.yml
        │   ├── main.yml  #任务列表
        │   ├── mysql.conf.yml
        │   ├── path.yml
        │   ├── service.yml
        │   ├── start_file.yml
        │   ├── unarchive.yml
        │   └── user.yml
        └── vars
            └── main.yml  #定义变量参数
  
  
  [root@dns-master tasks]# cat main.yml 
- include: group.yml
- include: user.yml
- include: unarchive.yml
- include: linksoft.yml
- include: mysql.conf.yml
- include: init_data.yml
- include: path.yml
- include: start_file.yml
- include: service.yml
  
  [root@dns-master tasks]# cat group.yml 
- name: create group mysql
  group:
    name: mysql
    gid: 306


[root@dns-master tasks]# cat user.yml 
- name: create mysql user
  user:
    name: mysql
    uid: 306
    group: mysql

[root@dns-master tasks]# cat unarchive.yml 
- name: copy tar to remote host and file mode
  unarchive:
    src: /data/ansible/roles/mysql/files/{{ mysql_file }}
    dest: /usr/local/src
    group: mysql
    owner: mysql
    
[root@dns-master tasks]# cat linksoft.yml
- name: create linkfile  /usr/local/src/mysql
  file:
    src: /usr/local/src/mysql-8.0.25-el7-x86_64
    dest: /usr/local/src/mysql
    state: link
    group: mysql
    owner: mysql
    
[root@dns-master tasks]# cat mysql.conf.yml
- name: create mysql config
  copy:
    src: /data/ansible/roles/mysql/files/my.cnf
    dest: /etc/my.cnf
    
[root@dns-master tasks]# cat init_data.yml
- name: data dir
  shell: /usr/local/src/mysql/bin/mysqld --initialize-insecure --user=mysql --datadir=/app/mysql  --basedir=/usr/local/src/mysql

[root@dns-master tasks]# cat path.yml
- name: PATH
  copy:
    content: 'PATH={{dest_file}}/mysql/bin:$PATH'
    dest: /etc/profile.d/mysql.sh

[root@dns-master tasks]# cat start_file.yml 
- name: create start mysql file
  shell: /bin/cp {{dest_file}}/mysql/support-files/mysql.server /etc/init.d/mysqld;sed -Ei 's#^(basedir=)$#\1\/usr\/local\/src\/mysql#' /etc/init.d/mysqld;sed -Ei 's#^(datadir=)$#\1\/app\/mysql#' /etc/init.d/mysqld

[root@dns-master tasks]# cat service.yml 
- name: start mysql
  shell: chkconfig --add mysqld;/etc/init.d/mysqld start

关于ansible常用的模块功能,之前做过总结这里就不做总结了,后面还会继续改进,有的案例和内容还没总结好。先凑合这看


http://www.kler.cn/a/16375.html

相关文章:

  • llama factory lora 微调 qwen2.5 7B Instruct模型
  • `node-gyp` 无法找到版本为 `10.0.19041.0` 的 Windows SDK
  • 华为云前台用户可挂载数据盘和系统盘是怎么做到的?
  • 传奇996_21——龙岭事件
  • 关于GCC内联汇编(也可以叫内嵌汇编)的简单学习
  • C# 模拟浏览器自操作(自动化办公)
  • Java IO流第一章
  • “BIM+智慧工地”精准“数字化”变身智慧工程“管家”
  • 国内首款多节点/无需密钥/无需登录的ChatGPT客户端开源项目
  • v2c - 从Verilog 转换到 C语言的工具
  • DDS基本原理与FPGA实现
  • 19安徽比赛
  • `netstat`的替换命令`ss`
  • 【深度学习】计算机视觉(12)——Faster RCNN(最终篇)
  • 【开源项目】Dynamic-Tp核心流程源码解读
  • 软件过程改进的12条
  • 带你深入学习k8s--(四) 控制器(k8s核心)
  • 【Unity入门】20.三维向量
  • 开源Stylegan人脸生成预训练模型
  • 局域网远程桌面工具推荐
  • mysql如何加行锁
  • Centos8手动设置时区、日期、时间,且将时间设置为24小时格式
  • C++:分治算法之选择问题的选择第k小元素问题
  • django auth模块帮你实现完整的用户体系
  • 基于电流控制的并网逆变器(Simulink)
  • 分布式链路追踪之SkyWalking