ansible变量+管理机密
ansible变量
定义变量规则:由字母/数字/下划线组成,变量需要以字母开头,ansible内置的关键字不能作为变量名
ansible中,可以将变量简化为三个范围
Global范围(高):从命令行和ansible配置设置的变量
play范围(中):在play和相关结构中设置的变量
Host范围(低):inventory、facts或register的变量,在主机组和个别主机上设置的变量
三个范围的变量优先级由高到低,如果变量重复定义,则以优先级高的为准
注册和定义变量的各种方式
ansible中定义变量的方式有很多种,大致有:
(1) 将模块的执⾏结果注册为变量(register) (2) 直接定义字典类型的变量 (3) role中⽂件内定义变量 (4) 命令⾏传递变量(-e) (5) 借助with_items迭代将多个task的结果赋值给⼀个变量(循环变量) (6) inventory中的主机或主机组变量 (7) 内置变量(Magic Variables)(8)事实变量(Facts)
vars定义变量:
[student@master ansible]$ vim a.yml
---
- name: testhosts: node1vars:aa: 11bb: 22cc: c1: 33c2: 44tasks:- name: test1debug:msg: "{{ aa }}"- name: test2debug:msg: "{{ bb }}"- name: test3debug:msg: "{{ cc.c1 }}"- name: test4debug:msg: "{{ cc.c2 }}"
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [test1] *******************************************************************
ok: [node1] => {"msg": 11
}TASK [test2] *******************************************************************
ok: [node1] => {"msg": 22
}TASK [test3] *******************************************************************
ok: [node1] => {"msg": "33"
}TASK [test4] *******************************************************************
ok: [node1] => {"msg": "44"
}PLAY RECAP *********************************************************************
node1 : ok=5 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 [student@master ansible]$ vim a.yml
---
- name: testhosts: node1vars:aa: 11bb: 22cc:c1: 33c2: 44tasks:- name: test1debug:msg: this is {{ aa }} ////////- name: test2debug:msg: "{{ bb }}"- name: test3debug:msg: "{{ cc.c1 }}"- name: test4debug:msg: "{{ cc.c2 }}"
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [test1] *******************************************************************
ok: [node1] => {"msg": "this is 11" //////////
}TASK [test2] *******************************************************************
ok: [node1] => {"msg": 22
}TASK [test3] *******************************************************************
ok: [node1] => {"msg": "33"
}TASK [test4] *******************************************************************
ok: [node1] => {"msg": "44"
}PLAY RECAP *********************************************************************
node1 : ok=5 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
vars_files定义变量:
[student@master ansible]$ vim fy
aa: 1
bb: 2
cc:c1: 3c2: 4
~
[student@master ansible]$ vim a.yml
---
- name: testhosts: node1vars_files:- /home/student/ansible/fytasks:- name: test1debug:msg: this is {{ aa }}- name: test2debug:msg: "{{ bb }}"- name: test3debug:msg: "{{ cc.c1 }}"- name: test4debug:msg: "{{ cc.c2 }}"
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [test1] *******************************************************************
ok: [node1] => {"msg": "this is 1"
}TASK [test2] *******************************************************************
ok: [node1] => {"msg": 2
}TASK [test3] *******************************************************************
ok: [node1] => {"msg": "3"
}TASK [test4] *******************************************************************
ok: [node1] => {"msg": "4"
}PLAY RECAP *********************************************************************
node1 : ok=5 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
register 注册变量:(使⽤register选项,可以将当前task的输出结果赋值给⼀个变量)
[root@node1 ~]# echo 123 > /tmp/file1
[student@master ansible]$ vim a.yml
---
- name: testhosts: node1tasks:- name: test1shell:cmd: cat /tmp/file1
~
[student@master ansible]$ ansible-playbook a.ymlPLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [test1] *******************************************************************
changed: [node1]PLAY RECAP *********************************************************************
node1 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 [student@master ansible]$ ansible node1 -m shell -a 'cat /tmp/file1'
node1 | CHANGED | rc=0 >>
123
[student@master ansible]$ vim a.yml
---
- name: testhosts: node1tasks:- name: test1shell:cmd: cat /tmp/file1register: luoqi- name: test2debug:msg: "{{ luoqi }}"
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [test1] *******************************************************************
changed: [node1]TASK [test2] *******************************************************************
ok: [node1] => {"msg": {"changed": true,"cmd": "cat /tmp/file1","delta": "0:00:00.009407","end": "2025-09-01 16:11:09.516546","failed": false,"msg": "","rc": 0,"start": "2025-09-01 16:11:09.507139","stderr": "","stderr_lines": [],"stdout": "123","stdout_lines": ["123"]}
}PLAY RECAP *********************************************************************
node1 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 [student@master ansible]$ vim a.yml
---
- name: testhosts: node1tasks:- name: test1shell:cmd: cat /tmp/file1register: luoqi- name: test2debug:msg: "{{ luoqi.stdout }}"
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [test1] *******************************************************************
changed: [node1]TASK [test2] *******************************************************************
ok: [node1] => {"msg": "123"
}PLAY RECAP *********************************************************************
node1 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0[student@master ansible]$ vim a.yml
---
- name: testhosts: node1tasks:- name: test1shell:cmd: cat /tmp/file1register: luoqi- name: test2debug:var: luoqi.stdout
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [test1] *******************************************************************
changed: [node1]TASK [test2] *******************************************************************
ok: [node1] => {"luoqi.stdout": "123"
}PLAY RECAP *********************************************************************
node1 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
set_fact定义变量
set_fact和register的功能很相似,也是将值赋值给变量。它更像shell中变量的赋值⽅式,可以将某个变量的值赋值给另⼀个变量,也可以将字符串赋值给变量
通过ansible node1 -m setup 可以查询node1主机所有的事实变量
[student@master ansible]$ vim a.yml
---
- name: testhosts: node1tasks:- name: test1debug:msg: the {{ ansible_fqdn }} address is {{ ansible_default_ipv4.address }}
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [test1] *******************************************************************
ok: [node1] => {"msg": "the node1.example.com address is 192.168.122.10"
}PLAY RECAP *********************************************************************
node1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
通过命令传入变量:
[student@master ansible]$ vim a.yml
---
- name: testhosts: node1tasks:- name: test1debug:msg: my name is {{ name1 }}
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [test1] *******************************************************************
fatal: [node1]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'name1' is undefined\n\nThe error appears to be in '/home/student/ansible/a.yml': line 5, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n tasks:\n - name: test1\n ^ here\n"}PLAY RECAP *********************************************************************
node1 : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0 [student@master ansible]$ ansible-playbook a.yml -e "name1=syf"PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [test1] *******************************************************************
ok: [node1] => {"msg": "my name is syf"
}PLAY RECAP *********************************************************************
node1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
主机清单中的变量:
[student@master ansible]$ vim inventory
[dev]
node1 name=luoqi
node2[dev:vars]
name1=luoqi[test]
node3
node4[prod]
node5
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node2]TASK [test1] *******************************************************************
ok: [node2] => {"msg": "my name is luoqi"
}PLAY RECAP *********************************************************************
node2 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 [student@master ansible]$ vim inventory
[dev]
node1 name=luoqi
node2[test]
node3
node4[prod]
node5
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node2]TASK [test1] *******************************************************************
fatal: [node2]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'name1' is undefined\n\nThe error appears to be in '/home/student/ansible/a.yml': line 5, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n tasks:\n - name: test1\n ^ here\n"}PLAY RECAP *********************************************************************
node2 : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0 [student@master ansible]$ mkdir host_vars
[student@master ansible]$ cd host_vars/
[student@master host_vars]$ vim node2.yml
---
name1: luoqi
~
[student@master host_vars]$ cd ..
[student@master ansible]$ ls
ansible.cfg fy inventory sy1.yml sy.yml
a.yml fy.yml jihua.yml sy2.yml webdev.yml
collections host_vars roles sy3.yml
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node2]TASK [test1] *******************************************************************
ok: [node2] => {"msg": "my name is luoqi"
}PLAY RECAP *********************************************************************
node2 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 [student@master ansible]$ vim host_vars/node2
name1: sy
~
[student@master ansible]$ ls host_vars/
node2 node2.yml
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node2]TASK [test1] *******************************************************************
ok: [node2] => {"msg": "my name is sy"
}PLAY RECAP *********************************************************************
node2 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 [student@master ansible]$ vim inventory
[dev]
node1 name1=123
node2[dev:vars]
name1=456[test]
node3
node4[prod]
node5
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node2]TASK [test1] *******************************************************************
ok: [node2] => {"msg": "my name is sy"
}PLAY RECAP *********************************************************************
node2 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 [student@master ansible]$ rm -rf host_vars/
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node2]TASK [test1] *******************************************************************
ok: [node2] => {"msg": "my name is 456"
}PLAY RECAP *********************************************************************
node2 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 [student@master ansible]$ vim inventory
[dev]
node1
node2 name1=123[dev:vars]
name1=456[test]
node3
node4[prod]
node5
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node2]TASK [test1] *******************************************************************
ok: [node2] => {"msg": "my name is 123"
}PLAY RECAP *********************************************************************
node2 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
内置变量 ansible_version:
[student@master ansible]$ vim a.yml
---
- name: testhosts: node2tasks:- name: test1debug:msg: "{{ ansible_version }}"
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node2]TASK [test1] *******************************************************************
ok: [node2] => {"msg": {"full": "2.13.3","major": 2,"minor": 13,"revision": 3,"string": "2.13.3"}
}PLAY RECAP *********************************************************************
node2 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
内置变量 inventory_hostname:
[student@master ansible]$ vim inventory
[dev]
192.168.122.10
node2 [test]
node3
node4[prod]
node5
~
[student@master ansible]$ vim a.yml
---
- name: testhosts: devtasks:- name: test1debug:msg: "{{ inventory_hostname }}"
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node2]
ok: [192.168.122.10]TASK [test1] *******************************************************************
ok: [192.168.122.10] => {"msg": "192.168.122.10"
}
ok: [node2] => {"msg": "node2"
}PLAY RECAP *********************************************************************
192.168.122.10 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node2 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 [student@master ansible]$ vim inventory
[dev]
node1
node2[test]
node3
node4[prod]
node5
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node2]
ok: [node1]TASK [test1] *******************************************************************
ok: [node1] => {"msg": "node1"
}
ok: [node2] => {"msg": "node2"
}PLAY RECAP *********************************************************************
node1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node2 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
内置变量 play_hosts:
[student@master ansible]$ vim a.yml
---
- name: testhosts: devtasks:- name: test1debug:msg: "{{ play_hosts }}"
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node2]
ok: [node1]TASK [test1] *******************************************************************
ok: [node1] => {"msg": ["node1","node2"]
}
ok: [node2] => {"msg": ["node1","node2"]
}PLAY RECAP *********************************************************************
node1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node2 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 [student@master ansible]$ vim a.yml
---
- name: testhosts: testtasks:- name: test1debug:msg: "{{ play_hosts }}"
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node4]
ok: [node3]TASK [test1] *******************************************************************
ok: [node3] => {"msg": ["node3","node4"]
}
ok: [node4] => {"msg": ["node3","node4"]
}PLAY RECAP *********************************************************************
node3 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node4 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
内置变量 groups:
[student@master ansible]$ vim a.yml
---
- name: testhosts: node1tasks:- name: test1debug:msg: "{{ groups }}"
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [test1] *******************************************************************
ok: [node1] => {"msg": {"all": ["node1","node2","node3","node4","node5"],"dev": ["node1","node2"],"prod": ["node5"],"test": ["node3","node4"],"ungrouped": []}
}PLAY RECAP *********************************************************************
node1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 [student@master ansible]$ vim inventory
node5[dev]
node1
node2[test]
node3
node4~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [test1] *******************************************************************
ok: [node1] => {"msg": {"all": ["node5","node1","node2","node3","node4"],"dev": ["node1","node2"],"test": ["node3","node4"],"ungrouped": ["node5"]}
}PLAY RECAP *********************************************************************
node1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
内置变量 group_names:
[student@master ansible]$ vim a.yml
---
- name: testhosts: node1tasks:- name: test1debug:msg: "{{ groups.all }}"
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [test1] *******************************************************************
ok: [node1] => {"msg": ["node5","node1","node2","node3","node4"]
}PLAY RECAP *********************************************************************
node1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 [student@master ansible]$ vim a.yml
---
- name: testhosts: node1tasks:- name: test1debug:msg: "{{ group_names }}"
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [test1] *******************************************************************
ok: [node1] => {"msg": ["dev"]
}PLAY RECAP *********************************************************************
node1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 [student@master ansible]$ vim a.yml
---
- name: testhosts: node5tasks:- name: test1debug:msg: "{{ group_names }}"
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node5]TASK [test1] *******************************************************************
ok: [node5] => {"msg": ["ungrouped"]
}PLAY RECAP *********************************************************************
node5 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
内置变量 inventory_dir:
[student@master ansible]$ vim a.yml
---
- name: testhosts: node5tasks:- name: test1debug:msg: "{{ inventory_dir }}"
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node5]TASK [test1] *******************************************************************
ok: [node5] => {"msg": "/home/student/ansible"
}PLAY RECAP *********************************************************************
node5 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
With_items 叠加变量—可以给一个变量赋予多个值:
[student@master ansible]$ vim a.yml
---
- name: testhosts: node5tasks:- name: create useruser:name: "{{ item }}" state: presentwith_items:- user1- user2- user3
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node5]TASK [create user] *************************************************************
changed: [node5] => (item=user1)
changed: [node5] => (item=user2)
changed: [node5] => (item=user3)PLAY RECAP *********************************************************************
node5 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[student@master ansible]$ vim a.yml
---
- name: testhosts: node5tasks:- name: test1shell:cmd: echo {{ item }}with_items:- a- b- c
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node5]TASK [test1] *******************************************************************
changed: [node5] => (item=a)
changed: [node5] => (item=b)
changed: [node5] => (item=c)PLAY RECAP *********************************************************************
node5 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[student@master ansible]$ vim a.yml
---
- name: testhosts: node5tasks:- name: test1shell:cmd: echo {{ item }}with_items:- a- b- cregister: sy- name: test2debug:var: sy
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node5]TASK [test1] *******************************************************************
changed: [node5] => (item=a)
changed: [node5] => (item=b)
changed: [node5] => (item=c)TASK [test2] *******************************************************************
ok: [node5] => {"sy": {"changed": true,"msg": "All items completed","results": [{"ansible_loop_var": "item","changed": true,"cmd": "echo a","delta": "0:00:00.008888","end": "2025-09-02 10:52:36.851330","failed": false,"invocation": {"module_args": {"_raw_params": "echo a","_uses_shell": true,"argv": null,"chdir": null,"creates": null,"executable": null,"removes": null,"stdin": null,"stdin_add_newline": true,"strip_empty_ends": true,"warn": false}},"item": "a","msg": "","rc": 0,"start": "2025-09-02 10:52:36.842442","stderr": "","stderr_lines": [],"stdout": "a","stdout_lines": ["a"]},{"ansible_loop_var": "item","changed": true,"cmd": "echo b","delta": "0:00:00.005314","end": "2025-09-02 10:52:37.533682","failed": false,"invocation": {"module_args": {"_raw_params": "echo b","_uses_shell": true,"argv": null,"chdir": null,"creates": null,"executable": null,"removes": null,"stdin": null,"stdin_add_newline": true,"strip_empty_ends": true,"warn": false}},"item": "b","msg": "","rc": 0,"start": "2025-09-02 10:52:37.528368","stderr": "","stderr_lines": [],"stdout": "b","stdout_lines": ["b"]},{"ansible_loop_var": "item","changed": true,"cmd": "echo c","delta": "0:00:00.007496","end": "2025-09-02 10:52:38.314184","failed": false,"invocation": {"module_args": {"_raw_params": "echo c","_uses_shell": true,"argv": null,"chdir": null,"creates": null,"executable": null,"removes": null,"stdin": null,"stdin_add_newline": true,"strip_empty_ends": true,"warn": false}},"item": "c","msg": "","rc": 0,"start": "2025-09-02 10:52:38.306688","stderr": "","stderr_lines": [],"stdout": "c","stdout_lines": ["c"]}],"skipped": false}
}PLAY RECAP *********************************************************************
node5 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[student@master ansible]$ vim a.yml
---
- name: testhosts: node5tasks:- name: test1shell:cmd: echo {{ item }}with_items:- a- b- cregister: sy- name: test2debug:var: sy.results[0].stdout- name: test3debug:var: sy.results[1].stdout- name: test4debug:var: sy.results[2].stdout
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node5]TASK [test1] *******************************************************************
changed: [node5] => (item=a)
changed: [node5] => (item=b)
changed: [node5] => (item=c)TASK [test2] *******************************************************************
ok: [node5] => {"sy.results[0].stdout": "a"
}TASK [test3] *******************************************************************
ok: [node5] => {"sy.results[1].stdout": "b"
}TASK [test4] *******************************************************************
ok: [node5] => {"sy.results[2].stdout": "c"
}PLAY RECAP *********************************************************************
node5 : ok=5 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
管理机密
Ansible可能需要访问密码或者API密钥等敏感数据,以便配置受控主机。通常,此信息可能以纯文本形式存储在清单变量或其他ansible文件中。但若如此,任何有权访问ansible文件的用户或者存储这些ansible文件的版本控制系统都能够访问此敏感数据。这显然存在安全风险
使用ansible随附的ansible vault 可以加密和解密任何由ansible使用的结构化数据文件。若要使用ansible vault,可通过一个名为ansible-vault的命令行工具创建、编辑、加密、解密和查看文件。Ansible vault可以加密任何由ansible使用的结构化数据文件。这可能包括清单变量、playbook中含有的变量文件、在执行playbook时作为参数传递的变量文件,或者ansible角色中定义的变量
实验:
[student@master ansible]$ ansible-vault create y.yml
New Vault password:
Confirm New Vault password:
---
- name: testhosts: node1tasks:- name: test1debug:msg: echo 123
~
[student@master ansible]$ cat y.yml
$ANSIBLE_VAULT;1.1;AES256
30313530326231663234393135303439356135626632646132653334336638373435613832653638
3266386166666461346662303765316363363232326466660a306634366462613538303066646132
39383238643331336639373038666162633965666630343439653164393562383738303963386131
6130356266353761300a333439373032363762353438343632393838643064353537383163336534
63333530316463343163656363613231643463343530383231646365396537396264386237373232
66393035643837336535633432336235346530353531356138613335326639363063656364633764
34313031313733303136316364653231626333353534333331306137343237643765343664373330
66383162653536383065306535343439643864643261386632376434353735373230623966383462
3033
[student@master ansible]$ ansible-vault view y.yml
Vault password:
---
- name: testhosts: node1tasks:- name: test1debug:msg: echo 123
[student@master ansible]$ ansible-vault edit y.yml
Vault password:
---
- name: testhosts: node1tasks:- name: test1debug:msg: echo 123
~
加密后的文件直接用playbook执行会报错,那么该使用什么命令呢?
使用选项–vault-id @prompt或者–ask-vault-pass
[student@master ansible]$ ansible-playbook y.yml
ERROR! Attempting to decrypt but no vault secrets found
[student@master ansible]$ ansible-playbook y.yml --ask-vault-pass
Vault password: PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [test1] *******************************************************************
ok: [node1] => {"msg": "echo 123"
}PLAY RECAP *********************************************************************
node1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[student@master ansible]$ ansible-vault decrypt y.yml
Vault password:
Decryption successful
[student@master ansible]$ vim y.yml
---
- name: testhosts: node1tasks:- name: test1debug:msg: echo 123
~
[student@master ansible]$ ansible-playbook y.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [test1] *******************************************************************
ok: [node1] => {"msg": "echo 123"
}PLAY RECAP *********************************************************************
node1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
查看加密的文件:
[student@master ansible]$ cp y.yml f.yml
[student@master ansible]$ cat f.yml
---
- name: testhosts: node1tasks:- name: test1debug:msg: echo 123
[student@master ansible]$ ansible-vault encrypt f.yml
New Vault password:
Confirm New Vault password:
Encryption successful
[student@master ansible]$ vim syf.txt
redhat
~
[student@master ansible]$ chmod 600 syf.txt
[student@master ansible]$ ansible-vault encrypt y.yml --vault-id syf.txt
Encryption successful
[student@master ansible]$ vim y.yml
$ANSIBLE_VAULT;1.1;AES256
37313265326633386366316430653663663439383761336161383662303165633666663532363331
3832303331366432646164663339346261346165663539660a393432653133653066303932333630
37653837306164373462306465633536643266326364303064333438373765643433353966636435
3061653134396538610a326134323033313533316265373937653362303166656437613066306161
36316634306139613636303664393230373665333635643437653436663335643239663465346165
34386431656162393130303732333762323066396139623130626533346333373038353062623132
32393235313562616233323961643039643063333931653435303235333138653065333237666433
61333738303361613933633730623261636534373066343233356230646438373037356638616466
3664
~
[student@master ansible]$ ansible-vault view y.yml
Vault password:
---
- name: testhosts: node1tasks:- name: test1debug:msg: echo 123
[student@master ansible]$ ansible-playbook y.yml --vault-id syf.txt
PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [test1] *******************************************************************
ok: [node1] => {"msg": "echo 123"
}PLAY RECAP *********************************************************************
node1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[student@master ansible]$ vim f.yml
$ANSIBLE_VAULT;1.1;AES256
36363833633939363664306434383437666465653336303432646131323831663235376132313938
3463643130386461656335306439653663393762353131310a373434643734346536373064326137
66353431616561326365313732356363373632323065633965656132636536383264326164366464
3131336137643430610a373335306536376562373362363131373239323831313863363264313065
30343131643839656565353533656331313436646639376533623735386366366331633136666638
36323232323361663536303035656139623433313038663762306532663534323435643561346330
37626537303961316162373633356165633561393562396134356261343532643937336635373738
65663439326633653162343735666362353762333165633661316534653463303361303231663361
6131
~
更改加密文件的密码:
[student@master ansible]$ ansible-vault rekey f.yml
Vault password: //输入旧密码
New Vault password: //输入新密码
Confirm New Vault password: //输入新密码
Rekey successful