ansible 基本使用知识小结

自动化运维工具Ansible

Ansible是一款强大的配置管理工具,目的是帮助系统管理员高效率地管理成百上千台主机。设想一个主机是一个士兵,那么有了Ansible,作为系统管理员的你就是一个将领,你可以通过口头命令,即以一次下发一条命令(ansible ad-hoc模式)的方式使一个或多个甚至全部的士兵按你的指令行事,也可以将多条命令写在纸上(ansible playbook模式),让士兵按照你写好的指令执行。你可以让多个士兵同时做相同或不同的事情,也可以方便地让新加入的士兵快速加入已有的兵种队伍,还可以快速改变兵种(配置管理),一句话,士兵都严格听你的,你只要做好命令的设计,Ansible就会自动帮你发布和执行。我们只需要在一台机器(类UNIX系统)上安装Ansible,即可在这台机器上管理其他主机,Ansible使用SSH协议与被管理的主机通信,只要SSH能连接这些主机,Ansible便可以控制它们,被管理的主机不需要安装Ansible。Ansible也支持Windows。

1、Ansible的安装非常简单,有以下几种方法。

(1)使用pip安装。pip是Python的包管理工具,使用起来非常方便,只要操作系统安装有pip,直接pip install包名即可。安装Ansible的方法如下:
在这里插入图片描述

(2)使用apt-get安装。在基于Debian/Ubuntu Linux的系统中使用apt-get安装Ansible。
在这里插入图片描述

(3)使用yum安装。在基于RHEL/CentOS Linux的系统中使用yum安装Ansible。
在这里插入图片描述

(4)使用源代码安装。可以从Github上安装最新版本。
在这里插入图片描述

2、Ansible配置

