自学内容网 自学内容网

ansible变量和剧本

1、剧本

2、变量定义

1、主机清单变量

1、主机组变量
[devops@controller ansible]$ cat hosts 
[node]
node1 webserver=nginx
node2

# 输出变量
[devops@controller ansible]$ ansible node1 -m debug -a "msg={{webserver}}"
node1 | SUCCESS => {
    "msg": "nginx"
}


2、定义主机组的变量
[devops@controller ansible]$ cat hosts 
[node]
node1 webserver=nginx
node2
[node:vars]
rhelname=rhce

[devops@controller ansible]$ ansible node -m debug -a "msg={{rhelname}}"
node1 | SUCCESS => {
    "msg": "rhce"
}
node2 | SUCCESS => {
    "msg": "rhce"
}

3、通过主机和主机组的目录文件定义变量

2、剧本中定义变量

1、vars定义
  1. 在task任务之前定义即可,可以定义多次变量

  2. 然后就不用重复写这个内容了,直接调用变量即可

[devops@controller ansible]$ cat play_vars/v1.yaml 
- hosts: node
  vars: # 定义变量,{{}} 就可以调用变量了
    rname: rhel9
    rage: 9
  tasks:
    - name: use shell
      shell: echo "{{rname}} {{rage}}" > /opt/fil1

# 使用var变量的话,就直接输出了
[devops@controller ansible]$ cat play_vars/v1.yaml 
- hosts: node
  vars:
    rname: rhel9
    rage: 9
  tasks:
    - debug:
        var: rname,rage

2、vars_files定义
  • 通过引入文件来定义
  • vars_files定义
[devops@controller ansible]$ cat play_vars/v2.yaml 
- hosts: node
  vars_files:
    - /mnt/file1.yaml
  tasks:
    - shell: echo "{{user.name}}" > /opt/file1

[devops@controller ansible]$ cat /mnt/file1.yaml 
user:
  name: zhangsan
  age: 19

3、注册变量
  • 就是将一个任务的执行结果注册为一个变量

  • 使用关键字,register去获得任务的执行结果

  • 执行后将信息保存到主控节点上面

[devops@controller ansible]$ cat play_vars/v3.yaml 
- hosts: node
  tasks:
    - shell: ls /etc/passwd
      register: get_status
    - debug:
        var: get_status.rc


TASK [debug] **************************************************************************************
ok: [node1] => {
    "get_status.rc": "0"
}
ok: [node2] => {
    "get_status.rc": "0"
}


3、命令模式定义变量

[devops@controller ansible]$ cat play_vars/v4.yaml 
- hosts: node
  tasks:
    - file:
        path: "{{path}}"
        state: touch

[devops@controller ansible]$ ansible-playbook play_vars/v4.yaml  -e "path=/opt/eee"

# 如果有多个的话,使用-e即可解决

4、fact变量

  • 事实变量,收集被控节点的信息,定义一个变量的信息

  • 通过setup模块收集被控节点信息,通过facts参数,专门用来收集

  • ansible_facts变量中有很多信息,主机名,网卡设备,ip地址,磁盘和磁盘空间

# 使用filter参数获取指定的值
[devops@controller ansible]$ ansible node -m setup -a "filter=ansible_all_ipv4_addresses"
node2 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.168.200.12"
        ],
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false
}
node1 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.168.200.11"
        ],
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false
}


# 可以直接引用fact变量
[devops@controller ansible]$ cat play_vars/v5.yaml 
- hosts: node
  tasks:
    - debug:
        var: ansible_all_ipv4_addresses

[devops@controller ansible]$ ansible-playbook play_vars/v5.yaml 

PLAY [node] ***************************************************************************************

TASK [Gathering Facts] ****************************************************************************
ok: [node1]
ok: [node2]

TASK [debug] **************************************************************************************
ok: [node1] => {
    "ansible_all_ipv4_addresses": [
        "192.168.200.11"
    ]
}
ok: [node2] => {
    "ansible_all_ipv4_addresses": [
        "192.168.200.12"
    ]
}


# 禁用facts变量收集
[root@controller opt]# cat facts.yml
- name: facts
  hosts: node1
  gather_facts: no
  tasks:
    - debug:
        var: ansible_all_ipv4_addresses

5、set_fact变量

  • 可以定义一个变量,获取不同主机的版本
[devops@controller ansible]$ cat play_vars/v6.yaml 
- hosts: node
  tasks:
    - set_fact:
        get_version: "{{ansible_distribution_version}}---{{ansible_distribution}}"
    - debug:
        var: get_version


TASK [debug] **************************************************************************************
ok: [node1] => {
    "get_version": "9.0---RedHat"
}
ok: [node2] => {
    "get_version": "9.0---RedHat"
}

