Ansible的学习笔记与总结

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

前言

最近在学习ansible自动化运维工具,在此记录一下学习笔记。

1.Ansible的介绍与安装

1.1 Ansible是什么?

Ansible是一种自动化运维工具,基于Python开发的,用于配置管理、应用部署、任务自动化和持续交付,采用YAML语言编写脚本(playbook),简单易用,广泛应用于DevOps和IT自动化领域。

1.2 Ansible的架构图 

 下面我手画了一个运行逻辑图:

 简单介绍一下,操作方式代表用户可以通过playbook、云、CMDB或者直接自己操作ansible来操作主机组。

INVENTORY:Ansible管理的主机清单

MODULES:Ansible执行命令的功能模块

PLUGINS:模块功能的补充

API:供第三方程序调用的应用程序编程接口

1.3 安装Ansible

1.3.1 主控端

主控端就是执行ansible的主机,可以控制其他主机,在主控端安装ansible有两种主要的方式,一种是yum直接安装:

yum install ansible

另一种是用pip安装。

pip install ansible

 注:windows不能做主控端

1.3.2 被控端

被控端是Linux系统:

ansible方便就方便在,被控端不需要安装什么其他的东西。但是在最新版本的ansible要求被控端的python版本为3.11及以上,我所有的操作都是基于最新版的ansible(目前最新版为2.18.6)。

下面列出ansible版本以及对应的被控端需求,你们可自行选择指定版本下载:

Ansible版本被控端python要求说明
< 2.11python2.7 或 python3.5兼容python2和python3,被控端小于python2.4需要安装python-simplejson
2.12python3.6+开始弃用python2
2.14+python3.8+(强制)完全启用python2

被控端是windows系统:

我没做过windows被控端的设置,这里想要配置的可以自行查阅官方文档。

ansible社区中文文档

2.Ansible的部署 

当我们成功安装ansible之后,在终端输入ansible --version,可以看到安装的ansible的版本及相关配置。(注: 如果是使用pip安装的ansible,那么你的配置文件是需要自己创建并编写的)

下面我会介绍ansible的一些相关文档

2.1 Ansible相关文档

2.1.1 配置文件

上面的图片里的config file就是ansible的主配置文件的地址,一般都是/etc/ansible/ansible.cfg。

/etc/ansible/hosts 主机清单

/etc/ansible/roles/ 存放角色的目录(roles 会在后面讲到,是ansible中的重要概念)

2.1.2 ansible主配置文件

Ansible的配置文件/etc/ansible/ansible.cfg,其中大部分配置内容无需修改,使用默认的即可。即直接取消注释就行。

[defaults]
#inventory      = /etc/ansible/hosts #主机清单列表
#library        = /usr/share/my_modules/ #库文件存放目录
#remote_tmp     = $HOME/.ansible/tmp #临时py命令文件存放在远程主机目录
#local_tmp      = $HOME/.ansible/tmp #本机临时命令执行目录
#forks          = 5 #默认并发数
#sudo_user      = root #默认sudo用户
#ask_sudo_pass = True  #每次执行ansible命令是否询问ssh密码
#ask_pass      = True
#remote_user   = root  #默认远程主机连接用户
#private_key_file = /path/to/private_key
#host_key_checking = True
#timeout = 10

2.1.3 inventory主机清单 

ansible中为了批量的操作主机,需要在inventory file(默认是/etc/ansible/hosts)中添加主机ip。ansible是通过ssh连接被控端的,也就是说连接主机ip时使用的默认端口是22,如果你的被控主机端口不是22,需要在文件中指明,下面是一个主机清单的示例:

192.168.136.125 #普通主机配置
[webservers] #配置组,这样可以直接操作整组的被控机

192.168.136.129 ansible_python_interpreter=/usr/local/python3/bin/python3 #这里的参数配置是指定被控端的python地址
192.168.136.135

[dbsrvs]

