【Linux32-6】playbook语法详解(二)



【Linux32-4】playbook详解(一)



1. 重用ansible工件(导入角色及任务)


重用ansible工件官方文档


重用剧本: 静态导入

- import_playbook: playbook.yml

重用文件和角色:

静态导入:Ansible在运行剧本中的任何任务之前会对其进行预处理,因此导入的内容永远不会受到顶级剧本中其他任务的影响

静态:
- import_tasks: 任务文件.yml
- import_role: 角色

动态导入:Ansible进程在剧本中包含文件和角色,因此所包含的任务可能会受到顶级剧本中较早任务的结果的影响。所包含的角色和任务与处理程序相似-它们可能会或可能不会运行,这取决于顶级剧本中其他任务的结果

动态:
- include_tasks: 任务文件.yml
- include_role: 角色
- include_vars: {
    
    {
    
     变量名 }}

2. loop循环(with_*)


loop循环官方文档


  • 定义loop
  • 引用{ { item }}

2.1 遍历列表


#playbook
---
- hosts: test
  gather_facts: no
  vars_files:
    - userlist.yml
  tasks:
  - name: create users
    user:
      name: "{
    
    { item.user }}"
      password: "{
    
    { item.passwd | password_hash('sha512') }}"
    loop: "{
    
    { userlist }}"
#userlist.yml 
---
userlist:
  - user: 'user1'
    passwd: '123'
  - user: 'user2'
    passwd: '456'
  - user: 'user3'
    passwd: '789'

2.2 遍历哈希表


示例1:
---
- hosts: test
  tasks:
  - name: create users
    user:
      name: "{
    
    { item.user }}"
      password: "{
    
    { item.passwd | password_hash('sha512') }}"
    loop:
      - {
    
     user: 'user1', passwd: '123' }
      - {
    
     user: 'user2', passwd: '124' }
      - {
    
     user: 'user3', passwd: '125' }

2.3 遍历字典


要遍历字典,使用 dict2items

- name: Using dict2items
  ansible.builtin.debug:
    msg: "{
    
    { item.key }} - {
    
    { item.value }}"
  loop: "{
    
    { tag_data | dict2items }}"
  vars:
    tag_data:
      Environment: dev
      Application: payment
#遍历tag_data并从中打印键和值

2.4 用循环注册变量


- name: Register loop output as a variable
  ansible.builtin.shell: "echo {
    
    { item }}"
  loop:
    - "one"
    - "two"
  register: echo

对注册变量进行的循环检查结果:
 loop: "{
    
    { echo.results }}"

结果将放置在变量中 echo.stdout

2.5 循环输出函数 query与lookup


loop: "{
    
    { query('inventory_hostnames', 'all') }}"

loop: "{
    
    { lookup('inventory_hostnames', 'all', wantlist=True) }}"

3. 条件 when


when条件的官方文档


3.1 基本条件when


【注:无双花括号

示例:
---
- hosts: all
  tasks:
  - name: install apache
    dnf:
      name: httpd
      state: present
    when: ansible_hostname == "server2"
when: ansible_facts['XXX']['XXX']['XXX'] == XXX

3.2 在循环中使用条件


tasks:
    - name: Run with items greater than 5
      ansible.builtin.command: echo {
    
    {
    
     item }}
      loop: [ 0, 2, 4, 6, 8, 10 ]
      when: item > 5
若是字典:
when: item.value > 5

4. block块处理


block官方文档


任务分组

tasks:
  - name: ...
  block:
    - name: ...
    - name: ...

4.1 rescue 处理错误


仅在任务返回“失败”状态后运行rescue


示例:
---
- hosts: ...
  tasks:
  - name:
    block:
    - name: ...
      dnf:
        name: httpd
        state: present
    rescue:
    - name: ...

4.2 always 处理错误


无论上一个块的任务状态如何,always 中的任务都会运行


示例:
---
- hosts: localhost
  tasks:
   - name: Handle the error
     block:
       - debug:
           msg: 'I execute normally'
       - name: i force a failure
         command: /bin/false
     rescue:
       - debug:
           msg: 'I caught an error, can do stuff here to fix it, :-)'
     always:
       - debug:
           msg: "This always executes, :-)"

5. 剧本中的错误处理


错误处理官方文档


当Ansible从命令接收到非零返回码或模块失败时,默认情况下它将停止在该主机上执行并在其他主机上继续执行。但是,在某些情况下,您可能想要不同的行为。有时,非零返回码表示成功。有时,您希望在一台主机上发生故障以停止所有主机上的执行


忽略失败的命令

  • 默认情况下,当某个任务在主机上失败时,Ansible将停止在该主机上执行任务

