ansible之主机清单及playbook剧本(代码片段)

Zmac111 Zmac111     2022-12-20     592

关键词:

一、主机清单

ansible默认的主机清单是/etc/ansible/hosts文件
主机清单可以手动设置,也可以通过Dynamic Inventory动态生成
一般主机名使用FQDN

vi /etc/ansible/hosts
[webserver]              #使用方括号设置组名
www1.example.org         #定义被监控主机,这边可以是主机名也可以是IP地址
www2.example.org:2222    #冒号后定义远程连接端口,默认是ssh的22端口

如果是名称类似的主机,可以使用列表的方式标识各个主机

[webserver]
//[01:50]表示匹配从0150,后面跟着内置变量,这里定义了ssh的访问的用户名和密码,用于免交互登录
www[01:50].example.org ansible_ssh_user=root ansible_ssh_pass=abc123

[dbbservers]
//[a:f]表示支持匹配a到f
db-[a:f].example.org

inventory变量参数

ansible_ssh_host #将要连接的远程主机名,与你想要设定的主机的别名不同的话,可以通过此变量设置。
ansible_ssh_port #ssh 端口号.如果不是默认的端口号,通过此变量设置。
ansible_ssh_user #默认的 ssh 用户名。
ansible_ssh_pass #ssh 密码(这种方式并不安全,强烈建议使用 --ask-pass 或SSH密钥)。
ansible_ssh_private_key_file #ssh使用的私钥文件,适用于有多个密钥,但你不想使用 SSH 代理的情况。
ansible_ssh_common_args #此设置附加到 sftp  scp 和ssh的缺省命令行。
ansible_sftp_extra_args #此设置附加到默认 sftp 命令行。
ansible_scp_extra_args #此设置附加到默认 scp 命令行。
ansible_ssh_extra_args #此设置附加到默认 ssh 命令行。
ansible_ssh_pipelining #确定是否使用SSH管道。这可以覆 ansible.cfg 中的设置。
ansible_shell_type #目标系统的shell类型。默认情况下,命令的执行使用  sh  语法,可设置为  csh    fish '
ansible_python_interpreter #目标主机的 python路径.适用于的情况: 系统中有多个 Python , 或者命令路径不是"/usr/bin/python",比如 *BSD, 或者 /usr/bin/python
ansible_*_interpreter #这里的" * "可以是 ruby  perl 或其他语言的解释器,作用和ansible_python_interpreter 类似。
ansible_shell_executable #这将设置 ansibie 控制器将在目标机器上使用的 shell ,覆盖 ansible.cfg 中的配置,默认为 /bin/sh。

Inventory中的变量

主机变量
[webserver]
//定义变量http_port(开放的端口信息)和maxRequestsChild(最大进程数)
www1.magedu.com http_port=80 maxRequestsChild=808
www2.magedu.com http_port=8080 maxRequestsChild=909

组变量
[servers:vars]
ntp_server=ntp.example.org
nfs_server=nfs.example.org

组嵌套
[apache]
http1.example.org
http2.example.org

[nginx]
ngx1.example.org
ngx2.example.org

#定义一个组名,将刚才定义的两个组名放入,即webservers组包含apache组和nginx组的主机
[webservers]
apache
nginx

二、YAML

YAML:另一种标记语言。是用来写配置文件的语言,非常简洁和强大。
YAML语法和其他语言类似,也可以表达散列表、标量等数据结构。
结构通过空格来展示;序列里配置项通过-来代表;Map里键值用:来分隔;YAML的扩展名为yaml

1.基本语法规则

(1)大小写敏感
(2)使用缩进表示层级关系
(3)缩进时不允许使用Tab键,只允许使用空格。
(4)缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

2.YAML支持的数据结构

对象
键值对的集合,又称为映射(mapping)/哈希(hashes)/字典(dictionary)

举例: name (): Example()

类class:(物品)
  对象1:(桌子)
    属性(名称,长、宽、高等)
    方法(动词,放东西)
    ...
  对象2
  对象3

数组
一组按次序排列的值,又称为序列(sequence)/列表(list)

举例:-Apple
     -Orange

纯量
单个的、不可再分的值

举例:number: 12.30
     sure: true

三、playbook

通过task调用ansible的模板将多个play组织在一个playbook中运行。

1.组成部分

Tasks:任务,即调用模块完成的某操作;原理和事务一样,要么一起执行,要么一起不执行。

Variables:变量;声明变量的三个场景:hosts文件中定义、剧本中定义、在命令中加上-e定义。

Templates:模板;定义模板同一格式,解决每个服务可能因格式不一样而不兼容的问题。