192.168.136.[150:160] # 批量定义被控机的ip,即192.168.136.150-192.168.136.160
10.0.0.1:2222 #定义端口号

[appsrvs]
db-[a:f].example.com

如果你需要使用ansible,记得在 /etc/ansible/hosts 中添加被控端ip

3. Ansible相关工具

使用命令

which ansible

来查看自己ansible相关工具的安装位置。

可以看到我这里ansible的相关工具的安装位置是/usr/local/bin,查看当前文件,可以看到ansible的相关工具:

介绍一下相关工具的用途:

ansible相关工具用途
ansible主程序,临时命令执行工具
ansible-doc查看配置文档,模块功能查看工具
ansible-galaxy下载/上传优秀代码或Roles模块的官网平台
ansible-playbook定制自动化任务
ansible-pull远程执行命令的工具
ansible-vault文件加密
ansible-console基于console界面与用户交互的执行工具

利用ansible实现管理的主要方式:

  • Ad-Hoc即直接利用ansible命令,主要用于临时命令使用场景。
  • Ansible-playbook 主要用于长期规划好的,大型项目的场景,需要有前期的规划过程。

 3.1 ansible-doc

用来显示模块帮助

格式:

ansible-doc [options] [module...]

可加参数:

- l, --list              #列出所有可用模块

-s,--snippet        #显示指定模块的playbook片段

 示例:

ansible-doc -l    #列出所有可以使用的模块

可以看到,列出了可以使用的模块。我这里只截取了一部分,按方向键下,可以往下查看模块,按q退出模块查看。

ansible-doc ping  #查看ping模块的帮助用法

ansible-doc -s ping    #简述模块的用处

3.2 ansible

3.2.1 ansible工具的使用

此工具通过ssh协议,实现对远程主机的配置管理、应用部署、任务执行等功能。

使用此工具时,建议先配置ansible的主机端能基于密钥认证的方式联系各个被管理节点(后面会讲解如何配置),不然每次操控被控端时,都需要手动输入账号密码。

格式:

ansible <host-pattern> [-m module_name] [-a args]

host-pattern: 主机清单里中的主机,可以填写指定ip;也可以填写被控端所在组;也可以填写all,表示所有主机。

module_name: 表示模块名

args:添加的参数

选项说明:

--version                     #显示ansible版本及相关信息

-m module_name       #指定模块

--list-hosts                  #显示主机列表,可简写为 --list

-v                                #显示详细过程

-k,--ask-pass            #提示输入ssh连接密码,默认key验证

-c,--check                 #检查ansible代码是否能够执行成功,不执行

-T,--timeout=T          #设置执行命令的超时时间,默认10秒

-u,--user=User         #执行远程命令的用户

3.2.2 构建主机端与被控端的连接

因为ansible是通过ssh与被控端连接的,所以为了成功构建主机端与被控端的连接,我们要做两件事。

第一步,在ansible的配置文件中配置host_key_checking = False。配置这样的参数后,ansible就不会在第一次连接目标主机时进行主机密钥检查。也就是第一次使用ssh连接目标主机时,会出现的下面的提示:

The authenticity of host '192.168.1.10 (192.168.1.10)' can't be established.
ECDSA key fingerprint is SHA256:xxxxx.
Are you sure you want to continue connecting (yes/no)?

但是我只推荐在测试环境取消这个配置,在生产环境,我们可以手动将目标主机添加到~/.ssh/known_hosts中,这样也不会触发主机密钥检查。

第二步,编写脚本进行ssh key配置,如果机器少也可以自己手动配置。其本质步骤就是生产密钥然后将公钥复制到远程主机。

# 设置你的远程主机列表
HOSTS=("192.168.1.100" "192.168.1.101")

# 远程主机登录用户名
REMOTE_USER="root"

# 本地私钥路径
PRIVATE_KEY_PATH="$HOME/.ssh/id_rsa"

# Ansible inventory 文件保存路径
INVENTORY_FILE="./hosts"


echo "开始配置 SSH Key..."

