1. 变量命名
只能包含数字,下划线,字母 只能用下划线或者字母开头
测试一下: 首先设置一个变量westos@1看看执行playbook,报错了 改@为下划线_
执行成功
2. 变量级别
全局: 从命令行或者配置文件中设定的 play: 在play和相关结构中设定的 主机: 由清单,事实收集或者注册的任务
变量优先级设定: 狭窄范围有限与广域范围
3. 变量设定和使用方式
(1)在playbook中直接定义变量
westos_1: hello 设定变量 “{{ westos_1 }}” 使用变量
(2)在文件中定义变量
编辑一个westos.yml文件
[lee@westos_ansible ansible]$ cat westos.yml
---
westos: hello westos
编辑test.yml,变量文件设为westos.yml 执行
如果有两个变量文件该如何编辑呢 编辑westos1.yml
[lee@westos_ansible ansible]$ cat westos1.yml
---
user: linux
编辑test.yml
[lee@westos_ansible ansible]$ cat test.yml
---
- name: test
hosts: westos
vars_files:
- ./westos.yml 指定两个变量文件
- ./westos1.yml
tasks:
- name: test
debug:
msg: "{{ westos }} {{ user }}"
执行
我们给变量文件中写入两个值,添加创建用户的模块
[lee@westos_ansible ansible]$ cat westos.yml
---
westos:
- westos
- linux
[lee@westos_ansible ansible]$ cat test.yml
---
- name: test
hosts: westos
vars_files:
- ./westos.yml
tasks:
- name: test
user:
name: "{{ westos }}"
state: present
执行,很明显不可以
继续编辑test.yml文件
使用loop进行循环迭代任务
[lee@westos_ansible ansible]$ cat test.yml
---
- name: test
hosts: westos
vars_files:
- ./westos.yml
tasks:
- name: westos
user:
name: "{{ item }}"
state: present
loop:
"{{ westos }}"
执行成功
练习:安装vsftpd,httpd并且启动
编辑变量文件
[lee@westos_ansible ansible]$ cat install.yml
---
install:
- vsftpd
- httpd
编辑test.yml文件
[lee@westos_ansible ansible]$ cat test.yml
---
- name: test
hosts: westos
vars_files:
- ./install.yml
tasks:
- name: install
dnf:
name: "{{ install }}"
state: latest
- name: start service
service:
name: "{{ item }}"
state: restarted
enabled: yes
loop:
"{{ install }}"
执行成功
(3)在清单中使用变量
编辑test.yml和inventory
[lee@westos_ansible ansible]$ ansible-playbook test.yml
PLAY [test] *****************************************************************************************************************************************************************
TASK [Gathering Facts] ******************************************************************************************************************************************************
ok: [172.25.10.200]
TASK [user mode] ************************************************************************************************************************************************************
changed: [172.25.10.200]
PLAY RECAP ******************************************************************************************************************************************************************
172.25.10.200 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[lee@westos_ansible ansible]$ cat test.yml
---
- name: test
hosts: westos
tasks:
- name: user mode
user:
name: "{{ USER }}" 使用这个变量
state: present
[lee@westos_ansible ansible]$ cat inventory
[westos]
172.25.10.200
[westos:vars]
USER=test 变量是test
执行成功
(4)用命令覆盖变量
编辑文件
[lee@westos_ansible ansible]$ cat inventory
[westos]
172.25.10.200
[westos:vars]
USER=linux
[lee@westos_ansible ansible]$ cat test.yml
---
- name: test
hosts: westos
tasks:
- name: user mode
debug:
msg: "{{ USER }}"
本来根据变量debug要输出的时linux,但是我们可以通过命令来覆盖变量
(5)使用数组定义变量
编辑文件
[lee@westos_ansible ansible]$ cat userlist.yml
---
LIST:
- name: user1
path: /home/user1
- name: user2
path: /home/user2
[lee@westos_ansible ansible]$ cat test.yml
---
- name: test
hosts: westos
vars_files:
- ./userlist.yml
tasks:
- name: test
debug:
msg: "{{item.name}} {{item.path}}"
loop:
"{{LIST}}"
测试成功
(6)注册变量
编辑文件
[lee@westos_ansible ansible]$ cat test.yml
---
- name: test
hosts: westos
tasks:
- name: hostname
shell:
hostname
register: msg
- debug:
msg: "{{msg['stdout']}}"
将hostname产生的结果注册到msg中,再将msg中的stdout输出,就可以得到hostname的结果
(7)事实变量
事实变量是ansible在受控主机空自动检测出的变量 事实变量中还有与主机相关的信息
当需要使用主机的相关信息时不再需要采集赋值,直接调用即可 因为变量信息为系统信息,所以不能随意设定仅为采集信息,故被称为事实变量
ansible westos -m setup | less 查看受控主机的信息(westos是我清单中的受控主机)
编辑文件
[lee@westos_ansible ansible]$ cat test.yml
---
- name: test
hosts: all
gather_facts: yes yes 打开事实变量收集,默认为打开
tasks:
- debug:
msg: "{{ansible_facts['all_ipv4_addresses']}}"
执行,可以看到受控主机信息
(8)魔法变量
ansible的内嵌变量
ansible westos -m debug -a "var=hostvars" 查看ansible软件内部信息
ansible westos -m debug -a "var=group_names" 当前受管主机所在组
ansible westos -m debug -a "var=groups" 列出清单中所有的组和主机
ansible westos -m debug -a "var=inventory_hostname" 清单中配置的当前授管主机的名称
练习
显示所有受控主机中能够登陆的用户
awk -F ":" '/bash$/||/sh$/{print $1}' /etc/passwd 显示所有可以能登陆的用户
编辑文件
[lee@westos_ansible ansible]$ cat test.yml
---
- name: users who can log in
hosts: all
tasks:
- name: grep USERS
shell:
awk -F ":" '/bash$/||/sh$/{print $1}' /etc/passwd
register: USERS 使用注册变量
- name: show USERS
debug:
msg: "{{USERS['stdout_lines']}}"
4. Jinjia2模板
Jinja2是python的一种模板语言,是一种系统的完整的python模板语言。其设计思想来源于Django的模板引擎。 其中最显著的一个是增加了沙箱执行功能和可选的自动转义功能。
沙箱模式: 将代码与外界隔离,不管你在箱子里做什么,都不会污染到全局。
(1)Jinjia2模板书写规则
利用受控主机远程信息找到IP 找到主机名 编辑test.j2文件
[lee@westos_ansible ansible]$ cat test.j2
{{ansible_facts['enp1s0']['ipv4']['address']}} {{ansible_facts['fqdn']}}
编辑test.yml文件
[lee@westos_ansible ansible]$ cat test.yml
---
- name: test j2
hosts: westos
tasks:
- name: test j2
template:
src: ./test.j2
dest: /mnt/test
执行
查看
for循环
编辑文件
[lee@westos_ansible ansible]$ cat user.yml 变量文件
users:
- westos
- linux
- haha
[lee@westos_ansible ansible]$ cat test.j2
{% for NAME in users %} for循环
{{ NAME }}
{% endfor %}
[lee@westos_ansible ansible]$ cat test.yml
---
- name: test j2
hosts: westos
vars_files: ./user.yml
tasks:
- name: test j2
template: j2模板
src: ./test.j2
dest: /mnt/user_list
执行
查看生成的文件
还可以添加迭代,编辑文件
[lee@westos_ansible ansible]$ cat test.j2
{% for NAME in users %}
{{loop.index}} {{ NAME }}
{% endfor %}
执行看效果
if判定
编辑文件
[lee@westos_ansible ansible]$ cat user.yml
users:
- westos
- linux
- hello
[lee@westos_ansible ansible]$ cat test.j2
{% for NAME in users %}
{% if NAME in "linux" %} 如果有名字为linux
{{loop.index}} 输出迭代序号
{%endif%}
{% if NAME not in "linux" %} 如果没有
{{loop.index}} {{ NAME }} 输出序号和名字
{%endif%}
{% endfor %}
[lee@westos_ansible ansible]$ cat test.yml
---
- name: test j2
hosts: westos
vars_files: ./user.yml
tasks:
- name: test j2
template:
src: ./test.j2
dest: /mnt/user_list 输出到受控主机的目录下
执行并查看
5. Ansible的加密控制
ansible-vault create westos.yml 加密并生成westos.yml加密文件
ansible-vault view westos 查看加密文件
ansible-vault view --vault-password-file=pass westos 非交互式查看
ansible-vault edit westos 编辑加密文件
ansible-vault edit --vault-password-file=pass westos
ansible-vault decrypt westos 解密文件
ansible-vault decrypt westos --output=linux 解密文件到linux文件,源文件依然加密
ansible-vault rekey westos 修改密码
ansible-vault encrypt westos.yml 加密
ansible-playbook westos.yml --ask-vault-pass 输入密码执行
|