自动化运维工具-Ansible之4-变量
自动化运维工具-Ansible之4-变量
变量概述
变量提供了便捷的方式来管理Ansible playbook的每一个项目中的动态值,比如nginx-1.6.3这个软件包的版本,在其它地方或许会反复使用,那么如果将此值设置为变量,然后再在其他的playbook中调用,会方便许多。如此一来还方便维护,减少维护的成本。
定义变量的方式
1.通过命令行进行变量定义
2.在play文件中进行变量定义
3.通过Inventory主机信息文件中进行变量定义
变量的优先级
如果在定义变量时,变量冲突了
在上述的三个地方分别设置了:
1.命令行中:age=11
2.play文件中:age=12
3.Inventory中:age=13
那么,最终的age结果一定是11
变量的读取优先级为:
命令行 > playbook文件 > Inventory文件
变量的定义和调用
- 在playbook中通过vars定义变量,使用
"{{ }}"调用变量
# 方法一:
- hosts: web_group
vars:
packages:
- httpd
- mariadb-server
- php
- php-mysql
- php-pdo
tasks:
- name: Install httpd mariadb php Server
yum:
name: "{{ packages }}"
# 方法二:
- hosts: web_group
vars:
- web_server: httpd
- db_server: mariadb-server
- php_server: php,php-mysql,php-pdo
tasks:
- name: Install httpd mariadb php Server
yum:
name:
- "{{ web_server }}"
- "{{ db_server }}"
- "{{ php_server }}"
# 调用Ansible内置变量
- hosts: web_group
vars:
- remote_ip: "{{ ansible_default_ipv4['address'] }}"
- remote_hostname: "{{ ansible_fqdn }}"
tasks:
- name: Touch IP File
file:
path: /root/{{ remote_ip }}
state: touch
- name: Touch Hostname File
file:
path: /root/{{ remote_hostname }}
state: touch
# 使用with_items迭代循环,仅在当前name中生效
- name: add several users
user:
name: "{{ item.name }}"
state: present
groups: "{{ item.groups }}"
with_items:
- { name: 'testuser1', groups: 'wheel' }
- { name: 'testuser2', groups: 'root' }
- 在其他文件中定义变量,在playbook中使用vars_file调用定义文件,使用
"{{ }}"调用变量
刚才我们学到在playbook中使用vars定义变量,有一个缺陷,就是其他的playbook无法使用该变量。所以我们可以采取第二种定义变量的方式,在vars_file中定义变量。
# 定义阶段
[root@m01 ~]# cat > /etc/ansible/httpd/vars1.yml << EOF
web_server: httpd
EOF
[root@m01 ~]# cat > /etc/ansible/httpd/vars2.yml << EOF
db_server: mariadb-server
EOF
# 调用阶段
[root@m01 ~]# cat > /etc/ansible/httpd/vars.yml << EOF
- hosts: web_group
vars_files: ./vars1.yml
tasks:
- name: Install httpd mariadb php Server
yum:
name: "{{ web_server }}"
EOF
[root@m01 ~]# cat > /etc/ansible/httpd/vars.yml << EOF
- hosts: web_group
vars_files:
- ./vars1.yml
- ./vars2.yml
tasks:
- name: Install httpd mariadb php Server
yum:
name:
- "{{ web_server }}"
- "{{ db_server }}"
EOF
- 在Inventory中定义变量,在playbook中使用
"{{ }}"调用变量
注意:在Inventory中定义变量,主机的变量要高于主机组的变量,所以该方法不推荐使用,容易将环境弄乱。
# 定义阶段
[root@m01 ~]# vim /etc/ansible/hosts
[web_group]
web01 ansible_ssh_host=10.0.0.7
web02 ansible_ssh_host=10.0.0.8
[web_group:vars]
web_server=httpd
index_file=index.html
# 调用阶段
[root@m01 ~]# cat > /etc/ansible/httpd/vars.yml << EOF
- hosts: web_group
tasks:
- name: Install httpd Server
yum:
name: "{{ web_server }}"
- name: Touch File
file:
path: /tmp/{{ index_file }}
state: touch
EOF
- 官方推荐变量定义方法
之前的几种变量定义都不是很好用,比较好用的是在Ansible项目目录下创建两个变量目录:
host_vars
group_vars
切记,目录名字一定要一致,不能做任何修改。
在Ansible项目目录下创建两个变量目录``host_vars和group_vars`
host_vars目录下创建以主机名为文件名的配置文件
#定义阶段
[root@m01 ~]# mkdir /etc/ansible/httpd/host_vars
# 切记定义变量的文件必须以主机名为文件名
[root@m01 ~]# cat > /etc/ansible/httpd/host_vars/web01 << EOF
web_server: nginx
EOF
#调用阶段
[root@m01 ~]# cat > /etc/ansible/httpd/vars.yml << EOF
- hosts: web_group
tasks:
- name: Touch Hostname File
file:
path: /root/{{ web_server }}
state: touch
EOF
group_vars目录下创建以主机组名为文件名的配置文件
# 定义阶段
[root@m01 ~]# mkdir /etc/ansible/httpd/group_vars
# 切记定义变量的文件必须以组名为文件名
[root@m01 ~]# cat > /etc/ansible/httpd/group_vars/web_group << EOF
web_server: httpd
EOF
# 调用阶段
[root@m01 ~]# cat > /etc/ansible/httpd/vars.yml << EOF
- hosts: web_group
tasks:
- name: Touch Hostname File
file:
path: /root/{{ web_server }}
state: touch
EOF
- 命令行定义变量
命令行定义变量,Inventory中的变量会被playbook文件中的覆盖,这两种方式的变量都会被命令行直接指定变量所覆盖,使用--extra-vars或者-e设置变量
[root@m01 ~]# cat > /etc/ansible/httpd/vars.yml <<EOF
- hosts: web_group
tasks:
- name: Install httpd Server
yum:
name: "{{ web_server }}"
EOF
# 定义阶段
[root@m01 ~]# ansible-playbook /etc/ansible/httpd/vars.yml -e "web_server=vsftpd"
[root@m01 ~]# cat > /etc/ansible/httpd/vars.yml <<EOF
- hosts: web_group
tasks:
- name: Install httpd Server
yum:
name:
- "{{ web_server }}"
- "{{ db_server }}"
EOF
# 定义阶段
[root@m01 ~]# ansible-playbook /etc/ansible/httpd/vars.yml -e "web_server=vsftpd" -e "db_server=mariadb-server"
- 层级定义变量
# 编辑变量文件
[root@m01 ~]# cat > /etc/ansible/httpd/vars_file.yml <<EOF
lamp:
framework:
web_package: httpd
db_package: mariadb-server
php_package: php
lnmp:
framework:
web_package: nginx
db_package: mysql
php_package: php
lnmt:
framework:
web_package: nginx
db_package: mysql
java_package: tomcat
EOF
# 编辑playbook文件
[root@m01 ~]# cat > /etc/ansible/httpd/vars.yml <<EOF
- hosts: web_group
vars_files: ./vars_file.yml
tasks:
- name: Install LAMP httpd
yum:
name: "{{ lamp.framework.web_package }}"
- name: Install LAMP mariadb-server
yum:
name: "{{ lamp.framework.db_package }}"
- name: Install LAMP php
yum:
name: "{{ lamp.framework.php_package }}"
EOF
# 官方推荐写法
[root@m01 ~]# cat > /etc/ansible/httpd/vars.yml <<EOF
- hosts: web_group
vars_files: ./vars_file.yml
tasks:
- name: Install LAMP httpd
yum:
name: "{{ lamp['framework']['web_package'] }}"
- name: Install LAMP mariadb-server
yum:
name: "{{ lamp['framework']['db_package'] }}"
- name: Install LAMP php
yum:
name: "{{ lamp['framework']['php_package'] }}"
EOF
# 执行playbook
[root@m01 ~]# ansible-playbook /etc/ansible/httpd/vars.yml
PLAY [web_group] *****************************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************************************************************************************************************
ok: [web01]
ok: [web02]
TASK [Install LAMP httpd] ********************************************************************************************************************************************************************************************************************
ok: [web02]
ok: [web01]
TASK [Install LAMP mariadb-server] ***********************************************************************************************************************************************************************************************************
ok: [web02]
ok: [web01]
TASK [Install LAMP php] **********************************************************************************************************************************************************************************************************************
ok: [web02]
ok: [web01]
PLAY RECAP ***********************************************************************************************************************************************************************************************************************************
web01 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web02 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
变量优先级测试
主机清单:
[root@m01 ~]# cat > /etc/ansible/hosts <<EOF
[web_group]
web01 ansible_ssh_host=10.0.0.7
[web_group:vars]
filenamen=inventory
EOF
定义阶段:
# 定义playbook
[root@m01 ~]# cat > /etc/ansible/httpd/vars.yml <<EOF
- hosts: web_group
vars:
filename: vars
vars_files:
- ./vars1.yml
tasks:
- name: Touch vars File
file:
path: /tmp/{{ filename }}
state: touch
EOF
# 定义vars_files
[root@m01 ~]# cat > /etc/ansible/httpd/vars1.yml <<EOF
filename: vars_files
EOF
#定义group_vars中的web_group
[root@m01 ~]# cat > /etc/ansible/httpd/group_vars/web_group <<EOF
filename: group_vars_web_group
EOF
#定义host_vars中的web01
[root@m01 ~]# cat > /etc/ansible/httpd/host_vars/web01 <<EOF
filename: host_vars_web01
EOF
#定义group_vars中的all
[root@m01 ~]# cat > /etc/ansible/httpd/group_vars/all <<EOF
filename: group_vars_all
EOF
测试阶段:
# 1.命令行测试
[root@m01 ~]# ansible-playbook /etc/ansible/httpd/vars.yml -e "filename=vars_command"
# 查看到命令行定义的文件名
[root@web01 ~]# ll /opt/
total 0
-rw-r--r-- 1 root root 0 Sep 28 20:03 vars_command
# 2.正常执行playbook测试
[root@m01 ~]# ansible-playbook /etc/ansible/httpd/vars.yml
# 再次出现的是vars_files定义的内容
[root@web01 ~]# ll /opt/
total 0
-rw-r--r-- 1 root root 0 Sep 28 20:03 vars_command
-rw-r--r-- 1 root root 0 Sep 28 20:04 vars_files
# 3.取消调用vars_files
[root@m01 ~]# cat > /etc/ansible/httpd/vars.yml <<EOF
- hosts: web_group
vars:
filename: vars
tasks:
- name: Touch vars File
file:
path: /tmp/{{ filename }}
state: touch
EOF
# 正常执行playbook测试
[root@m01 ~]# ansible-playbook /etc/ansible/httpd/vars.yml
# 再次出现的是playbook定义的vars
[root@web01 ~]# ll /opt/
total 0
-rw-r--r-- 1 root root 0 Sep 28 20:07 vars
-rw-r--r-- 1 root root 0 Sep 28 20:03 vars_command
-rw-r--r-- 1 root root 0 Sep 28 20:04 vars_files
# 4.取消playbook定义的vars
[root@m01 ~]# cat > /etc/ansible/httpd/vars.yml <<EOF
- hosts: web_group
tasks:
- name: Touch vars File
file:
path: /tmp/{{ filename }}
state: touch
EOF
# 正常执行playbook测试
[root@m01 ~]# ansible-playbook /etc/ansible/httpd/vars.yml
# 再次出现的是host_vars目录下定义的内容
[root@web01 ~]# ll /tmp/
total 0
-rw-r--r-- 1 root root 0 Sep 28 20:08 host_vars_web01
-rw-r--r-- 1 root root 0 Sep 28 20:07 vars
-rw-r--r-- 1 root root 0 Sep 28 20:03 vars_command
-rw-r--r-- 1 root root 0 Sep 28 20:04 vars_files
# 5.清空host_vars目录
[root@m01 ~]# rm -rf /etc/ansible/httpd/host_vars/*
# 正常执行playbook测试
[root@m01 ~]# ansible-playbook /etc/ansible/httpd/vars.yml
# 再次出现的是group_vars目录中的web_group下定义的内容
[root@web01 ~]# ll /tmp/
total 0
-rw-r--r-- 1 root root 0 Sep 28 20:10 group_vars_web_group
-rw-r--r-- 1 root root 0 Sep 28 20:08 host_vars_web01
-rw-r--r-- 1 root root 0 Sep 28 20:07 vars
-rw-r--r-- 1 root root 0 Sep 28 20:03 vars_command
-rw-r--r-- 1 root root 0 Sep 28 20:04 vars_files
# 6.移除group_vars目录中的web_group
[root@m01 ~]# rm -rf /etc/ansible/httpd/group_vars/web_group
# 正常执行playbook测试
[root@m01 ~]# ansible-playbook /etc/ansible/httpd/vars.yml
# 最后出现的是group_vars目录中的all下定义的内容
[root@web01 ~]# ll /tmp/
total 0
-rw-r--r-- 1 root root 0 Sep 28 20:12 group_vars_all
-rw-r--r-- 1 root root 0 Sep 28 20:10 group_vars_web_group
-rw-r--r-- 1 root root 0 Sep 28 20:08 host_vars_web01
-rw-r--r-- 1 root root 0 Sep 28 20:07 vars
-rw-r--r-- 1 root root 0 Sep 28 20:03 vars_command
-rw-r--r-- 1 root root 0 Sep 28 20:04 vars_files
**结论: **
命令行 > vars_files > playbook vars > host_vars > group_vars/web_group>group_vars/all
变量优先级测试二
- 配置主机清单
[root@m01 ~]# cat > /etc/ansible/hosts <<EOF
[web_group]
web01 ansible_ssh_host=10.0.0.7
web02 ansible_ssh_host=10.0.0.8
[lb_group]
lb01 ansible_ssh_host=10.0.0.5
[lnmp_group:children]
web_group
lb_group
EOF
- 配置变量
[root@m01 ~]# cat > /etc/ansible/httpd/host_vars/web01 <<EOF
web: web01_host_vars
EOF
[root@m01 ~]# cat > /etc/ansible/httpd/group_vars/web_group <<EOF
web: web_group
EOF
[root@m01 ~]# cat > /etc/ansible/httpd/group_vars/lnmp_group <<EOF
web: lnmp_group
EOF
- 配置剧本调用变量
[root@m01 ~]# cat > /etc/ansible/httpd/host_vars/vars.yml <<EOF
- hosts: nginx_group
tasks:
- name: Mkdir dir
file:
path: /tmp/{{web}}
state: directory
EOF
- 执行并查看结果
[root@m01 ~]# ansible-playbook /etc/ansible/httpd/vars.yml
[root@web01 ~]# ll /tmp
total 0
drwxr-xr-x 2 root root 6 Sep 28 19:00 web01_host_vars
[root@web02 ~]# ll /tmp
total 0
drwxr-xr-x 2 root root 6 Sep 28 19:00 web_group
[root@lb01 ~]# ll /tmp/
drwxr-xr-x 2 root root 6 Sep 28 19:00 lnmp_group
- 结论:
定义的变量优先级:host_vars>group_vars/web_group>group_vars/lnmp_group:children
变量注册
当absible的模块在运行之后,其实都会返回一些result结果,就像是执行脚本,我们有的时候需要脚本给我们一些return返回值,我们才知道,上一步是否可以执行成功,但是...默认情况下,ansible的result并不会显示出来,所以,我们可以把这些返回值'存储'到变量中,这样我们就能通过'调用'对应的变量名,从而获取到这些result,这种将模块的返回值,写入到变量中的方法被称为变量注册。
示例:
# 编辑剧本
[root@m01 ~]# cat > /etc/ansible/httpd/register.yml <<EOF
- hosts: web_group
tasks:
- name: Test Register Vars
shell: "ls -l /"
EOF
# 执行查看结果
[root@m01 ~]# ansible-playbook /etc/ansible/httpd/register.yml
PLAY [web_group] *****************************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************************************************************************************************************
ok: [web02]
ok: [web01]
TASK [Test Register Vars] ********************************************************************************************************************************************************************************************************************
changed: [web01]
changed: [web02]
PLAY RECAP ***********************************************************************************************************************************************************************************************************************************
web01 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web02 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
如上执行结果可见,当我们使用shell模块执行ls -l /时,ansible给我们返回的只有changed。
我们无法看到执行之后的结果,所以此时我们需要使用到变量注册。
- hosts: 主机
tasks:
- name: Vars
shell: 动作
register: 变量名
- name: DeBug OUT
debug:
msg: 调用变量
修改剧本:
# 编辑剧本 变量注册 "{{ list_dir }}"
[root@m01 ~]# cat > /etc/ansible/httpd/register.yml <<EOF
- hosts: web_group
tasks:
- name: Test Register Vars
shell: "ls -l /"
register: list_dir
- name: Return Result
debug:
msg: "{{ list_dir }}"
EOF
# 执行查看结果
[root@m01 ~]# ansible-playbook /etc/ansible/httpd/register.yml
PLAY [web_group] *****************************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************************************************************************************************************
ok: [web01]
ok: [web02]
TASK [Test Register Vars] ********************************************************************************************************************************************************************************************************************
changed: [web01]
changed: [web02]
TASK [Return Result] *************************************************************************************************************************************************************************************************************************
ok: [web01] => {
"msg": {
"changed": true,
"cmd": "ls -l /",
"delta": "0:00:00.005536",
"end": "2019-09-16 11:52:16.492946",
"failed": false,
"rc": 0,
"start": "2019-09-16 11:52:16.487410",
"stderr": "",
"stderr_lines": [],
"stdout": "总用量 28\nlrwxrwxrwx. 1 root root 7 3月 9 2019 bin -> usr/bin\ndr-xr-xr-x. 5 root root 4096 3月 9 2019 boot\ndrwxr-xr-x. 20 root root 3280 9月 8 12:25 dev\ndrwxr-xr-x. 80 root root 8192 9月 10 20:52 etc\ndrwxr-xr-x. 5 root root 41 9月 8 16:22 home\nlrwxrwxrwx. 1 root root 7 3月 9 2019 lib -> usr/lib\nlrwxrwxrwx. 1 root root 9 3月 9 2019 lib64 -> usr/lib64\ndrwxr-xr-x. 2 root root 6 4月 11 2018 media\ndrwxr-xr-x. 2 root root 6 4月 11 2018 mnt\ndrwxr-xr-x. 2 www www 6 9月 10 15:31 opt\ndr-xr-xr-x. 128 root root 0 9月 8 12:25 proc\ndr-xr-x---. 9 root root 4096 9月 10 21:16 root\ndrwxr-xr-x. 25 root root 740 9月 10 20:52 run\nlrwxrwxrwx. 1 root root 8 3月 9 2019 sbin -> usr/sbin\ndrwxr-xr-x. 2 root root 6 4月 11 2018 srv\ndr-xr-xr-x. 13 root root 0 9月 8 12:25 sys\ndrwxrwxrwt. 15 root root 4096 9月 16 11:52 tmp\ndrwxr-xr-x. 13 root root 155 3月 9 2019 usr\ndrwxr-xr-x. 21 root root 4096 9月 10 20:52 var",
"stdout_lines": [
"总用量 28",
"lrwxrwxrwx. 1 root root 7 3月 9 2019 bin -> usr/bin",
"dr-xr-xr-x. 5 root root 4096 3月 9 2019 boot",
"drwxr-xr-x. 20 root root 3280 9月 8 12:25 dev",
"drwxr-xr-x. 80 root root 8192 9月 10 20:52 etc",
"drwxr-xr-x. 5 root root 41 9月 8 16:22 home",
"lrwxrwxrwx. 1 root root 7 3月 9 2019 lib -> usr/lib",
"lrwxrwxrwx. 1 root root 9 3月 9 2019 lib64 -> usr/lib64",
"drwxr-xr-x. 2 root root 6 4月 11 2018 media",
"drwxr-xr-x. 2 root root 6 4月 11 2018 mnt",
"drwxr-xr-x. 2 www www 6 9月 10 15:31 opt",
"dr-xr-xr-x. 128 root root 0 9月 8 12:25 proc",
"dr-xr-x---. 9 root root 4096 9月 10 21:16 root",
"drwxr-xr-x. 25 root root 740 9月 10 20:52 run",
"lrwxrwxrwx. 1 root root 8 3月 9 2019 sbin -> usr/sbin",
"drwxr-xr-x. 2 root root 6 4月 11 2018 srv",
"dr-xr-xr-x. 13 root root 0 9月 8 12:25 sys",
"drwxrwxrwt. 15 root root 4096 9月 16 11:52 tmp",
"drwxr-xr-x. 13 root root 155 3月 9 2019 usr",
"drwxr-xr-x. 21 root root 4096 9月 10 20:52 var"
]
}
}
ok: [web02] => {
"msg": {
"changed": true,
"cmd": "ls -l /",
"delta": "0:00:00.005813",
"end": "2019-09-16 11:52:16.495422",
"failed": false,
"rc": 0,
"start": "2019-09-16 11:52:16.489609",
"stderr": "",
"stderr_lines": [],
"stdout": "总用量 24\nlrwxrwxrwx. 1 root root 7 3月 9 2019 bin -> usr/bin\ndr-xr-xr-x. 5 root root 4096 3月 9 2019 boot\ndrwxr-xr-x. 20 root root 3260 9月 10 09:47 dev\ndrwxr-xr-x. 80 root root 8192 9月 10 20:52 etc\ndrwxr-xr-x. 5 root root 41 9月 8 16:22 home\nlrwxrwxrwx. 1 root root 7 3月 9 2019 lib -> usr/lib\nlrwxrwxrwx. 1 root root 9 3月 9 2019 lib64 -> usr/lib64\ndrwxr-xr-x. 2 root root 6 4月 11 2018 media\ndrwxr-xr-x. 2 root root 6 4月 11 2018 mnt\ndrwxr-xr-x. 2 www www 6 9月 10 15:31 opt\ndr-xr-xr-x. 128 root root 0 8月 15 15:10 proc\ndr-xr-x---. 6 root root 180 9月 10 21:16 root\ndrwxr-xr-x. 25 root root 740 9月 10 20:52 run\nlrwxrwxrwx. 1 root root 8 3月 9 2019 sbin -> usr/sbin\ndrwxr-xr-x. 2 root root 6 4月 11 2018 srv\ndr-xr-xr-x. 13 root root 0 8月 15 15:10 sys\ndrwxrwxrwt. 14 root root 4096 9月 16 11:52 tmp\ndrwxr-xr-x. 13 root root 155 3月 9 2019 usr\ndrwxr-xr-x. 21 root root 4096 9月 10 20:52 var",
"stdout_lines": [
"总用量 24",
"lrwxrwxrwx. 1 root root 7 3月 9 2019 bin -> usr/bin",
"dr-xr-xr-x. 5 root root 4096 3月 9 2019 boot",
"drwxr-xr-x. 20 root root 3260 9月 10 09:47 dev",
"drwxr-xr-x. 80 root root 8192 9月 10 20:52 etc",
"drwxr-xr-x. 5 root root 41 9月 8 16:22 home",
"lrwxrwxrwx. 1 root root 7 3月 9 2019 lib -> usr/lib",
"lrwxrwxrwx. 1 root root 9 3月 9 2019 lib64 -> usr/lib64",
"drwxr-xr-x. 2 root root 6 4月 11 2018 media",
"drwxr-xr-x. 2 root root 6 4月 11 2018 mnt",
"drwxr-xr-x. 2 www www 6 9月 10 15:31 opt",
"dr-xr-xr-x. 128 root root 0 8月 15 15:10 proc",
"dr-xr-x---. 6 root root 180 9月 10 21:16 root",
"drwxr-xr-x. 25 root root 740 9月 10 20:52 run",
"lrwxrwxrwx. 1 root root 8 3月 9 2019 sbin -> usr/sbin",
"drwxr-xr-x. 2 root root 6 4月 11 2018 srv",
"dr-xr-xr-x. 13 root root 0 8月 15 15:10 sys",
"drwxrwxrwt. 14 root root 4096 9月 16 11:52 tmp",
"drwxr-xr-x. 13 root root 155 3月 9 2019 usr",
"drwxr-xr-x. 21 root root 4096 9月 10 20:52 var"
]
}
}
PLAY RECAP ***********************************************************************************************************************************************************************************************************************************
web01 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web02 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
# 只输出自己想要的内容 "{{ list_dir.stdout_lines }}"
[root@m01 ~]# cat > /etc/ansible/httpd/register.yml <<EOF
- hosts: web_group
tasks:
- name: Test Register Vars
shell: "ls -l /"
register: list_dir
- name: Return Result
debug:
msg: "{{ list_dir.stdout_lines }}"
EOF
# 执行查看结果
[root@m01 ~]# ansible-playbook /etc/ansible/httpd/register.yml
PLAY [web_group] *****************************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************************************************************************************************************
ok: [web02]
ok: [web01]
TASK [Test Register Vars] ********************************************************************************************************************************************************************************************************************
changed: [web01]
changed: [web02]
TASK [Return Result] *************************************************************************************************************************************************************************************************************************
ok: [web01] => {
"msg": [
"总用量 28",
"lrwxrwxrwx. 1 root root 7 3月 9 2019 bin -> usr/bin",
"dr-xr-xr-x. 5 root root 4096 3月 9 2019 boot",
"drwxr-xr-x. 20 root root 3280 9月 8 12:25 dev",
"drwxr-xr-x. 80 root root 8192 9月 10 20:52 etc",
"drwxr-xr-x. 5 root root 41 9月 8 16:22 home",
"lrwxrwxrwx. 1 root root 7 3月 9 2019 lib -> usr/lib",
"lrwxrwxrwx. 1 root root 9 3月 9 2019 lib64 -> usr/lib64",
"drwxr-xr-x. 2 root root 6 4月 11 2018 media",
"drwxr-xr-x. 2 root root 6 4月 11 2018 mnt",
"drwxr-xr-x. 2 www www 6 9月 10 15:31 opt",
"dr-xr-xr-x. 128 root root 0 9月 8 12:25 proc",
"dr-xr-x---. 9 root root 4096 9月 10 21:16 root",
"drwxr-xr-x. 25 root root 740 9月 10 20:52 run",
"lrwxrwxrwx. 1 root root 8 3月 9 2019 sbin -> usr/sbin",
"drwxr-xr-x. 2 root root 6 4月 11 2018 srv",
"dr-xr-xr-x. 13 root root 0 9月 8 12:25 sys",
"drwxrwxrwt. 15 root root 4096 9月 16 11:54 tmp",
"drwxr-xr-x. 13 root root 155 3月 9 2019 usr",
"drwxr-xr-x. 21 root root 4096 9月 10 20:52 var"
]
}
ok: [web02] => {
"msg": [
"总用量 24",
"lrwxrwxrwx. 1 root root 7 3月 9 2019 bin -> usr/bin",
"dr-xr-xr-x. 5 root root 4096 3月 9 2019 boot",
"drwxr-xr-x. 20 root root 3260 9月 10 09:47 dev",
"drwxr-xr-x. 80 root root 8192 9月 10 20:52 etc",
"drwxr-xr-x. 5 root root 41 9月 8 16:22 home",
"lrwxrwxrwx. 1 root root 7 3月 9 2019 lib -> usr/lib",
"lrwxrwxrwx. 1 root root 9 3月 9 2019 lib64 -> usr/lib64",
"drwxr-xr-x. 2 root root 6 4月 11 2018 media",
"drwxr-xr-x. 2 root root 6 4月 11 2018 mnt",
"drwxr-xr-x. 2 www www 6 9月 10 15:31 opt",
"dr-xr-xr-x. 128 root root 0 8月 15 15:10 proc",
"dr-xr-x---. 6 root root 180 9月 10 21:16 root",
"drwxr-xr-x. 25 root root 740 9月 10 20:52 run",
"lrwxrwxrwx. 1 root root 8 3月 9 2019 sbin -> usr/sbin",
"drwxr-xr-x. 2 root root 6 4月 11 2018 srv",
"dr-xr-xr-x. 13 root root 0 8月 15 15:10 sys",
"drwxrwxrwt. 14 root root 4096 9月 16 11:54 tmp",
"drwxr-xr-x. 13 root root 155 3月 9 2019 usr",
"drwxr-xr-x. 21 root root 4096 9月 10 20:52 var"
]
}
PLAY RECAP ***********************************************************************************************************************************************************************************************************************************
web01 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web02 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
debug模块常用参数
msg: # 调试输出的消息
var: # 将某个任务执行的输出作为变量传递给debug模块,debug会直接将其打印输出
verbosity: # debug的级别(默认是0级,全部显示)
facts缓存
Ansible facts是在被管理主机上通过Ansible自动采集发现的变量。facts包含每台特定的主机信息。比如:被控端的主机名、IP地址、系统版本、CPU数量、内存状态、磁盘状态等等。
facts使用场景
- 通过
facts缓存检查CPU,来生成对应的nginx配置文件 - 通过
facts缓存检查主机名,生成不同的zabbix配置文件 - 通过
facts缓存检索物理机的内存大小来生成不通的mysql配置文件
综上所述,Ansible facts类似于saltstack中的grains,对于做自动化的小伙伴是非常有用滴。
facts基本用法
编辑剧本
[root@m01 ~]# vim facts.yml
- hosts: web_group
tasks:
- name: Get Host Info
debug:
msg: >
Hostname "{{ ansible_fqdn }}" and IP "{{ ansible_default_ipv4.address }}"
执行
[root@m01 ~]# ansible-playbook facts.yml
PLAY [web_group] *****************************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************************************************************************************************************
ok: [web02]
ok: [web01]
TASK [Get Host Info] *************************************************************************************************************************************************************************************************************************
ok: [web01] => {
"msg": "Hostname \"web01\" and IP \"10.0.0.7\"\n"
}
ok: [web02] => {
"msg": "Hostname \"web02\" and IP \"10.0.0.8\"\n"
}
PLAY RECAP ***********************************************************************************************************************************************************************************************************************************
web01 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web02 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
关闭facts
[root@m01 ~]# vim facts.yml
- hosts: web_group
gather_facts: no # 关闭信息采集
tasks:
...
facts生成zabbix配置文件
- hosts: web_group
vars:
- zabbix_server: 172.16.1.71
tasks:
- name: copy zabbix agent conf
template:
src: ./zabbix_agentd.conf
dest: /tmp/zabbix_agentd.conf
template在拷贝时能够传递Ansible定义的变量到文件中,copy不能
facts生成mysqld配置文件
- hosts: db_group
tasks:
- name: Install mysql server
yum:
name: mariadb-server
state: present
- name: copy mysql conf
template:
src: ./my.cnf
dest: /etc/my.cnf
[root@m01 ~]# vim /etc/my.cnf
[mysqld]
basedir=/usr
datadir=/var/lib/mysql/
socket=/var/lib/mysql/mysql.sock
log_error=/var/log/mariadb/mariadb.log
innodb_buffer_pool_size={{ ansible_memtotal_mb * 0.8 }}
自动化运维工具-Ansible之4-变量的更多相关文章
- 自动化运维工具Ansible详细部署 (转载)
自动化运维工具Ansible详细部署 标签:ansible 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://sofar.blog. ...
- 自动化运维工具-Ansible之7-roles
自动化运维工具-Ansible之7-roles 目录 自动化运维工具-Ansible之7-roles Ansible Roles基本概述 Ansible Roles目录结构 Ansible Roles ...
- 自动化运维工具-Ansible之6-Jinja2模板
自动化运维工具-Ansible之6-Jinja2模板 目录 自动化运维工具-Ansible之6-Jinja2模板 Ansible Jinja2模板概述 Ansible Jinja2模板使用 Ansib ...
- 自动化运维工具-Ansible之5-流程控制
自动化运维工具-Ansible之5-流程控制 目录 自动化运维工具-Ansible之5-流程控制 playbook条件语句 单条件 多条件 多条件运算 示例 playbook循环语句 with_ite ...
- 自动化运维工具-Ansible之3-playbook
自动化运维工具-Ansible之3-playbook 目录 自动化运维工具-Ansible之3-playbook PlayBook初识 YAML语法 PlayBook部署httpd PlayBook实 ...
- 自动化运维工具-Ansible之2-ad-hoc
自动化运维工具-Ansible之2-ad-hoc 目录 自动化运维工具-Ansible之2-ad-hoc Ansible ad-hoc Ansible命令模块 Ansible软件管理模块 Ansibl ...
- 自动化运维工具-Ansible之1-基础
自动化运维工具-Ansible之1-基础 目录 自动化运维工具-Ansible之1-基础 Ansible 基本概述 定义 特点 架构 工作原理 任务执行模式 命令执行过程 Ansible 安装 Ans ...
- 自动化运维工具Ansible详细部署 - 人生理想在于坚持不懈 - 51CTO技术博客
自动化运维工具Ansible详细部署 - 人生理想在于坚持不懈 - 51CTO技术博客 自动化运维工具Ansible详细部署
- CentOS7Linux中自动化运维工具Ansible的安装,以及通过模块批量管理多台主机
使用自动化运维工具Ansible集中化管理服务器 Ansible概述 Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具.它用Python写成,类似于saltstack和Puppet ...
随机推荐
- MongoEngine模块
今儿,接到老的的要求,要把新功能的数据存放在Mongo里.虽然一直都有听过Mango的鼎鼎大名,但是那也只是见过没用过,跟个小白没啥区别.在加上功能急需,没办法只能赶鸭子上架先上再说.下面这篇就是我赶 ...
- nodejs事件和事件循环简介
目录 简介 事件 事件循环 事件循环的阻塞 事件循环举例 栈和消息队列 作业队列和promise process.nextTick() setImmediate() setInterval() 简介 ...
- 第9.9节 Python文件随机读写定位操作方法seek
类似于C语言,Python也提供了文件位置定位的操作方法seek. 一. 语法 seek(offset, whence=SEEK_SET) 语法释义: 1)offset :将文件当前操作位置移动偏移量 ...
- PyQt(Python+Qt)学习随笔:QListWidgetItem的构造方法
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QListWidgetItem对象专门用于作为QListWidget对象的一个项. QListWid ...
- 当你在浏览器输入一个网址(如http://www.taobao.com),按回车之后发生了什么?
首先你输入了一个网址并按下了回车,这个时候浏览器会根据这个URL去查找其对应的IP,具体过程如下: 首先是查找浏览器缓存,浏览器会保存一段时间你之前访问过的一些网址的DNS信息,不同浏览器保存的时常不 ...
- SPFA算法优化
前言 \(SPFA\) 通常在稀疏图中运行效率高于 \(Dijkstra\) ,但是也容易被卡. 普通的 \(SPFA\) 时间复杂度为 \(O(km)\) ,其中 \(k\) 是一条边松弛其端点点的 ...
- 【科技】位运算(bitset)优化最长公共子序列算法
最长公共子序列(LCS)问题 你有两个字符串 \(A,B\),字符集为 \(\Sigma\),求 \(A, B\) 的最长公共子序列. 简单动态规划 首先有一个广为人知的 dp:\(f_{i,j}\) ...
- 三、git学习之——管理修改、撤销修改、删除文件
一.管理修改 现在,假定你已经完全掌握了暂存区的概念.下面,我们要讨论的就是,为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件. 你会问,什么是修改?比如你新增了一行, ...
- Tensorflow学习笔记No.11
图像定位 图像定位是指在图像中将我们需要识别的部分使用定位框进行定位标记,本次主要讲述如何使用tensorflow2.0实现简单的图像定位任务. 我所使用的定位方法是训练神经网络使它输出定位框的四个顶 ...
- [从源码学设计]蚂蚁金服SOFARegistry之推拉模型
[从源码学设计]蚂蚁金服SOFARegistry之推拉模型 目录 [从源码学设计]蚂蚁金服SOFARegistry之推拉模型 0x00 摘要 0x01 相关概念 1.1 推模型和拉模型 1.1.1 推 ...