内容大纲
附注: 变量优先级:
-e传参 > playbook(vars_file > vars) > host_vars > group_vars > group_all_vars
1 play中vars定义变量
1.1 在 vars 中直接定义, 整个 – hosts : 中都可以使用
- hosts: all
gather_facts: False #设置为false,那么下面的debug模块会生效
vars: # 先申明vars这个关键字
aaaa: "aaaabbbb" #用key: value的形式定义变量
bbbb: "bbbbaaaa"
tasks:
- name: task_1
debug: msg="The {{ inventory_hostname }} value_aaaa is {{ aaaa }}"
- name: task_2
debug: msg="The {{ inventory_hostname }} value_bbbb is {{ bbbb }}"
# 上边儿 inventory_hostname 是个内置变量,会表明执行当前任务的主机
1.2 将vars单独指定为文件,方便其他yml调用
- hosts: all
gather_facts: False #设置为false,那么下面的debug模块会生效
vars_files: # 声明vars保存的路径,文件中变量以键值对指明
- ./vars_pub1.yml
- ./vars_pub2.yml
tasks:
- name: task_1
debug: msg="The {{ inventory_hostname }} value_aaaa is {{ aaaa }}"
- name: task_2
debug: msg="The {{ inventory_hostname }} value_bbbb is {{ bbbb }}"
# 上边儿 inventory_hostname 是个内置变量,会表明执行当前任务的主机
2 在主机清单中定义变量:
2.1 host文件中直接定义 (几乎不用)
- hosts: all
gather_facts: False #设置为false,那么下面的debug模块会生效
tasks:
- name: task_1
debug: msg="The {{ inventory_hostname }} value_aaaa is {{ aaaa }}"
- name: task_2
debug: msg="The {{ inventory_hostname }} value_bbbb is {{ bbbb }}"
# 上边儿 inventory_hostname 是个内置变量,会表明执行当前任务的主机
2.2 官方推荐,上述方法改进
在项目目录中创建2个目录 group_vars 和 host_vars
在group_vars 中, 文件名为组名; 此外有个默认的特殊组 all ,
在host_vars 中, 文件名为主机名
匹配的优先级:
host主机变量 > group组变量 > all组变量
- hosts: group_a
gather_facts: False #设置为false,那么下面的debug模块会生效
tasks:
- name: task_1
debug: msg="The {{ inventory_hostname }} value_aaaa is {{ aaaa }}"
- name: task_2
debug: msg="The {{ inventory_hostname }} value_bbbb is {{ bbbb }}"
- name: task_3
debug: msg="The {{ inventory_hostname }} value_cccc is {{ cccc }}"
# 上边儿 inventory_hostname 是个内置变量,会表明执行当前任务的主机
3 通过playbook -e 传入参数: (临时测试用,优先级最高)
- hosts: "{{ hosts_ttt }}"
gather_facts: False #设置为false,那么下面的debug模块会生效
tasks:
- name: task_1
debug: msg="The {{ inventory_hostname }} value_aaaa is {{ aaaa }}"
4 register 变量
例如在playbook中使用shell模块执行命令, 虽然命令可以执行,但是不返回任何信息
此时需要用到 register 定义一个变量,将执行结果传入该变量中, 随后用debug模块输出
- hosts: "group_a"
tasks:
- name: 'install nginx'
yum:
name: nginx
state: present
- name: 'nginx start'
service:
name: nginx
state: started
- name: 'check nginx status'
shell: 'ps -ef |grep nginx'
register: 'check_nginx' # 定义变量,shell执行的所有信息将赋值给该变量
- name: 'OutPut Status'
debug:
msg: "{{ check_nginx.stdout_lines }}" # 调用stdout_lines 方法,输出命令行执行结果
# 除此之外,还有很多方法,
msg中除了stdout_lines这个方法外,还有其他几个可用的方法
changed : 状态改变 (shell模块只要执行,状态必定改变)
cmd: shell命令
delta:
end: 结束时间
failed: 是否失败
rc: 返回状态码
start: 开始时间
stderr: 错误输出
stderr_lines: 错误输出(列表格式)
stdout: 标准输出
stdout_lines: 标准输出(列表格式)
5 facts变量
ansible facts主要是用于获取远程系统的数据,从而可以在playbook中作为变量使用。
通常facts分为2类:
① 由Ansible中的 setup 模块自动发现的
② 用户自定义的 facts
如果远程受管理的机器有一个 “/etc/ansible/facts.d” 目录, 那么在该目录中任何以 ”.fact”结尾的文件都可以在Ansible中提供局部facts.
这些文件可以是JSON,INI或者任何可以返回JSON的可执行文件.
5.1 关闭facts
如果不需要获取任何被控主机信息,为了提升playbook执行速度,可以将facts关闭
- hosts: group_a
gather_facts: false
5.2 例: 生成自定义facts
5.2.1 本地创建文件来定义
例如创建一个 /etc/ansible/facts.d/perferences.fact文件:
[test_tt]
aaaa=1
bbbb=2
这将产生一个名为 “test” 的哈希表fact, 里面成员有 ‘aaaa’ 和 ‘bbbb’. 可以这样验证:
ansible -m setup -a "filter=ansible_local"
然后会看到有以下fact被添加:
"ansible_local": {
"preferences": {
"test_tt": {
"aaaa" : "1",
"bbbb" : "2"
}
}
}
而且也可以在template或palybook中访问该数据:
{{ ansible_local.preferences.test_tt.aaaa }}
{{ ansible_local.preferences.test_tt.bbbb }}
5.2.2 通过playbook,为其他主机添加本地facts
本地命名空间放置其它用户提供的fact或者playbook中定义的变量覆盖系统facts值。
注: 如果有一个playook,它自定义了一个fact,若要正常使用,则需要重新运行setup模块
若不运行setup, 那只能在下一个play中才能获取到这些自定义的fact信息
# 创建要推送给所有主机的fact文件
cat > test_tt.facts << EOF
[test_tt]
aaaa=1
bbbb=2
EOF
- hosts: webservers
tasks:
- name: create facts directory # 创建默认的facts目录
file: state=directory recurse=yes path=/etc/ansible/facts.d
- name: copy fact file # 将test_tt.fact文件复制过去
copy: src=test_tt.fact dest=/etc/ansible/facts.d
- name: re-read facts after adding custom fact # 重新加载setup模块,更新上述定义的facts
setup: filter=ansible_local
5.3 例: 使用内置facts搭配template模块, 为不同的nginx主机创建其专属配置文件
获取不同主机的cpu数,将其设置为 worker_processes 的值
5.3.1 获取facts内置的变量的名称及调用路径
# 随便获取一个主机的信息(也可以是自身),将其写入文件,方便后续查找各种内置变量
[root@opt_host project1]# ansible host_1 -m "setup" -i ./hosts > ./setup.txt
# 上图中命令
ansible host_1 -m setup -a "filter=ansible_processor_vcpus" -i ./hosts
5.3.2 准备配置文件template
# 创建template目录
mkdir -pv template
# 复制nginx配置文件
cp -a /etc/nginx/nginx.conf ./template/nginx.conf.j2
# 修改需要变化的部分
5.3.3 编写playbook
---
- hosts: group_a
remote_user: root
tasks:
- name: install nginx
yum:
name: nginx
state: latest
- name: add group
group:
name: nginx
state: present
- name: add user
user:
name: nginx
group: nginx
- name: config
template:
src: ./template/nginx.conf.j2
dest: /etc/nginx/nginx.conf
owner: nginx
group: nginx
mode: '0644'
- name: start nginx
service:
name: nginx
state: started
- name: check worker_processes
shell: "ps -ef |grep nginx"
register: "wk_pcs" # 定义变量,用于存储执行结果
- name: debug worker_processes
debug:
msg: "{{ wk_pcs.stdout_lines }}" # 输出变量中内容
5.3.4 结果验证
可以看到,不同的主机生成了不同数量的worker process进程