ignore_errors: yes:仅在任务能够运行且返回值“ failed”时起作用

忽略无法访问的主机错误

ignore_unreachable: yes:Ansible会忽略任务错误,但对无法访问的主机不会继续执行将来的任务


重置无法访问的主机

  • 问题:如果Ansible无法连接到主机,则将该主机标记为“ UNREACHABLE”,并将其从运行的活动主机列表中删除。

meta:clear_host_errors:重新激活所有主机,后续任务可以尝试再次访问它们


定义"changed"

changed_when: XXX:何时特定任务“更改”了远程节点


设置最大故障百分比max_fail_percentage: 30

  • 在某些情况下,例如执行滚动更新时,您可能希望在达到一定的失败阈值时中止play
示例:
---
- hosts: webservers
  max_fail_percentage: 30
  serial: 10

max_fail_percentage当与serial一起使用时,该设置适用于每个批次。在上面的示例中,如果第一批(或任何一批)服务器中的10台服务器中有3台以上发生故障,则其余的游戏将中止


用block处理错误:见本篇第4章


6. 标签 tags


tags官方文档

使用标签执行或跳过所选任务的过程分为两个步骤:

  1. 可以单独或通过从块,角色,角色或导入的标签继承将标签添加到任务中。
  2. 运行剧本时选择或跳过标签

6.1 添加标签


  • 将标签添加到单个任务
    • 多对一:一个或多个标签应用于单个任务
    • 一对多:同一标签应用于多个任务

---
- hosts: test
  tasks:
  - name: ...
    dnf:
      name: ...
    tags:
    - packages
    - webservers

  • 向导入 import_ 中添加

---
- hosts: webservers
  tasks:
    - name: ...
      import_role:
        name: ...
      tags:
        - bar
        - baz
    - name: ...
      import_tasks: ...yml
      tags: [ web, foo ]

  • 标签继承:将标签添加到多个任务

向block添加标签:
tasks:
- block: ...
  tags: Apache
  - name: ...
  - name: ...
- name: ...
  tags: 标签

向每一个play中添加:
- hosts: all
  tags: 标签1
  tasks: ...
- host: test
  tags: 标签2
  tasks: ...

向角色添加标签:
roles:
  - role: ...
    tags: [ web, foo ]---
- hosts: ...
  roles:
    - role: ...
      tags:
        - 标签
        - 标签

6.2 特殊标签 always与never


always:始终运行该任务或play(除非专门跳过 --skip-tags always)

never:跳过该任务或play(除非执行 --tags never)


---
- hosts: ...
  tasks:
  - name: ...
    tags:
    - always
  - name: ...
    tags:
    - never

6.3 选择执行或跳过标签


执行选项
--tags
指定运行
--skip-tags
跳过

ansible内置标签
all
全部(默认)
always
总是执行
never
永远不执行
tagged
带标签的
untagged
不带标签的

--tags all:运行所有任务,忽略标签(默认行为)

--tags [tag1, tag2]:仅运行带有标签tag1和tag2

--skip-tags [tag3, tag4]:运行所有任务,除过带有标签tag3和tag4


--tags tagged:仅运行至少带有一个标签的任务

--tags untagged:只运行没有标签的任务


6.4 预览标签


--list-tags:生成可用标签列表

--tags tagname --list-tags:生成带标签的任务

--skip-tags tagname --list-tags:生成不带标签的任务


7. 交互式输入输出 prompt


交互式输入官方文档


通过提示用户输入变量,可以避免记录诸如密码之类的敏感数据。除安全性外,提示还支持灵活性


关键字:vars_prompt

vars_prompt 常用选项
prompt
定义输出的内容
private
private: no 用户输入内容可见
private: yes 隐藏用户输入(默认)
default
设置默认值,当不输入任何值时,使用该默认值
confirm: yes
再次确认(适合密码使用)
unsafe: yes
接受特殊字符

示例:
---
- hosts: localhost
  vars_prompt:
    - name: username
      prompt: What is your username?
      private: no
    - name: password
      prompt: What is your password?
  tasks:
  - name: 测试Apache,返回直
    uri:
      url: http://192.168.43.27
      user: "{
    
    { username }}"
      password: "{
    
    { password }}"
      return_content: yes
      status_code: 200
    register: result
  - debug:
      var: result

加密示例:
vars_prompt:
  - name: my_password2
    prompt: Enter password2
    private: yes
    encrypt: sha512_crypt
    confirm: yes
    salt_size: 7

猜你喜欢

转载自blog.csdn.net/weixin_46069582/article/details/112304051