Handlers:处理器,当某条件满足时,触发执行的操作。

Roles:角色;将任务分类执行,彼此之间互不干扰。

举例

cd /opt
vim test1.yaml
---     #yaml文件以---开头,以表明这是一个yaml文件,可省略
- name: first play     #定义一个play的名称,可省略
  gather_facts: false    #设置不进行facts信息收集,这可以加快执行速度,可省略
  hosts: webservers    #指定要执行任务的被管理主机组,如多个主机组用冒号分隔
  remote_user: root    #指定被管理主机上执行任务的用户
  tasks:     #定义任务列表,任务列表中的各任务按次序逐个在hosts中指定的主机上执行
   - name: test connection    #自定义任务名称
     ping:     #使用 module: [options] 格式来定义一个任务
   - name: disable selinux
     command: '/sbin/setenforce 0'    #command模块和shell模块无需使用key=value格式
     ignore_errors: True     #如执行命令的返回值不为0,就会报错,tasks停止,可使用ignore_errors忽略失败的任务
   - name: disable firewalld
     service: name=firewalld state=stopped    #使用 module: options 格式来定义任务,option使用key=value格式
   - name: install httpd
     yum: name=httpd state=latest
   - name: install configuration file for httpd
     copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf    #这里需要一个事先准备好的/opt/httpd.conf文件
     notify: "restart httpd"    #如以上操作后为changed的状态时,会通过notify指定的名称触发对应名称的handlers操作
   - name: start httpd service
     service: enabled=true name=httpd state=started
  handlers:     #handlers中定义的就是任务,此处handlers中的任务使用的是service模块
   - name: restart httpd    #notify和handlers中任务的名称必须一致
     service: name=httpd state=restarted
##Ansible在执行完某个任务之后并不会立即去执行对应的handler,而是在当前play中所有普通任务都执行完后再去执行handler,这样的好处是可以多次触发notify,但最后只执行一次对应的handler,从而避免多次重启。

注:要事先准备好/opt/httpd.conf文件

2.运行playbook

ansible-playbook test1.yaml

#补充参数:
-k(–ask-pass):用来交互输入ssh密码
-K(-ask-become-pass):用来交互输入sudo密码
-u:指定用户

ansible-playbook test1.yaml --syntax-check    #检查yaml文件的语法是否正确
ansible-playbook test1.yaml --list-task       #检查tasks任务
ansible-playbook test1.yaml --list-hosts      #检查生效的主机
ansible-playbook test1.yaml --start-at-task='install httpd'     #指定从某个task开始运行

3.定义、引用变量

vim test2.yaml
---
- name: second play
  hosts: dbservers
  remote_user: root
  vars:                 #定义变量
   - groupname: mysql   #格式为 key: value
   - username: nginx
  tasks:
   - name: create group
     group: name=groupname system=yes gid=306    #使用 key 引用变量的值
   - name: create user
     user: name=username uid=306 group=groupname 
   - name: copy file
     copy: content="ansible_default_ipv4" dest=/opt/vars.txt    #在setup模块中可以获取facts变量信息


ansible-playbook test2.yaml -e "username=nginx"     #在命令行里定义变量

4.指定远程主机sudo切换用户

vim test3.yaml
---
- hosts: dbservers
  remote_user: zz
  become: yes	                 #2.6版本以后的参数,之前是sudo,意思为切换用户运行
  become_user: root              #指定sudo用户为root
执行playbook时:ansible-playbook test3.yml -K <密码>

5.when条件判断

在Ansible中,提供的唯一一个通用的条件判断是when指令,当when指令的值为true时,则该任务执行,否则不执行该任务

when一个比较常见的应用场景是实现跳过某个主机不执行任务或者只有满足条件的主机执行任务

vim test4.yaml
---
- hosts: all
  remote_user: root
  tasks:
   - name: shutdown host 
     command: /sbin/shutdown -r now
     when: ansible_default_ipv4.address == "192.168.19.77"      #when指令中的变量名不需要手动加上 
 
     when: inventory_hostname == "<主机名>"
	
ansible-playbook test4.yaml

6.迭代

Ansible提供了很多种循环结构,一般都命名为with_items,作用等同于 loop 循环。

vim test5.yaml
---
- name: play1
  hosts: dbservers
  gather_facts: false
  tasks: 
    - name: create directories
      file:
        path: "item"
        state: directory
      with_items:          #等同于 loop:
        - /tmp/test1
        - /tmp/test2
    - name: add users
      user: name=item.name state=present groups=item.groups
      with_items:
        - name: test1
          groups: wheel
        - name: test2
          groups: root

      with_items:
        - name:'test1', groups:'wheel'
        - name:'test2', groups:'root'