获取最新配置文件
如果使用程序包管理器安装ansible,最新的 ansible.cfg 配置文件有可能出现在 /etc/ansible 下并且命名为 ”.rpmnew”, 也可能根据不同的更新命名为其它名称
如果你是通过 pip 或者其他方式安装,则可能需要自行创建这个文件,以免原配置文件被覆盖.Ansible 的默认设置将会将其覆盖
配置文件的详细参数以及取值范围请查看`ansible.cfg https://raw.github.com/ansible/ansible/devel/examples/ansible.cfg
下载下来的配置文件:看附件

Ansible的配置文件有多个位置,查找顺序如下:
在这里插入图片描述

在大多数场景下默认的配置就能满足大多数用户的需求。在一些特殊场景下,用户还需要自行修改这些配置文件,安装后如果没有在上述三个位置找到配置文件,那么在HOME目录新建一个.ansible.cfg文件即可。
Ansible常见的配置参数如下。

inventory = ~/ansible_hosts:表示主机清单inventory文件的位置。
forks = 5:并发连接数,默认为5。
sudo_user = root:设置默认执行命令的用户。
remote_port = 22:指定连接被管节点的管理端口,默认为22端口。建议修改,能够更加安全。
host_key_checking = False:设置是否检查SSH主机的密钥,值为True/False。关闭后第一次连接不会提示配置实例。
timeout = 60:设置SSH连接的超时时间,单位为秒。
log_path = /var/log/ansible.log:指定一个存储Ansible日志的文件(默认不记录日志)。

3、inventory文件

Ansible 可同时操作属于一个组的多台主机,组和主机之间的关系通过 inventory 文件配置. 默认的文件路径为 /etc/ansible/hosts
除默认文件外,你还可以同时使用多个 inventory 文件(后面会讲到),也可以从动态源,或云上拉取 inventory 配置信息.详见 官方文档
一个简单的inventory文件示例如下。
在这里插入图片描述

以下是对主机进行分组,/etc/ansible/hosts 文件的格式与windows的ini配置文件类似:
在这里插入图片描述
也可以使用YMAL格式的主机文件:

all:
  hosts:
    192.168.124.17
  children:
    webservers:
      hosts:
        192.168.124.16

其中方括号[]中是组名,用于对系统进行分类,便于对不同系统进行个别的管理。一个系统可以属于不同的组,比如一台服务器可以同时属于webserver组和dbserver组。这时属于两个组的变量都可以为这台主机所用。
如果有主机的SSH端口不是标准的22端口,可在主机名之后加上端口号,用冒号分隔.SSH 配置文件中列出的端口号不会在 paramiko 连接中使用,会在 openssh 连接中使用.
端口号不是默认设置时,可明确的表示为:
badwolf.example.com:5309
假设你有一些静态IP地址,希望设置一些别名,但不是在系统的 host 文件中设置,又或者你是通过隧道在连接,那么可以设置如下:

jumper ansible_ssh_port=5555 ansible_ssh_host=192.168.1.50

在这个例子中,通过 “jumper” 别名,会连接 192.168.1.50:5555.记住,这是通过 inventory 文件的特性功能设置的变量. 一般而言,这不是设置变量(描述你的系统策略的变量)的最好方式.后面会说到这个问题.

对于每一个 host,你还可以选择连接类型和连接用户名:

[targets]

localhost              ansible_connection=local

other1.example.com     ansible_connection=ssh        ansible_ssh_user=mpdehaan

other2.example.com     ansible_connection=ssh        ansible_ssh_user=mdehaan

主机变量前面已经提到过,分配变量给主机很容易做到,这些变量定义后可在 playbooks 中使用:

[atlanta]

host1 http_port=80 maxRequestsPerChild=808

host2 http_port=303 maxRequestsPerChild=909

组变量,也可以定义属于整个组的变量:

[atlanta]

host1

host2

[atlanta:vars]

ntp_server=ntp.atlanta.example.com

proxy=proxy.atlanta.example.com

可以把一个组作为另一个组的子成员,以及分配变量给整个组使用. 这些变量可以给 /usr/bin/ansible-playbook 使用,但不能给 /usr/bin/ansible 使用:

[atlanta]

host1

host2

[raleigh]

host2

host3

[southeast:children]

atlanta

raleigh

[southeast:vars]

some_server=foo.southeast.example.com

halon_system_timeout=30

self_destruct_countdown=60

escape_pods=2

[usa:children]

southeast

northeast

southwest

northwest
  • 分文件定义 Host 和 Group 变量

在 inventory 主文件中保存所有的变量并不是最佳的方式.还可以保存在独立的文件中,这些独立文件与 inventory 文件保持关联. 不同于 inventory 文件(INI 格式),这些独立文件的格式为 YAML.详见 YAML 语法 .
假设 inventory 文件的路径为:

/etc/ansible/hosts

假设有一个主机名为 ‘foosball’, 主机同时属于两个组,一个是 ‘raleigh’, 另一个是 ‘webservers’. 那么以下配置文件(YAML 格式)中的变量可以为 ‘foosball’ 主机所用.依次为 ‘raleigh’ 的组变量,’webservers’ 的组变量,’foosball’ 的主机变量:

/etc/ansible/group_vars/raleigh

/etc/ansible/group_vars/webservers

/etc/ansible/host_vars/foosball

举例来说,假设你有一些主机,属于不同的数据中心,并依次进行划分.每一个数据中心使用一些不同的服务器.比如 ntp 服务器, database 服务器等等. 那么 ‘raleigh’ 这个组的组变量定义在文件 ‘/etc/ansible/group_vars/raleigh’ 之中,可能类似这样:

ntp_server: acme.example.org

database_server: storage.example.org

这些定义变量的文件不是一定要存在,因为这是可选的特性.
还有更进一步的运用,你可以为一个主机,或一个组,创建一个目录,目录名就是主机名或组名.目录中的可以创建多个文件, 文件中的变量都会被读取为主机或组的变量.如下 ‘raleigh’ 组对应于 /etc/ansible/group_vars/raleigh/ 目录,其下有两个文件 db_settings 和 cluster_settings, 其中分别设置不同的变量:

/etc/ansible/group_vars/raleigh/db_settings

/etc/ansible/group_vars/raleigh/cluster_settings

‘raleigh’ 组下的所有主机,都可以使用 ‘raleigh’ 组的变量.当变量变得太多时,分文件定义变量更方便我们进行管理和组织。

  • Inventory 参数的说明

如同前面提到的,通过设置下面的参数,可以控制 ansible 与远程主机的交互方式,其中一些我们已经讲到过:
ansible_ssh_host
将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置.

ansible_ssh_port
ssh端口号.如果不是默认的端口号,通过此变量设置.

ansible_ssh_user
默认的 ssh 用户名

ansible_ssh_pass
ssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥)

ansible_sudo_pass
sudo 密码(这种方式并不安全,我们强烈建议使用 --ask-sudo-pass)

ansible_sudo_exe (new in version 1.8)
sudo 命令路径(适用于1.8及以上版本)

ansible_connection
与主机的连接类型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默认使用 paramiko.1.2 以后默认使用 ‘smart’,‘smart’ 方式会根据是否支持 ControlPersist, 来判断’ssh’ 方式是否可行.

ansible_ssh_private_key_file
ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况.

ansible_shell_type
目标系统的shell类型.默认情况下,命令的执行使用 ‘sh’ 语法,可设置为 ‘csh’ 或 ‘fish’.

ansible_python_interpreter
目标主机的 python 路径适用的情况: 系统中有多个 Python, 或者命令路径不是"/usr/bin/python",比如 *BSD, 或者 /usr/bin/python 不是 2.X 版本的 Python.我们不使用 “/usr/bin/env” 机制,因为这要求远程用户的路径设置正确,且要求 “python” 可执行程序名不可为 python以外的名字(实际有可能名为python26)与 ansible_python_interpreter 的工作方式相同,可设定如 ruby 或 perl 的路径
一个主机文件的例子:

some_host         ansible_ssh_port=2222     ansible_ssh_user=manager

aws_host          ansible_ssh_private_key_file=/home/example/.ssh/aws.pem

freebsd_host      ansible_python_interpreter=/usr/local/bin/python

ruby_module_host  ansible_ruby_interpreter=/usr/bin/ruby.1.9.3

4、ansible ad-hoc模式

ansible命令语法格式如下:
在这里插入图片描述
根据语法格式信息可知,应用ansible命令批量管理主要涉及如下6个部分:
1)第一部分表示ansible批量管理命令。
2)第二部分表示指定要管理的主机信息,可以是主机组名称、主机IP地址,或者是all(表示所有主机)。
3)第三部分表示调用相应Ansible模块参数(-m)。
4)第四部分表示指定应用Ansible软件什么功能模块,即指定功能模块名称。
5)第五部分表示调用相应模块功能参数(-a)。
6)第六部分表示指定应用相应模块功能中的哪些功能,有标准参数定义。

ansible命令常用的参数信息。
在这里插入图片描述
使用ansible-doc命令
1)列出所有Ansible支持的模块,这里的模块就相当于Linux命令行的命令一样
在这烦烦烦里插入图这样输出的信息很片描述2)查看2)某个模块具体的帮助参数,这里的帮助参数就相当于Linux命令对应的参数一样。
在这里插入图片描述
执行ansible 命令需要使用密码,多次使用密码执行命令过于麻烦,Ansible使用SSH协议登录远程主机。下面我们使用Ansible将localhost的公钥复制到远程主机的authorized_keys,也就是授信,这样省去输入密码的步骤。这里我们使用Ansible内置

的SSH密钥管理模块authorized_key来执行批量SSH授信的任务。如果远程主机的密码不相同,则需要执行多次命令,每次执行命令时都需要输入不同的密码,Ansible将对正确密码的主机进行SSH授信。

如果以上输入命令均正确但仍有主机不成功时,那么请检查对应主机authorized_keys文件只允许所属用户的读写权限,对应的数字是600;如果权限不正确,可通过在终端执行“chmod 600authorized_keys”来确保正确的访问权限。具体操作如下:

[root@m01 ansible]# ansible all -m authorized_key -a "user=root key='{{ lookup('file','/root/.ssh/id_rsa.pub')}}' path=/root/.ssh/antuorized_keys manage_dir=yes" --ask-pass 

如果密码不同,则需要将密码定义到/etc/ansible/hosts中)

[xxx@xxx ~]# cat /etc/ansible/hosts
[test]
 192.168.3.99 ansible_connection=ssh ansible_ssh_user=xxx ansible_ssh_pass="xxxxxx"
 192.168.3.117 ansible_connection=ssh ansible_ssh_user=xxx ansible_ssh_pass="xxxxxx"


#user=root :将密钥推送到远程主机的哪个用户下

#key=’{{ lookup(‘file’, ‘/root/.ssh/id_rsa.pub’)}}’ :指定要推送的密钥文件所在的路径

#path=’/root/.ssh/authorized_keys’ [Default: (homedir)+/.ssh/authorized_keys] :将密钥推送到远程主机的哪个目录下并重命名

#manage_dir=no :指定模块是否应该管理 authorized key 文件所在的目录。如果设置为 yes,模块会创建目录,以及设置一个已存在目录的拥有者和权限。如果通过 path 选项,重新指定了一个 authorized key 文件所在目录,那么应该将该选项设置为 no

#exclusive [default: no]: 是否移除 authorized_keys 文件中其它非指定 key

#state (Choices: present, absent) [Default: present]: present 添加指定 key 到 authorized_keys 文件中;absent 从 authorized_keys 文件中移除指定 key

或者只把公钥添加到默认指定的 [Default: (homedir)+/.ssh/authorized_keys] 文件

[root@m01 ansible]# ansible all -m authorized_key -a "user=root key='{{ lookup('file','/root/.ssh/id_rsa.pub') }}' state=present" --ask-pass

有可能每台机器登录的用户名都不一样,这里指定每台机器连接的SSH登录用户名,在执行Ansible命令时就不需要再指定用户名。如果不指定用户名,Ansible就会尝试使用本机已登录的用户名登录远程主机。

在运行一个不熟悉的命令前,建议先查看命令的帮助信息。查看帮助信息的指令是“命令+参数”,这里的参数一般是-h、-help、–help等,或者使用“man指令”的命令格式。使用ansible命令的帮助:
在这里插入图片描述
ansible的任何参数所代表的含义都可以通过ansible -h查看。

下面是使用ansibles命令的一些例子

使用ansible命令,首先列出配置过的主机列表。

在这里插入图片描述
ping所有主机。
在这里插入图片描述
命令被成功执行,在一些机器上会需要安装sshpass或指定参数-c paramiko。从运行结果可以看出,都是ping通的,返回结果为"pong",changed是false表示未改变远程主机任何文件。

Ansible的模块有ping、authorized_key、copy、shell等。如果想知道这些模块的详细说明,只需要执行ansible-doc模块名即可。
在这里插入图片描述

  • ansible命令和脚本类型模详解

  • command模块功能说明

功能说明:在远程节点上执行一个命令(用于执行一个命令)。
在这里插入图片描述
管理实践:利用command模块实现批量管理。
结果
其中uptime 可以换为任意的系统命令,注意不能带管道及重定向符号
如果要使用< > | & 等符号,应使用shell模块

  • shell模块功能说明

功能说明:在远程节点上执行命令(可以是多个命令)。
核心参数
实践:批量执行ps -ef|grep sshd|grep -v grep命令
在这里插入图片描述
shell模块也可以执行远程shell脚本,注意:脚本必须事先存在本地节点和远程主机上,并且授权为执行权限

  • script模块功能说明

功能说明:把本地脚本传输到远程节点上并运行脚本。和shell模块比,script模块更强大,本地有一份脚本就可以在所有机器上执行。
核心参数
在这里插入图片描述
说明:利用script模块实现批量执行远程主机脚本时,脚本不用在远程主机上存在并授权

  • copy模块功能说明

功能说明:复制文件到远程主机。
常用参数
例如:将一个文本文件上传至远程主机的用户home目录中,上传之前先查看远程主机上用户home目录上的文件。
在这里插入图片描述
文件已经传输至另外两台主机,如果远程目标主机中有同名文件,默认不会被覆盖,因此changed是false。
说明:copy模块为数据推送模块,可以见数据图送到远程节点中,并且可以对文件属性权限修改
例如:远程批量复制文件前进行备份,并写入指定内容到文件
在这里插入图片描述

  • file模块功能说明

功能说明:创建及设置文件(目录)属性。
在这里插入图片描述
例如:创建数据文件(普通文件、目录、软链接文件)
在这里插入图片描述

  • yum模块功能说明

功能说明:yum包管理模块。
在这里插入图片描述
Ansible yum模块背后的原理:/usr/bin/python /usr/bin/yum -yinstall nmap。

  • service/systemd模块功能

说明功能说明:yum包管理模块。
特别说明:Service服务管理用于CentOS6及以前系统,而systemd命令应用于Centos7系统。
在这里插入图片描述
例如:管理crond定时任务service/systemd模块管理crond定时任务服务(重启、停止、开启)。
一部分显示

  • cron模块功能说明

功能说明:管理定时任务条目信息模块。
在这里插入图片描述
编写定时任务利用ansible软件,其实和直接编写定时任务文件的思路是一样的,只不过有些参数信息发生了变化
在这里插入图片描述

  • mount模块功能说明

功能说明:挂载及卸载文件系统(本地或者远程)
在这里插入图片描述
例如:ansible all -m mount -a “src=192.168.124.32:/data path=/mnt fstype=nfs opts=defaults state=mounted”

  • user模块功能说明

功能说明:管理系统用户。
在这里插入图片描述

  • group模块功能说明

功能说明:管理系统用户
在这里插入图片描述
书上看到的建议:学习Ansible太多的模块是一个低效学习行为,不建议读者耗费过多精力在Ansible模块掌握上,关键是这个Ansible模块不通用,掌握Linux命令和Shell就可以通用。对于企业场景,只要读者掌握了command、shell、script、copy等少数模块就够用了,剩下的批量管理操作,可以使用Linux命令和Shell脚本来替代。

5、Ansible Playbooks模式

Playbooks是Ansible的配置、部署、编排的语言。它们可以被描述为一个需要希望远程主机执行命令的方案,或者一组IT程序运行的命令集合。如果Ansible模块是工作室中的工具,那么Playbooks就是设置的方案计划。

ansible-playbook命令需要一个plauybook.yml的文件名作为参数,首先了解以下YAML语法

  • YAML 语法

这个页面提供一个正确的 YAML 语法的基本概述, 它被用来描述一个 playbooks(我们的配置管理语言).
我们使用 YAML 是因为它像 XML 或 JSON 是一种利于人们读写的数据格式. 此外在大多数变成语言中有使用 YAML 的库,你可能希望读 Playbooks 实践中如何使用的。
基本的 YAML:对于 Ansible, 每一个 YAML 文件都是从一个列表开始. 列表中的每一项都是一个键值对, 通常它们被称为一个 “哈希” 或 “字典”. 所以, 我们需要知道如何在 YAML 中编写列表和字典.
YAML 还有一个小的怪癖. 所有的 YAML 文件(无论和 Ansible 有没有关系)开始行都应该是 —. 这是 YAML 格式的一部分, 表明一个文件的开始.
列表中的所有成员都开始于相同的缩进级别, 并且使用一个 "- " 作为开头(一个横杠和一个空格):

---
#一个美味水果的列表
	-
	- Apple
	-
	- Orange
	-
	- Strawberry
	- 
	- Mango

一个字典是由一个简单的 键: 值 的形式组成(这个冒号后面必须是一个空格):

---
# 一位职工的记录

name: Example Developer

job: Developer

skill: Elite

字典也可以使用缩进形式来表示, 如果你喜欢这样的话:

---
#
# 一位职工的记录
{
{name: Example Developer, job: Developer, skill: Elite}

Ansible并不是太多的使用这种格式, 但是你可以通过以下格式来指定一个布尔值(true/fase):

---

create_key: yes

needs_agent: no

knows_oop: True

likes_emacs: TRUE

uses_cvs: false

让我们把目前所学到的 YAML 例子组合在一起. 这些在 Ansible 中什么也干不了, 但这些格式将会给你感觉:

---
# 一位职工记录

name: Example Developer

job: Developer

skill: Elite

employed: True

foods:
 
    - Apple
 
    - Orange
 
    - Strawberry
 
    - Mango

languages:
 
    ruby: Elite
 
    python: Elite
 
    dotnet: Lame

这就是你开始编写 Ansible playbooks 所需要知道的所有 YAML 语法.

尽管 YAML 通常是友好的, 但是下面将会导致一个 YAML 语法错误: foo: somebody said I should put a colon here: so I did 你需要使用引号来包裹任何包含冒号的值, 像这样: foo: “somebody said I should put a colon here: so I did” 然后这个冒号将会被结尾.此外, Ansible 使用 “{{ var }}” 来引用变量. 如果一个值以 “{” 开头, YAML 将认为它是一个字典, 所以我们必须引用它, 像这样: foo: “{{ variable }}”

写一个简单的playbook,文件名为myplaybook.yml。
在这里插入图片描述
上述YAMLl文件分别定义了对master组的主机执行了一个task,即最远程主机输入date命令,注意缩进格式。
在这里插入图片描述
执行playbook时检查剧本语法是否正确:
在这里插入图片描述
测试执行playbook时只是模拟执行,不会影响主机的配置:
在这里插入图片描述
当有许多任务要执行时,可以指定并发进程数。
在这里插入图片描述

  • playbook编写语法规范

    (1)注意剧本编写缩进规范
    在编写剧本时,需要注意不同行信息之间有时需要有缩进关系,一般将两个空格作为一个缩进。
    在这里插入图片描述
    (2)主机剧本编写字典规范
    在编写剧本时,有时需要定义变量信息或设置模块参数的配置信息,可以采用字典格式进行设置,字典配置信息格式为:
    在这里插入图片描述
    (3)主机剧本编写列表规范
    在编写剧本时,剧本中定义的有些信息可能会重复出现,并且缩进关系一致,以及它们表达的意思也比较相近,这样不同行的信息就构成了列表,列表信息格式为:
    在这里插入图片描述
    这里有一个 playbook,其中仅包含一个 play:

    ---
    - hosts: webservers
      vars:
        http_port: 80
        max_clients: 200
      remote_user: root
      tasks:
      - name: ensure apache is at the latest version
        yum: pkg=httpd state=latest
      - name: write the apache config file
        template: src=/srv/httpd.j2 dest=/etc/httpd.conf
        notify:
        - restart apache
      - name: ensure apache is running
        service: name=httpd state=started
      handlers:
        - name: restart apache
          service: name=httpd state=restarted
    
  • playbook执行方式

    在Ansible程序中,加载使用模块信息时,可以使用Ansible命令,加载执行剧本文件时,可以使用ansible-playbook命令。

    [root@ansible ~]# ansible-playbook myplaybook.yml 
    说明:可以使用相对路径加载剧本文件,也可以使用绝对路径加载剧本文件
    

    查看剧本执行时输出的详细信息:

    [root@ansible ~]# ansible-playbook myplaybook.yml --verbose
    
    

    查看剧本执行时会影响哪些主机信息:

    [root@ansible ~]# ansible-playbook myplaybook.yml --list-hosts
    
    playbook: myplaybook.yml
    
      play #1 (test): test	TAGS: []
        pattern: ['test']
        hosts (1):
          192.168.124.31
    

    执行playbook时检查剧本语法是否正确:

    [root@ansible ~]# ansible-playbook myplaybook.yml --syntax-check
    
    playbook: myplaybook.yml
    [root@ansible ~]# 
    
    

    执行playbook时只是模拟执行,不会影响主机的配置:

    [root@ansible ~]# ansible-playbook script_test.yml -C
    
    PLAY [all] *******************************************************************************************************************************************
    
    TASK [Gathering Facts] *******************************************************************************************************************************
    ok: [192.168.124.48]
    
    TASK [Run a script get system informetion] ***********************************************************************************************************
    changed: [192.168.124.48]
    
    PLAY RECAP *******************************************************************************************************************************************
    192.168.124.48             : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    
  • playbook的输出

    剧本在执行过程中,会产生相应输出,根据输出的信息可以掌握剧本是否完整执行、每个执行过程是否正确,以及根据输出的错误提示信息,可以排查剧本编写中的逻辑问题。剧本在执行时,任务中的每个Action会调用一个模块,然后在模块中检查当前系统状态并决定是否需要重新执行。
    ❑ 如果本地执行了,那么Action会得到返回值changed。
    ❑ 如果不需要执行,那么Action会得到返回值ok。
    ansible-playbook还可以实现Handlers等多种功能,当在发生改变时执行相应的操作,最佳的应用场景是用来重启服务,或者触发系统重启操作。配置的YAML文件支持Ansible-Pull进行拉取配置等。
    剧本执行过程输出的信息
    在这里插入图片描述

  • playbook扩展配置

    1. playbook设置变量功能
      在剧本中可以通过设置变量信息,实现相应参数的配置功能,在某些场景下,可以简化对剧本的修改调整。在playbook中,常用的几种变量设置方法如下:
      1)在playbook中用户自定义的变量。
      2)用户无须定义,Ansible会在执行playbook之前去管理主机上搜集关于远程主机系统的信息的变量。
      3)在文件模板中,可以直接使用上述两种变量。
      4)把任务的运行结果作为一个变量来使用,这个叫作注册变量。
      5)为了使playbook更灵活,通用性更强,允许用户在执行playbook时传入变量的值,这个时候就需要用到额外变量。
      (1)在playbook中用户自定义的变量
      用户可以在playbook中,通过vars关键字自定义变量,之后再用{{}}调用即可。
      ❑ playbook中定义和使用变量的方法
      例子:用户定义变量为http_port,其值为80。在tasks下的firewalld中,可通过{{ http_port }}调用该变量。
      在这里插入图片描述
      ❑ 将变量配置在单独文件中
      当变量较多的时候,或者变量需要在多个playbook中重用的时候,可以把变量放到一个单独的文件中,之后通过关键字“var_files”可将该变量引用到playbook中。使用变量的方法和在文件中定义变量的方法相同:
      在这里插入图片描述
      变量文件/vars/server_vars.yml的内容为:
      http_port: 80
      
      ❑ 定义和使用复杂的变量
      在某些场景中需要使用的变量的值不是简单的字符串或者数字,而是一个对象。对象的定义语法如下,格式为YAML的字典格式:
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      (2)远程主机的系统变量(Facts)
      Ansible会通过模块“setup”来搜集主机的系统信息,这些搜集到的系统信息称为Facts。每个playbook在执行前都会默认执行setup模块,所以这些Facts信息可以直接以变量的形式使用。
      可以通过在命令行中调用setup模块命令,查看所有可以调用的Facts变量信息:
      [root@ansible ~]# ansible all -m setup -u root
      
      
      在剧本中调用收集到的Facts变量信息:
      在这里插入图片描述
      ❑ 使用复杂的Facts变量
      一般在系统中搜集到如下信息时,复杂的、多层级的Facts变量是如何进行调取
      可以通过下面的两种方式访问复杂变量中的子属性:
      ❑ 点号调用和中括号调用
      在这里插入图片描述
      在这里插入图片描述
      ❑ 关闭Facts
      搜集Facts信息会消耗额外的时间,如果不需要Facts信息,则可以在playbook中,通过关键字gather_facts来控制是否搜集远程系统的信息。如果不搜集系统信息,那么上面的Facts变量就不能在该playbook中使用了:
      在这里插入图片描述
      常用的Facts变量信息
      在这里插入图片描述
      (3)文件模板中使用的变量
      ❑ template中变量的定义
      在playbook中定义的变量,可以直接在template中使用,同时Facts变量可以直接在template中使用,当然在Inventory中定义的Hosts和Group变量也是如此。所有在playbook中可以访问的变量,都可以在template文件中使用。
      在这里插入图片描述
      **❑ template中变量的使用
      Ansible模板文件中使用变量的代码是基于Python的template语言Jinja2的。初学者不需要对Jinja2语言有太多的了解,只需要知道{{}}是用来引用变量的就可以了。在上面的剧本举例中,index.html.j2模板文件直接使用了以下变量信息:系统定义变量:{{ ansible_hostname }} {{ ansible_default_ipv4.address }}用户定义变量:{{ defined_name }}index.html.j2文件的内容如下:**这里还不理解
      在这里插入图片描述
      (4)运行结果注册变量
      把任务的执行结果当作一个变量的值也是可以的。这个时候就需要用到“注册变量”,即把执行结果注册到一个变量中,待后面的任务使用。把执行结果注册到变量中的关键字是register,使用方法如下:
      在这里插入图片描述
      注册变量经常和debug模块一起使用,这样可以得到更多的关于执行错误的信息,以帮助用户调试剧本内容。
      (5)用命令行传递变量信息
      为了使playbook更灵活,通用性更强,允许用户在执行的时候传入指定变量的值,此时就需要用到“额外变量”。
      ❑ 定义命令变量
      在oldboy.yml文件中,hosts和user都定义为变量,它们需要从命令行传递变量值。如果在命令行中不传入值,那么执行playbook是会报错的:
      在这里插入图片描述
      也可以直接在playbook中定义变量信息。例如下面的剧本,如果在命令行中传入新的值,那么会覆盖playbook中的值,未在命令行中的传入值也不会报错:
      在这里插入图片描述
      ❑ 使用命令行变量
      命令行里面传入变量的方法如下:
      在这里插入图片描述
      还可以用JSON格式传递参数:
      在这里插入图片描述
  • playbook逻辑控制语句

    在playbook中也可以设置一些逻辑控制语句(类似于Shell脚本中的逻辑语句信息),使剧本配置方式更加灵活多样,在剧本中常用的逻辑语句的参数如下:
    ❑ when:条件判断语句,类似编程语言中的if。
    ❑ loop:循环语句,类似编程语言中while。
    ❑ block:把几个任务组成一个代码块,以便针对一组操作的异常进行处理。
    (1)条件判断语句when
    ❑ when的基本用法
    例如:若远程主机为Debian Linux系统,则立刻关闭主机系统:
    在这里插入图片描述
    进行判断的方式有多种:
    1)简单方式:在这里插入图片描述
    2)取反方式:在这里插入图片描述
    3)多个条件:
    在这里插入图片描述
    (2)逻辑循环语句loop
    为了保持简洁,重复的任务可以用以下简写方式:
    在这里插入图片描述
    如果在变量文件中或者“vars”区域定义了一组列表变量somelist,也可以进行如下配置:
    在这里插入图片描述
    “with_items”用于迭代的list类型变量,不仅支持简单的字符串列表,也可以支持哈希列表,那么可以用以下方式来引用子项:
    在这里插入图片描述
    注意:如果同时使用when和with_items,那么when声明会针对每个条目单独判断一次。
    ❑ 嵌套循环循环也可以嵌套,用[]访问内层和外层的循环:
    在这里插入图片描述
    或者用点号(.)访问内存和外层的变量。

  • 标题playbook调试功能配置

    (1)剧本执行错误忽略功能
    加入一些调试功能,以便在剧本执行报错时进行调试修改,常用的调试功能有以下几种:
    ❑ ignore_errors:忽略剧本执行过程中的错误信息。
    ❑ tags:给剧本打标签。
    在执行剧本时,由于Ansible具有串行执行特性,在引入剧本执行错误忽略功能后,可以先忽略有些可能有错误的任务,确保剧本中的其他任务执行完毕,之后再研究出现错误的任务。
    实现忽略错误的剧本信息为:在这里插入图片描述
    (2)剧本标签功能
    在进行测试时,某一个任务很有可能出现问题,从而需要对剧本进行调试,而剧本调试完毕后,重新测试时,又会反复执行已经成功执行的任务,影响剧本的调试效率。实际上,可以利用剧本标签功能只执行某个剧本任务。添加标签功能的剧本信息如下:
    在这里插入图片描述
    以上剧本包含了两个任务信息,分别对它们做了标记,可以利用Ansible执行剧本的命令参数,以进行如下操作。执行指定标签任务的命令:
    在这里插入图片描述
    跳过指定标签任务的命令:
    在这里插入图片描述

  • playbook触发功能

    (1)什么是剧本触发功能(handlers)
    handlers里面的每一个触发器信息都是对模块的一次调用。而handlers与任务不同,任务会默认地按照定义顺序执行,而handlers则不会,它需要在任务中调用,才有可能得到执行。
    任务表中的任务都是有状态的:changed或者ok。在Ansible中,只有在任务的执行状态为changed时,才会执行该任务调用的handler。
    (2)剧本触发功能应用场景
    如果在任务中修改了Apache的配置文件,那么需要重启Apache。如果还安装了Apache的插件,那么还需要重启Apache。像这样的应用场景,重启Apache就可以设计成一个handler。
    一个handler最多只执行一次,并且是在所有的任务都执行完之后再执行。如果有多个任务调用(notify)同一个handler,那么只执行一次。
    在这里插入图片描述
    只有是changed状态的任务才会触发handler的执行。
    (3)按定义的顺序执行触发功能

  • playbook整合

    有时会实现自动化批量管理,需要执行多个剧本,这时可以将需要执行的多个剧本的信息进行整合,省去利用ansible-playbook命令逐个加载执行剧本的低效工作。实现剧本整合的方式常见的有两种。
    1.只定义单个剧本任务信息
    在整合多个剧本信息时,可以只在每个剧本中定义具体的任务信息,而无须定义hosts管理的主机信息,在汇总剧本中灵活调用整合多个剧本,并定义需要执行任务的hosts主机信息,具体的剧本配置信息如下:
    在这里插入图片描述
    2.直接将编写好的剧本进行整合
    在整合剧本信息时,比较简单的方式就是找到相应剧本,直接利用import_playbook参数进行整合,在执行时会按照整合加载的顺序,执行每一个剧本,具体剧本配置信息如下:
    在这里插入图片描述

6、Role 目录结构

Ansible角色具有定义的目录结构,其中包含七个主要的标准目录。每个角色中必须至少包含这些目录之一。您可以忽略该角色不使用的任何目录。例如:

# playbooks
site.yml
webservers.yml
fooservers.yml
roles/
    common/
        tasks/
        handlers/
        library/
        files/
        templates/
        vars/
        defaults/
        meta/
    webservers/
        tasks/
        defaults/
        meta/

默认情况下,Ansible会在角色中的每个目录中main.yml查找相关内容(也为main.yaml和main)的文件:

tasks/main.yml -角色执行的主要任务列表。

handlers/main.yml -处理程序,可以在此角色之内或之外使用。

library/my_module.py-模块,可以在该角色中使用(有关更多信息,请参见在角色中嵌入模块和插件)。

defaults/main.yml-角色的默认变量(有关更多信息,请参见使用变量)。这些变量在所有可用变量中具有最低的优先级,并且很容易被其他任何变量(包括清单变量)覆盖。

vars/main.yml-角色的其他变量(有关更多信息,请参见使用变量)。

files/main.yml -角色部署的文件。

templates/main.yml -角色部署的模板。

meta/main.yml -角色的元数据,包括角色依赖性。

  • 存储和查找角色

默认情况下,Ansible在两个位置查找角色:

roles/相对于剧本文件位于名为的目录中

在 /etc/ansible/roles

如果将角色存储在其他位置,请设置role_path配置选项,以便Ansible可以找到您的角色。将共享角色检入单个位置可以使它们更容易在多个剧本中使用。有关在ansible.cfg中管理设置的详细信息,请参见配置Ansible。

或者,您可以使用完全限定的路径来调用角色:

---
- hosts: webservers
  roles:
    - role: '/path/to/my/roles/common'

使用角色
您可以通过三种方式使用角色:

在播放级别具有以下roles选项:这是在播放中使用角色的经典方法。

在任务级别上使用include_role:您可以在tasks剧本部分的任何地方动态地重用角色include_role。

在任务级别上使用import_role:您可以在tasks剧本部分的任何地方静态地重用角色import_role。

在游戏级别使用角色
使用角色的经典(原始)方法是roles给定播放的选项:

---
- hosts: webservers
  roles:
    - common
    - webservers

roles在播放级别使用该选项时,对于每个角色“ x”:

如果存在role / x / tasks / main.yml,则Ansible将该文件中的任务添加到播放中。

如果存在role / x / handlers / main.yml,则Ansible将该文件中的处理程序添加到播放中。

如果存在role / x / vars / main.yml,则Ansible将该文件中的变量添加到播放中。

如果存在role / x / defaults / main.yml,则Ansible将该文件中的变量添加到播放中。

如果存在role / x / meta / main.yml,则Ansible将该文件中的所有角色依赖项添加到角色列表中。

(在角色中)任何副本,脚本,模板或包含任务都可以引用role / x / {文件,模板,任务} /(目录取决于任务)中的文件,而不必相对或绝对地对其进行路径设置。

当您roles在播放级别使用该选项时,Ansible会将角色视为静态导入,并在剧本解析过程中对其进行处理。Ansible按以下顺序执行您的剧本:

pre_tasks戏剧中定义的任何内容。

由pre_tasks触发的任何处理程序。

中的每个角色roles:,按列出的顺序列出。meta/main.yml首先运行角色中定义的任何角色依赖关系,但要遵循标签过滤和条件。有关更多详细信息,请参见使用角色依赖性。

tasks戏剧中定义的任何内容。

由角色或任务触发的任何处理程序。

post_tasks戏剧中定义的任何内容。

由post_tasks触发的任何处理程序。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值