#检查 SSH 密钥对是否存在
if [[ ! -f "$PRIVATE_KEY_PATH" ]]; then
    echo "未找到 SSH 密钥,正在生成..."
    ssh-keygen -t rsa -b 4096 -f "$PRIVATE_KEY_PATH" -P ''
else
    echo "SSH 密钥已存在,跳过生成。"
fi

# 向每台主机分发公钥
for HOST in "${HOSTS[@]}"; do
    echo "正在将公钥发送到 $HOST..."
    ssh-copy-id -i "${PRIVATE_KEY_PATH}.pub" "$REMOTE_USER@$HOST" || {
        echo "公钥复制到 $HOST 失败,请手动检查。"
        exit 1
    }
done


echo "测试连接是否成功..."
ansible -i "$INVENTORY_FILE" managed_hosts -m ping

注意,这个脚本每次都要自己手动输入密码。

3.2.3 ansible与主机的匹配

我们在使用ansible的时候,需要指定这些命令用到哪些主机上,下面将介绍各种主机匹配规则

ALL :表示所有Inventory中的主机

示例

ansible all -m ping  #表示测试所有被控端的连通性

 *:通配符(匹配任意)

ansible "*" -m ping                    #相当于ansible all -m ping 

ansible 192.168.136.* -m ping #匹配所有以192.168.136.开头的主机

 逻辑或(并集)

ansible all -i hosts -m ping --limit group1,group2  #表示执行group1和group2中所有的主机

 逻辑与(交集)

ansible all -i hosts -m ping --limit group1\&group2  #表示执行group1和group2中共同拥有的主机

 逻辑非

ansible all -i hosts -m ping --limit '!group2'   #排除group2中的主机

 组合示例

ansible all -i hosts -m ping --limit 'group1,group3:!group2'  #同时属于group1和group2但是不属于group3

 3.2.4 ansible命令的执行过程

  • 加载自己的配置文件/etc/ansible/ansible.cfg
  • 加载自己对应的模块文件
  • 通过ansible将模块或命令生成临时py文件,并将该文件远程传输至对应执行用户
  • 给文件+x执行
  • 执行并返回结果
  • 删除临时py文件,退出

3.3 ansible-galaxy

 此工具会连接https://galaxy.ansible.com 下载相应的roles,我这里连不上外网,就不展示了。

示例:

ansible-galaxy list                  #列出所有已安装的galaxy

ansible-galaxy install ...         #安装galaxy

ansible-galaxy remove ...      #移除已安装的galaxy

 3.4 ansible-pull

此工具会推送ansible的命令至远程。

3.5 ansible-playbook

此工具用于执行编写好的playbook任务。

3.6 ansible-vault

此工具用于加密yml文件。

ansible-vault [create(创建新文件)| decrypt(解密)|edit(编辑加密文件)|encrypt(加密)|rekey(修改口令)|view(查看)]

示例

加密yml文件:

加密的时候要输入两次一样的口令

查看加密文件:

解密yml文件:

其他就不演示了。

 3.7 ansible-console

此工具可交互执行命令,支持tab

提示符格式:

执行用户@当前操纵的主机组(当前组的主机数量)[f:并发数]

 可以使用的命令:forks n;cd 主机组;list;?或help

展示部分命令的使用:

list命令,显示当前组所有主机列表

forks n 设置并发数

 4. ansible常用模块

4.1 command模块

功能:此模块的作用是在远程主机执行命令,这也是默认模块。

示例:

这个命令主要是在所有的主机下查询/data下的文件

注:该模块不支持管道符和重定向

可以看到,虽然它返回执行成功的标识,但当我们查找时,却并没有查找到,说明并没有创建成功。

原因:Ansible 的 command 模块本质上是直接通过 Python 的 subprocess 执行命令,它不会经过 /bin/sh/bin/bash,所以不支持 Shell 语法。

 那如果我们想使用管道符和重定向符怎么办?我们可以使用shell模块。

4.2 shell模块