ansible-playbook test5.yaml

四、Templates 模块

Jinja是基于Python的模板引擎。Template类是Jinja的一个重要组件,可以看作是一个编译过的模板文件,用来产生目标文本,传递Python的变量给模板去替换模板中的标记。

1.先准备一个以 .j2 为后缀的 template 模板文件,设置引用的变量
cp /etc/httpd/conf/httpd.conf /opt/httpd.conf.j2

vim /opt/httpd.conf.j2
Listen http_port				#42行,修改
ServerName server_name			#95行,修改
DocumentRoot "root_dir"          #119行,修改

2.修改主机清单文件,使用主机变量定义一个变量名相同,而值不同的变量
vim /etc/ansible/hosts       
[webservers]
192.168.19.66 http_port=192.168.19.66:80 server_name=www.feng.com:80 root_dir=/etc/httpd/htdocs

[dbservers]
192.168.19.77 http_port=192.168.19.77:80 server_name=www.dian.com:80 root_dir=/etc/httpd/htdocs

3.编写 playbook 
vim apache.yaml
---
- hosts: all
  remote_user: root
  vars:
    - package: httpd
    - service: httpd
  tasks:
    - name: install httpd package
      yum: name=package state=latest
    - name: install configure file
      template: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf     #使用template模板
      notify:
        - restart httpd
    - name: create root dir
	  file: path=/etc/httpd/htdocs state=directory
    - name: start httpd server
      service: name=service enabled=true state=started
  handlers:
    - name: restart httpd
      service: name=service state=restarted

ansible-playbook apache.yaml



注:创建/etc/httpd/htdocs,同时被管理机要挂载。

五、tags 模块

可以在一个playbook中为某个或某些任务定义“标签”,在执行此playbook时通过ansible-playbook命令使用–tags选项能实现仅运行指定的tasks。
playbook还提供了一个特殊的tags为always。作用就是当使用always当tags的task时,无论执行哪一个tags时,定义有always的tags都会执行。

vim webhosts.yaml
---
- hosts: webservers
  remote_user: root
  tasks:
    - name: Copy hosts file
      copy: src=/etc/hosts dest=/opt/hosts
      tags:
        - only     #可自定义
    - name: touch file
      file: path=/opt/testhost state=touch
	  tags:
	    - always    #表示始终要运行的代码

ansible-playbook webhosts.yaml --tags="only"
vim dbhosts.yaml
---
- hosts: dbservers
  remote_user: root
  tasks:
    - name: Copy hosts file
      copy: src=/etc/hosts dest=/opt/hosts
      tags:
        - only
    - name: touch file
      file: path=/opt/testhost state=touch
      tags:
	    - always

ansible-playbook dbhosts.yaml --tags="only"

分别去两台被管理主机上去查看文件创建情况

六、Roles 模块

Ansible为了层次化、结构化地组织Playbook,使用了角色(roles),roles可以根据层次型结构自动

自动化运维管理工具ansible的详细解读之inventory主机清单和playbook剧本(代码片段)

Ansible的详细解读之【inventory主机清单和playbook剧本】一、inventory主机清单1.1主机变量1.2组变量1.3组嵌套二、剧本(playbook)2.1playbook介绍2.2playbooks的组成2.3案例:编写httpd的playbook一、inventory主机清单Inventory支持对主机... 查看详情

ansible的脚本------playbook剧本

@[toc]一、剧本的前置知识点1、主机清单ansible默认的主机清单是/etc/ansible/hosts文件主机清单可以手动设置,也可以通过DynamicInventory动态生成一般主机名使用FQDNvi/etc/ansible/hosts[webserver]#使用方括号设置组名www1.example.org#定义被监控... 查看详情

ansible安装及原理

...个组件:1)Ansible核心2)Inventory主机清单3)Modules模块4)Playbook剧本5)Plugins插件6)连接插件 1.1)ansible提供了两种方式来执行任务。第一,直接用ansible命令。比如:ansiblewebserver-mcommand-a"uptime"webserver表示主机组-m之后是命令... 查看详情

ansible——playbook剧本(代码片段)

...变量①主机变量②组变量③组嵌套2、inventor变量参数二、playbook剧本组成:playbook实例基本命令介绍1、为每个任务定义远程执行用户2、指定远程主机切换用户执行剧本3、tasks忽略错误,强制返回成功4、针对多个主机节点... 查看详情

自动化运维ansible之playbook剧本(持续更新)(代码片段)