6、lookup变量

  • 使用lookup这个参数的,为变量赋值

  • lookup可以从文件,命令,变量中获取

  • 需要和set_fact配合使用,也可以不配合使用

1、从文件中赋值变量
# 将这个文件里面的内容拷贝了过去
[devops@controller ansible]$ cat play_vars/v7.yaml 
- hosts: node
  tasks:
    - set_fact:
        vs: "{{lookup('file','/etc/passwd')}}"
    - copy:
        content: "{{vs}}"
        dest: /opt/passwd 

2、从命令中赋值变量
# 创建一个用户密码加密
[devops@controller ansible]$ cat play_vars/v8.yaml 
- hosts: node
  tasks:
    - user:
        name: q11
        password: "{{lookup('pipe','openssl passwd -6 redhat')}}"
3、从环境变量中赋值
[devops@controller ansible]$ cat play_vars/v9.yaml 
- hosts: node
  tasks:
    - set_fact:
        get_env: "{{lookup('env','HOME')}}"
    - debug:
        var: get_env

TASK [debug] **************************************************************************************
ok: [node1] => {
    "get_env": "/home/devops"
}
ok: [node2] => {
    "get_env": "/home/devops"
}

8、魔法变量

  • 内置的变量,有特殊含义的变量

  • fact变量只有运行的主机才能调用

1、hostvars
  • 获取指定主机的变量信息,不需要获取全部的信息

  • 还是获取的setup里面的信息

# 只获取noe1的ip地址
[devops@controller ansible]$ cat play_vars/v10.yaml 
- hosts: node
  tasks:
    - debug:
        msg: "{{hostvars['node1'].ansible_default_ipv4.address}}"

2、inventory_hostname
  • 列出当前运行任务的主机(通常和when判断一起使用)
[devops@controller ansible]$ cat play_vars/v11.yaml 
- hosts: node
  tasks:
    - debug:
        var: ansible_hostname
      when: inventory_hostname == "node1"

# 当主机是node1的时候,就执行
TASK [debug] *************************************************************************************
ok: [node1] => {
    "ansible_hostname": "node1"
}
skipping: [node2]


3、groups
  • 列出主机清单中的所有的主机组,groups.all 列出所有的主机

  • groups_names 显示当前运行的任务的主机属于哪个主机组 when test in groups_names 运行的主机属于test组的话就执行

  • groups.all 列出所有的主机

  • groups.web列出web主机组的主机

[devops@controller ansible]$ cat play_vars/v12.yaml 
- hosts: node
  tasks:
    - debug:
        var: groups

# 检查当前运行的主机是否属于node1组,属于的话就执行
[devops@controller ansible]$ cat play_vars/v12.yaml 
- hosts: node
  tasks:
    - debug:
        var: ansible_hostname
      when: "'node1' in group_names"


9、输出变量

  • debug模块使用
[devops@controller ansible]$ cat play_vars/v13.yaml 
- hosts: node
  vars:
    name: zhangsan
  tasks:
    - debug:
        var: name


# 或者使用msg
[devops@controller ansible]$ cat play_vars/v13.yaml 
- hosts: node
  vars:
    NAME: zhangsan
  tasks:
    - debug:
        msg: "{{NAME}}"

3、剧本

1、剧本之前的检查

# 检查语法
[devops@controller ansible]$ ansible-playbook play_vars/v1.yaml --syntax-check

playbook: play_vars/v1.yaml

# -C 选项 预输出
[devops@controller ansible]$ ansible-playbook play_vars/v1.yaml -C

2、剧本有错误,怎么补救

1、handler
  • 监听某个任务,然后这个tasks执行后,是changed的话,并且是所有的任务执行完后,最后执行,先触发在执行
[devops@controller ansible]$ cat play_vars/v14.yaml 
- hosts: node
  tasks:
    - shell: ls /etc/passwd
      notify: get_status
  handlers:
    - name: get_status 
      file:
        path: /mnt/file11
        state: touch
2、ignore_errors
  • true的话,跳过错误任务,继续执行后面的任务
[devops@controller ansible]$ cat play_vars/v15.yaml 
- hosts: node
  tasks:
    - shell: ls /opt/12121212
      ignore_errors: true
    - shell: ls /opt
3、handler方法
  • 如果有错误的话,handler也不会执行,但是加上一个字段force_handlers:yes的话就能执行

  • 但是如果监听的任务有错误的话,那就无法执行

[devops@controller ansible]$ cat play_vars/v16.yaml 
- hosts: node
  force_handlers: yes
  tasks:
    - shell: ls /opt/
      notify: get_status
    - shell: ls /opqqwqw
  handlers:
    - name: get_status 
      file:
        path: /mnt/1111
        state: touch


原文地址:https://blog.csdn.net/m0_73950916/article/details/142797083

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!