功能:此模块用shell执行命令,支持shell语法。

示例:

可以看到管道符和重定向都可以通过shell模块来实现。

4.3 script模块

功能:在远程主机上运行ansible服务器上的脚本(本质就是把脚本传给目标机,再在目标机上运行)

示例:

创建一个tets2.sh的脚本,里面内容就是简单的打印。

使用script模块将该脚本传输到目标主机上运行,可以看到成功打印出信息

4.4 copy模块

功能:从ansible服务器主控端复制文件到远程主机(如果目标主机已经存在目标文件,默认会覆盖,可以指定文件备份)

示例:

这里的命令是将ansible主控端/root/test.sh 文件复制到被控端的/data/test2.sh backup是指定备份

我们可以看到,文件已经被复制到了被控端。

也可以直接指定内容,生成目标文件:

4.5 Fetch模块

功能:从远程主机提取文件至ansible主机端,不支持目录。

示例:

4.6 file模块

功能:设置文件属性

示例:

#创建空文件

ansible all -m file -a 'path=/data/test.txt state=touch'

#递归删除空文件

ansible all -m file -a 'path=/data/test.txt state=absent'

#修改文件属主和权限

ansible all -m file -a "path=/root/test.sh owner=wang mode=755"

#创建目录

ansible all -m file -a "path=/data/mysql state=directory owner=mysql group=mysql"

#创建软连接

ansible all -m file -a "src = /data/testfile dest=/data/test-link state=link"

 4.7 unarchive模块

功能:解包解压缩

两种用法:1.将ansible主机上的压缩包传到远程主机后解压缩至特定目录,设置copy=yes

2.将远程主机上某个压缩包解压至指定目录,设置copy=no.

参数:copy,src,dest,mode,remote_src(与copy相反)

示例:

将主机上的压缩包解压到目标主机的/data文件下:

4.8 archive模块

功能:打包压缩

参数:path(源文件),dest(目标文件),format(文件格式),owner(文件属主),mode(文件权限)

示例:

ansible all -m archive -a 'path=/var/log/ dest=/data/log.tar.bz2 format=bz2 owner=wang mode=600'

4.9 hostname模块

功能:管理主机名

示例:

ansible 192.168.135.129 -m hostname -a "name=k8s-node1"

4.10 Cron模块

功能: 用于在远程主机上管理定时任务(分,时,日,月,周)

示例:

#创建任务

ansible all -m cron -a "minute=0 job=/opt/hourly_task.sh name='create job' " #每小时执行一次脚本

#删除任务

ansible all -m cron -a "name='create job' state=absent"

#禁用任务

ansible all -m cron -a "minute=0 job=/opt/hourly_task.sh name='create job' disabled=yes"

#启用任务

ansible all -m cron -a "minute=0 job=/opt/hourly_task.sh name='create job' disabled=no"

4.11 yum模块

功能:管理软件包,只支持centos,RHEL,不支持ubuntu其他版本.(不建议用,我用的时候一堆问题,不如直接用shell模块执行yum命令)

示例:

ansible all -m yum -a 'name=nginx state=present'     #安装

ansible all -m yum -a 'name=nginx state=absent'      #删除 

 4.12 service模块

功能:管理服务

示例:

ansible all -m service -a "name=nginx state=started enabled=yes" #启动nginx服务并且设置为开机自启

ansible all -m service -a "name=nginx state=stopped"   #停止nginx服务

ansible all -m service -a "name=nginx state=reloaded"  #重载nginx服务

ansible all -m service -a "name=nginx state=restarted"  #重启nginx服务

 4.13 user模块

功能:在远程主机上创建,修改或删除用户账号.

示例:

ansible all -m user -a "name=webadmin home=/home/webadmin create_home=yes" #创建用户并指定home目录

ansible all -m user -a "name=webadmin state=absent remove=yes" #删除用户并移除其home目录

 4.14 Group模块

功能:在远程主机上创建,删除或管理用户组

示例:

ansible all -m group -a "name=devops gid=8888" #创建组并指定gid

ansible all -m group -a "name=devops state=absent" #删除组

 4.15 Lineinfile模块

功能:用于在远程主机的文件中添加,替换,修改,注释或取消注释某一行

示例:

参数:path(目标文件路径),line(要添加或替换的完整内容行),regexp(匹配的正则表达式),insertafter(指定在哪一行后插入),insertbefore(指定在哪一行前插入),state[present(默认)表示要确保该行存在;absent表示确保改行不存在],create(文件不存在时是否创建,默认为no),backrefs(是否在使用正则时启动反向引用)

示例:

添加一行到配置文件,文件不存在时创建:

修改某一行,用正则

删除一行

4.16 Replace模块

功能:基于正则进行匹配和替换

示例:

ansible all -m replace -a 'path=/data/nginx.conf regexp="^#.*" replace="" ' #删除以#开头的注释行

 4.17 setup模块

功能:收集远程主机的信息,并将这些信息作为变量供后续任务使用.

示例:

收集所有信息:

这里输出太多我就不展示了.

我们可以指定获取信息,例如我们指定获取主机名信息:

常见的有用的变量:

变量名含义
ansible_hostname主机名
ansible_distribution操作系统名称
ansible_distribution_version系统版本号
ansible_default_ipv4.address

默认ipv4地址

ansible_memtotal_mb总内存(MB)
ansible_processor_corescpu核心数

5. ansible 中的playbook

5.1 什么是playbook?

playbook使用yaml语法编写的自动化脚本,是由一个或多个"play"组成的列表.

可以简单理解为批量部署手册的自动执行版本.

5.2 playbook的组成 

  • Hosts : 执行playbook的远程主机列表
  • tasks: 任务集    
  • variables: 内置变量或自定义变量在playbook中调用
  • tempates: 模板
  • handlers和notify,两者结合使用,由特定条件触发的操作,满足条件方才能执行
  • tags: 标签,指定某条任务执行

在定义task时,有两种形式:

  • action:module arguments
  • module:arguments  (更推荐这个形式,简单易懂)

 5.3 playbook编写

先写一个简单的playbook示例:

---
#install_nginx.yml
- hosts: all #目标用户组
  remote_user: root #操作用户
  #取消默认的收集
  gather_facts: no
  tasks:
    - name: add group nginx 
      group:
        name: nginx
        state: present
    - name: add user nginx
      user:
        name: nginx
        state: present
        group: nginx
    - name: Install nginx
      shell: yum install nginx -y  #这里可以用yum模块
    - name: start nginx
      service:
        name: nginx
        state: started
        enabled: yes

可以运行ansible-playbook install_nginx.yml -C 来检查playbook有没有语法错误,这不会运行到目标主机上.

可以看到,这个playbook的检查没有问题.

5.3.1 playbook中使用handlers和notify

这两个东西类似于数据库中的触发器的触发行为.简单来说,就是当用户做了特定的动作后,会触发一个特定的行为.

示例:

---
- hosts: all
  remote_user: root

  tasks:
    - name: Install httpd
      shell: yum install -y httpd

    - name: Copy httpd config file #将主机端的配置文件复制到被控端
      copy:
        src: files/httpd.conf
        dest: /etc/httpd/conf/
      notify: restart service #这里设置一个触发器,当用户进行了修改配置文件的操作,就重启服务

    - name: Start httpd service
      service:
        name: httpd
        state: started
        enabled: yes

  handlers:
    - name: restart service #这里名字一定要跟notify里面的对应上
      service:
        name: httpd
        state: restarted

5.3.2 playbook中使用tags组件

tags组件的作用: 可以让我们在运行playbook时,只执行特定任务(或跳过特定任务)

示例:

---
- hosts: webserver
  remote_user: root
  tasks:
    - name: 安装 nginx
      yum:
        name: nginx
        state: present
      tags: install #设置tags为install

    - name: 配置文件
      copy:
        src: nginx.conf
        dest: /etc/nginx/nginx.conf
      notify: restart nginx
      tags: config

    - name: 启动 nginx
      service:
        name: nginx
        state: started
      tags: start

  handlers:
    - name: restart nginx
      service:
        name: nginx
        state: restarted
      tags: restart

配置了tags之后,我们就可以在命令行指定某一个标签运行或者跳过某一段标签

例如:

ansible-playbook site.yml --tags "install,config"  #只运行install和config

ansible-playbook site.yml --t "install,config"

ansible-playbook site.yml --skip-tags "start"       #跳过start任务

ansible-playbook site.yml --list-tags                    #查看playbook中有哪些tag

 5.3.3 playbook中使用变量

变量名:仅能由字母、数字、下划线组成,且只能以字母开头

定义方式:variable=value,例如:http_port = 80

调用方式:{{ variable }} 

定义变量的方式不止上面那一种,还有很多种:

  • 使用setup里面的变量,在执行playbook时,如果添加gather_facts: no(取消默认收集),playbook默认会收集目标主机的信息,这时候我们就可以使用setup里面的变量。

        示例: 

先编写一份playbook:

#use_setup_variable.yml
---
- hosts: all
  remote_user: root
  tasks:
    - name: 创建以目标主机名命名的文件
      file: 
        name: /data/{{ ansible_hostname }}
        state: touch

运行并查看结果:

  • 在执行playbook时,使用 -e 添加变量

        示例:

---
- hosts: all
  remote_user: root
  tasks:
    - name: 在data目录下创建指定文件
      file:
        name: /data/{{ var }}
        state: touch

运行并查看结果:

  •  在playbook里面定义变量

        示例:

---
#playbook中变量的创建与引用
- hosts: all
  remote_user: root
  vars: #定义变量
     username: user1
     groupname: group1


  tasks:
    - name: create group
      group: name={{groupname}} state=present
    - name: create user
      user: name={{ username }} group={{ groupname }} state=present
  • 使用变量文件 

         也就是在一个单独的yml文件中定义变量,然后在playbook中引用这个yml文件。

        示例:

定义一个名为vars.yml的变量文件

#变量文件
---
package_name: vsftpd
service_name: vsftpd
---
#调用变量文件里定义的变量
- hosts: all
  remote_user: root
  var_files:
    - vars.yml

  tasks:
    - name: install package
      yum: name={{ package_name }}
      tags: install
    - name: start service
      service: name={{ service_name }} state=started enabled=yes
  •  在主机清单中定义文件

 [websrvs]

192.168.136.129 http_port=80 #这是单独定义一个主机

192.168.136.136

[websrvs:vars]

ntp_server=ntp.magedu.com #这是定义一个主机组的共同变量

5.4 playbook中的template模板

功能:可以根据和参考模块文件,动态生成相类似的配置文件

template文件必须存放于templates目录下,且命名时以.j2结尾(template模板使用jinja2语言)

yaml/yml文件必须和templates目录平级,目录结构如下:

示例:利用template同步nginx配置文件

#准备templates/nginx.conf.j2文件
- host: all
  remote_user: root
  tasks:
    - name: template config to remote hosts
      template:
        src: nginx.conf.j2
        dest: /etc/nginx/nginx.conf

---
#可以先修改nginx.conf.j2 里面的配置。
#这里使用setup里面的变量动态配置nginx的工作进程
worker_process {{ ansible_processor_vcpus }}

也可以在配置文件里进行算术运行、条件判断等,这里就不细说了。

5.5 playbook中的条件判断

在playbook中,要想使用条件判断,可以使用关键字when。通过在task后添加when子句即可使用条件测试。

示例:

---
- hosts: all
  remote_user: root
  tasks:
    - name: 关闭k8s-node1上的nginx服务
      service: 
        name: nginx
        state: stopped
      when: ansible_hostname == 'k8s-node1'

5.6 playbook中使用迭代