...化运维之Ansible概述及Ansible部署Ansible命令应用之常用模块Playbook简介playbook是ansible用于配置,部署,和管理被控节点的剧本。通过playbook的详细描述,执行其中的一系列tasks,可以让远端主机达到预期的状态。playbook就像Ansible控制... 查看详情

Ansible Azure 动态清单和在单个 playbook 中的主机之间共享变量

】AnsibleAzure动态清单和在单个playbook中的主机之间共享变量【英文标题】:AnsibleAzureDynamicInventoryandSharingvariablesbetweenhostsinasingleplaybook【发布时间】:2020-05-2205:27:29【问题描述】:问题:使用通配符从剧本中的另一台主机引用有关... 查看详情

ansible之playbook(代码片段)

文章目录一、Playbook概述(1)Playbook简介(2)Playbook核心元素(3)Playbook语法(4)剧本格式示例(5)Playbook的运行方式二、剧本中的元素属性-主机与用户-tasks任务列表-Handlers动作与Notify触发... 查看详情

Ansible-playbook 针对不在清单文件中并包含组变量的任意主机运行

】Ansible-playbook针对不在清单文件中并包含组变量的任意主机运行【英文标题】:Ansible-playbookrunagainstarbitraryhostwhichisnotininventoryfileandincludegroupvars【发布时间】:2017-06-0419:10:33【问题描述】:当我以这种方式运行剧本runrole.yml时:a... 查看详情

自动化运维工具ansible——playbook剧本详解及简易案例(代码片段)

Playbook-剧本介绍 Playbook是一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活。简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基... 查看详情

ansible-playbook剧本

一、playbookplaybook是剧本的意思通过task调用ansible的模块将多个play组织在一个playbook中运行。playbook本身由以下各部分组成:Tasks:任务,即调用模块完成的某操作Variables:变量Templates:模板Handlers:处理器,当某条件满足时,触发执行... 查看详情

自动化运维-ansible------playbook及实战案例

四、playbook1.简介l playbook是ansible用于配置,部署,和管理被控节点的剧本。l 通过playbook的详细描述,执行其中的一系列tasks,可以让远端主机达到预期的状态。playbook就像Ansible控制器给被控节点列出的的一系列to-do-list,... 查看详情

ansible——ansible的脚本和playbook剧本

playbooks概述Playbook介绍playbook是ansible用于配置,部署,和管理被控节点的剧本。通过playbook的详细描述,执行其中的tasks,可以让远端主机达到预期的状态。playbook是由一个或多个”play”组成的列表。当对一台机器做环境初始化的... 查看详情

ansible基础(代码片段)

...之后不用重读,立马生效。模块相当于ansible的命令,而playbook相当于脚本。ansible的架构组成hostinventory:主机清单playbook:任务剧本coremodules:核心模块commectionplugin:连接插件ansible的执行流程ansible读取playbook中的剧本,剧本中会... 查看详情

ansible的脚本——playbook剧本(代码片段)

Ansible的脚本——playbook剧本一、playbook剧本概述1、playbook介绍2、playbook格式3、playbooks本身由以下各部分组成4、yaml基本语法规则5、yaml支持的数据结构二、示例:1、运行playbook2、定义、引用变量3、指定远程主机sudo切换用户4、when... 查看详情

ansible的脚本——playbook剧本(代码片段)

Ansible的脚本——playbook剧本一、playbook剧本概述1、playbook介绍2、playbook格式3、playbooks本身由以下各部分组成4、yaml基本语法规则5、yaml支持的数据结构二、示例:1、运行playbook2、定义、引用变量3、指定远程主机sudo切换用户4、when... 查看详情

自动化运维ansible之playbook剧本(代码片段)

Playbook介绍Playbook是由一个或多个play组成的列表,主要功能是将task定义好的角色并为一组进行统一管理,也就是通过task调用Ansible的模板将多个play组织在一个Playbook中运行Playbook本身由以下各部分组成:Tasks:任务,调用模块完成... 查看详情

自动化运维管理工具ansible之playbook剧本的详细解读(代码片段)

Ansible的脚本---playbook剧本一、playbooks的组成1.1playbooks本身由以下各部分组成1.2playbooks的简答示例二、定义、引用变量三、when条件判断四、Templates模块一、playbooks的组成1.1playbooks本身由以下各部分组成(1)Tasks:任务&#... 查看详情

运维自动化之ansible--(playbook模式)

运维自动化之ansible--(playbook模式) 一、Ansible Playbook简介  playbook是ansible用于配置,部署,和管理被控节点的剧本。   通过playbook的详细描述,执行其中的一系列tasks,可以让远端主机达到预期的状态。play... 查看详情