ansible1

(03-编写和运行 Playbook、04-部署文件到受管主机、05-管理变量和事实)

实验环境

[bao@controller ~ 17:50:57]$ mkdir wed && cd web
# &&:这是 Linux 的命令连接符,表示 “逻辑与”:只有前面的命令(mkdir web)执行成功(返回值为 0),才会执行后面的命令(cd web);如果前面的命令失败,后面的命令会直接跳过。

# 创建(或覆盖)ansible.cfg文件,将后续内容原样写入('EOF'表示关闭特殊字符解析)。
[bao@controller web 17:53:36]$ cat > ansible.cfg <<'EOF'
> [defaults]
> remote_user = zj
> inventory = ./inventory
> [privilege_escalation]
> become = True
> become_user = root
> become_method = sudo
> become_ask_pass = False
> EOF

[bao@controller web 17:54:22]$ cat > inventory <<'EOF'
> controller
> node1
> node2
> node3
> node4
> EOF

Playbook 介绍

adhoc 命令可以作为一次性命令对一组主机运行一项简单的任务。不过,若要真正发挥Ansible的能力,需要使用功能 playbook。
playbook 是一个文本文件,其中包含由一个或多个按特定顺序运行的play组成的列表。play是针对清单中选定的主机运行的一组有序任务。play可以让您将一系列冗长而复杂的手动管理任务转变为可轻松重复的例程,并且具有可预测性。
在 playbook 中,您可以将play内的任务序列保存为人类可读并可立即运行的形式。根据任务的编写方式,任务本身记录了部署应用或基础架构所需的步骤。
ad hoc命令示例

[bao@controller web 19:30:52]$ ansible -m user -a "name=newbie uid=4000 state=present" node1

Playbooks以yaml格式编写,通常以 yaml 和 yml 扩展名保存。

改写成playbook:

[bao@controller web 19:32:33]$ vim file1.yaml
---
- name: Configure important user consistently
  hosts: node1
  tasks:
    - name: newbie exists with UID 4000
      user:
        name: newbie
        uid: 4000
        state: present
...

yaml格式只使用空格缩进,对于空格的数量没有强制要求,正常使用2个空格。

基本规则:

  • 同一级别的元素,使用相同的缩进。
  • 对于子项目,使用比父项目更多的缩进。
  • 增加空白行,提高可读性。

Vim 编辑器设置

如果使用vim编辑器,设置vim环境便于编辑Playbooks。
在$HOME/.vimrc文件中添加以下内容:

[bao@controller web 19:45:46]$ vim $HOME/.vimrc
set ai ts=2 number

或者

autocmd FileType yaml set ai ts=2

效果:

  • “ai”,即 “autoindex”,表示自动缩进。
  • “ts”,即 “tabstop”,表示tab键使用2个空格代替。
  • “number”,显示行号。
  • autocmd FileType yam,代表文件类型是yaml时,自动执行“set ai ts=2”。

Playbook 编写

Playbook 示例

playbook.yaml 内容如下:

# 开始:固定格式
---
# 第一个 play: 管理用户
# play的第一个属性name,代表play的说明
- name: manager user

  # 定义哪些主机执行
  hosts: node1
  
  # 执行任务
  tasks:
  
    # 第一个任务:确保用户存在
    # name说明任务功能
    - name: ensure user newbie is exist
      # 任务模块名
       user:
       	 # 模块的选项 
       	 name: newbie
         uid: 4000
         state: present
         
    # 第二个任务:确保用户不存在
    # name说明任务功能
    - name: ensure user newbie is not exist
      # 任务模块名
      user:
        # 模块的选项
        name: newbie
        uid: 4000
        remove: yes
        state: absent
        
# 结束(可省略):固定格式
...      
YAML注释

在 YAML中, 编号或井号符号(#)右侧的所有内容都是注释。如果注释的左侧有内容, 请在该编号符号的前面加一个空格。注释可用于提高可读性。

示例:

# This is YAML comment
Some data # This is also a YAML comment
YAML 多行字符串
  • 可以使用竖线(I)字符表示,保留字符串中的换行字符。

    示例:

---
- name: test string
  hosts: node1
  tasks:
    - name: test string
      # 用户显示变量值或者字符串
	  debug:
        msg: |
		  Example Company
		  123 Main Street
		  Atlanta, GA 30303
  • 也可以使用大于号(>)字符表示换行字符。执行时换行符使用空格代替,并且行内的引导空白将被删除。

    示例:

---
- name: test string
  hosts: node1
  tasks:
    - name: test string
      # 用户显示变量值或者字符串
      debug:
		msg: >
		  This is an example
		  of a long string,
		  that will become
		  a single sentence once folded.

这种方法通常用于将很长的字符串在空格字符处断行,使它们跨占多行来提高可读性。

YAML 列表

一组按次序排列的值,又称为序列(sequence)和数组(array)。
以缩进块的形式编写的键值对集合,如下方所示:

- name: latest version of httpd and firewalld installed
  yum:
	name:
	  - httpd
	  - firewalld
	state: latest
- name: test html page is installed
  copy:
	content: "Welcome to the example.com intranet!\n"
	dest: /var/www/html/index.html

以上有两个任务,每个任务都是多个键值对描述。其中yum模块操作的软件包是一个简单的名称列表。
内联格式:

name: [httpd, firewalld]

Playbook 运行

运行
[bao@controller web 19:48:31]$ ansible-playbook playbook.yaml

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第二次执行剧本,任务状态全是绿色。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

语法检查

选项–syntax-check,只检查剧本语法,不执行剧本。

[bao@controller web 20:29:24]$ ansible-playbook playbook.yaml --syntax-check
Playbook 提权

在playbook中指定此关键字将覆盖/etc/ansible/ansible.cfg文件中的设置特权升级属性

  • remote_user,指定ssh用户
  • become,启用或禁用特权升级
  • become_method,启用特权升级的方法
  • become_user,特殊升级的帐户
---
- name: Enable intranet services
  hosts: node1
  
  remote_user: laoma
  become: true
  become_method: sudo
  become_user: root
  tasks:
	- name: latest version of httpd and firewalld installed
      yum:
		name:
		  - httpd
		  - firewalld
        state: latest

services
hosts: node1

remote_user: laoma
become: true
become_method: sudo
become_user: root
tasks:
- name: latest version of httpd and firewalld installed
yum:
name:
- httpd
- firewalld
state: latest


Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