当有需要重复性执行的任务时,可以使用迭代机制,对迭代的项目进行引用,固定变量名为:"item"。注:这个变量名只能为item

示例:

---
- hosts: all
  remote_user: root
  tasks:
    - name: add users
      user: name={{ item }} state=present
      with_items:
        - testuser1
        - testuser2

 6. ansible中的roles

作用:用于层次性、结构化地组织playbook。

roles:多个角色的集合,可以将多个role,分别放置roles目录下的独立子目录中。

6.1 roles默认存放位置

使用命令:ansible-galaxy list ;可以看到ansible默认存放的路径。

我们可以在这些目录下创建role,也可以自己创建roles目录,然后在这个roles目录下面实现role。

我们在创建role时,每个role下面有许多子目录,每个子目录有不同的作用。

6.2 roles各个目录的作用

roles/project(项目名称)/ 下面有以下子目录:

  • files/:存放copy或script模块等调用的文件
  • templates/:存放模板
  • tasks/:定义task,role的基本元素,至少包含一个main.yml文件。
  • handlers/:触发器
  • vars/:定义变量
  • meta/:定义当前角色的特殊设定及其依赖关系
  • default/:设定默认变量时使用此目录中的main.yml文件,优先级比vars低。

roles 创建步骤:

  • 创建以roles命名的目录。
  • 在roles目录中分别创建以各角色名称命名的目录。
  • 在每个角色命名的目录中分别创建files、handlers、meta、tasks、templates和vars目录;用不到的目录可以创建为空目录,也可以不创建。
  • 在playbook中,调用各角色

 6.3 playbook调用角色

调用方法1:

直接roles调用。(注:playbook要跟roles处于同一级目录下)

---
- hosts: all
  remote_user: root
  roles:
    - mysql
    - nginx

调用方法2:

键role用于指定角色名称,后续的k/v用于传递变量给角色

---
- hosts: all
  remote_user: root
  roles:
    - mysql
    - {role: nginx , username: nginx}

 调用方法3:

基于条件判断。

---
- hosts: all
  remote_user: root
  roles:
    - mysql
    - {role: nginx,when: ansible_hostname='k8s-node1'}

6.4 使用角色安装nginx

创建四个文件:handlers,tasks,templates

首先是tasks,创建五个文件,分别是:config.yml,file.yml,install.yml,main.yml,service.yml

每个文件的代码如下所示:

# config.yml 作用是在两个不同主机上配置两个不同的conf文件,同时匹配触发器
- name: config file for centos7
  template: src=nginx7.conf.j2 dest=/etc/nginx/nginx.conf
  when: ansible_distribution_major_version=="7"
  notify: restart
- name: config file for centos8
  template: src=nginx8.conf.j2 dest=/etc/nginx/nginx.conf
  when: ansible_distribution_major_version=="8"
  notify: restart
#跨项目角色调用
#这个跨角色调用一定要从roles开始(相对路径)
#跨项目将index网页复制到目标主机
#file.yml
- name: index.html
  copy: src=roles/httpd/files/index.html dest=/usr/share/nginx/html/
#安装nginx install.yml
- name: install
  yum: name=nginx
#service.yml
- name: start service
  service: name=nginx state=started enable=yes
#main.yml 用来规定yml文件的执行顺序
- include: install.yml
- include: config.yml
- include: file.yml
- include: service.yml

 然后是handlers,这里只定义了一个main.yml文件,内容如下:

- name: restart
  service: name=nginx state=restarted

就是匹配之前的config.yml文件中的notify。

其次就是templates,这里面定义了nginx.conf的模板,定义了两个模板,本别是nginx7.conf.j2  nginx8.conf.j2。其实就是nginx.conf文件复制了两份,改了一下名字,同时将里面的worker_processes 配置为worker_processes {{ansible_processor_vcpus+2}};

最后就是playbook的编写:

#调用role文件
---
- hosts: all
  remote_user: root

  roles:
    - nginx

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值