• Ansible定义各类变量,引用变量方式介绍及注册变量和vars_prompt的用法示例


    目录

    一.Ansible定义变量

    1.用途

    2.定义规则

    3.变量优先级

    二.命令行定义变量

    三.定义主机和主机组变量

    1.主机变量

    (1)内置主机变量

    (2)简单示例

    2.主机组变量

    四.定义playbook变量

    1.通过vars表示定义变量,通过' "{{变量名}}" '来引用变量

    2.通过vars_file指定变量文件

    五.定义host_vars和group_vars目录变量

    1.主机组变量使用group_vars

    2.主机变量只用host_vars

    3.以主机变量简单为例演示

    六.注册变量

    七.vars_prompt交互变量

    1.参数解析

    2.简单交互案例

    3.创建用户和密码示例

    (1)encrypt

    (2)confirm

    八.引用变量

    1.引用简单定义的变量

    2.引用较为复杂定义的变量


     

    一.Ansible定义变量

    1.用途

    ansible的变量主要用于存储在整个项目中重复使用的一些值,来提高创建任务和维护节点的效率

    2.定义规则

    变量名由字母、数字、下划线组成,由字母开头

    内置关键字不能作为变量名

    3.变量优先级

    全局范围内命令行-e设置的变量>清单中的ssh变连接变量等>playbook及其相关配置vars和vars_file>清单中短的其他变量>facts变量>角色role定义的变量

    二.命令行定义变量

    如上文所述,命令行使用"-e '变量名=值' "设置的变量优先级最高,下面举例演示命令行变量覆盖playbook中的变量

    1. [root@main ~]# cat abc.yaml
    2. ---
    3. - hosts: webservers
    4. vars:
    5.   myservice: httpd   #原本playbook内容为停掉httpd
    6. tasks:
    7.   - name: test1
    8.     service:
    9.       name: "{{ myservice }}"
    10.       state: stopped
    11. [root@main ~]# ansible-playbook abc.yaml -e 'myservice=chronyd'
    12. #运行时指定变量更改为关掉chronyd
    13. [root@main ~]# ansible webservers -m shell -a 'systemctl status httpd | grep Active'
    14. serverb | CHANGED | rc=0 >>
    15.   Active: active (running) since Tue 2023-10-17 14:06:57 CST; 5h 22min ago
    16. servera | CHANGED | rc=0 >>
    17.   Active: active (running) since Tue 2023-10-17 19:25:46 CST; 3min 12s ago
    18. [root@main ~]# ansible webservers -m shell -a 'systemctl status chronyd | grep Active'
    19. serverb | CHANGED | rc=0 >>
    20.   Active: inactive (dead) since Tue 2023-10-17 19:28:30 CST; 35s ago
    21. servera | CHANGED | rc=0 >>
    22.   Active: inactive (dead) since Tue 2023-10-17 19:28:30 CST; 35s ago
    23. #运行结果可以看出,停掉httpd未生效,停chonyd生效,命令行给定变量优先级高于playbook给定变量优先级

    三.定义主机和主机组变量

    1.主机变量

    (1)内置主机变量

    在变量前加上"ansible_"即成为内置变量

    部分内置主机关于ssh和提权的变量举例

    1. ansible_ssh_host:指定受管节点主机真实IP地址
    2. ansible_ssh_port:指定通过哪个端口连接受管节点
    3. ansible_ssh_user:指定连接时使用的用户名称
    4. ansibe_connection:指定ssh连接类型,local、ssh、paramiko
    5. ansible_ssh_pass:ssh连接时使用的密码
    6. ansible_ssh_executable:指定ssh指定的路径
    7. ansible_become:允许特权升级,等同于ansible_sudo,ansible_su
    8. ansible_become_user:提权到哪个用户,等同于ansible_sudo_user,ansible_su_user
    9. ansbile_become_pass:需要密码时指定密码,等同于ansible_sudo_pass
    10. ansible_sudo_exec:指定sudo命令路径

    (2)简单示例

    1. [student@workstation ~]$ vim user.yml
    2. #不属于任何组的用户
    3. 192.168.2.190 ansible_ssh_user=root ansible_user_pass='redhat'
    4. 192.168.2.191 ansible_ssh_user=root ansible_user_pass='su123'

    2.主机组变量

    如上例,将两台受管节点相等的部分定义为一个变量

    1. [student@workstation ~]$ vim user.yml
    2. 192.168.2.190 ansible_ssh_user=root ansible_user_pass='redhat'
    3. 192.168.2.191 ansible_ssh_user=root ansible_user_pass='su123'
    4. #更改为
    5. 192.168.2.190 ansible_user_pass='redhat'
    6. 192.168.2.191 ansible_user_pass='su123'
    7. [webservers:vars]
    8. ansible_ssh_user=root

    四.定义playbook变量

    1.通过vars表示定义变量,通过' "{{变量名}}" '来引用变量

    1. [root@localhost ~]# cat httpd.yaml
    2. ---
    3. - name: install httpd chrony
    4. hosts: webservers
    5. vars:   #声明在此处定义变量
    6.   mypackages:     #变量名
    7.     - httpd
    8.     - chrony
    9.   myhttpd: httpd
    10.   mychronyd: chronyd
    11. tasks:
    12.   - name: install them
    13.     yum:
    14.       name: "{{ mypackages }}"   #使用变量
    15.       state: present
    16.   - name: start httpd
    17.     service:
    18.       name: "{{ myhttpd }}"
    19.       state: started
    20.   - name: start chronyd
    21.     service:
    22.       name: "{{ mychronyd }}"
    23.       state: started
    24. [root@localhost ~]# ansible webservers -m shell -a 'systemctl status httpd | grep Active'
    25. serverb | CHANGED | rc=0 >>
    26.   Active: active (running) since Tue 2023-10-17 14:06:57 CST; 3min 45s ago
    27. servera | CHANGED | rc=0 >>
    28.   Active: active (running) since Tue 2023-10-17 14:06:57 CST; 3min 45s ago
    29. [root@localhost ~]# ansible webservers -m shell -a 'systemctl status chronyd | grep Active'
    30. servera | CHANGED | rc=0 >>
    31.   Active: active (running) since Tue 2023-10-17 13:29:27 CST; 41min ago
    32. serverb | CHANGED | rc=0 >>
    33.   Active: active (running) since Tue 2023-10-17 13:31:57 CST; 38min ago

    2.通过vars_file指定变量文件

    1. [root@main ~]# cat myvar1.yaml   #vars文件也使用yaml格式
    2. packages:
    3. - rpcbind
    4. - openssl
    5.  
    6. [root@main ~]# cat httpd1.yaml
    7. ---
    8. - name: install rpcbind openssl
    9. hosts: webservers
    10. tasks:
    11.   - name: install them
    12.     yum:
    13.       name: "{{ packages }}"   #同样这样使用变量
    14.       state: present
    15. vars_files:   #指定vars文件
    16.   - myvar1.yaml   #指定你自己的vars问文件位置,这里是当前路径下的myvars1.yaml文件
    17. [root@main ~]# ansible-playbook httpd1.yaml --syntax-check
    18. playbook: httpd1.yaml
    19. [root@main ~]# ansible-playbook httpd1.yaml
    20. [root@main ~]# ansible webservers -m shell -a 'yum list installed | grep rpcbind'
    21. servera | CHANGED | rc=0 >>
    22. rpcbind.x86_64                       0.2.0-49.el7                     @base    
    23. serverb | CHANGED | rc=0 >>
    24. rpcbind.x86_64                       0.2.0-49.el7                     @base    
    25. [root@main ~]# ansible webservers -m shell -a 'yum list installed | grep openssl'
    26. servera | CHANGED | rc=0 >>
    27. openssl.x86_64                       1:1.0.2k-19.el7                 @anaconda
    28. openssl-libs.x86_64                   1:1.0.2k-19.el7                 @anaconda
    29. xmlsec1-openssl.x86_64               1.2.20-7.el7_4                   @anaconda
    30. serverb | CHANGED | rc=0 >>
    31. openssl.x86_64                       1:1.0.2k-19.el7                 @anaconda
    32. openssl-libs.x86_64                   1:1.0.2k-19.el7                 @anaconda
    33. xmlsec1-openssl.x86_64               1.2.20-7.el7_4                   @anaconda

    五.定义host_vars和group_vars目录变量

    1.主机组变量使用group_vars

    group_vars是一个目录,这个名称固定,必须是和你的inventory文件和ansible.cfg文件位于同一级目录,其下创建的文件需要和你主机清单中的组名称一致,在这个文件中写入变量和值

    2.主机变量只用host_vars

    host_vars和group_vars相同,也是一个目录,名称固定,必须和inventory文件和ansible.cfg文件位于同一级目录,其下创建的文件需要和你主机清单中的主机名称一致(清单文件中写的是主机名就写=用主机名,是IP地址就用IP地址),在这个文件中写入变量和值

    3.以主机变量简单为例演示

    1. [root@main ~]# tree /root
    2. /root
    3. ├── anaconda-ks.cfg
    4. ├── ansible.cfg
    5. ├── group_vars
    6. │   ├── dbservers
    7. │   └── webservers
    8. ├── host_vars
    9. │   ├── servera
    10. │   └── serverb
    11. ├── httpd1.yaml
    12. ├── httpd.yaml
    13. ├── myhosts
    14. ├── myhttpd.yaml
    15. └── myvar1.yaml
    16. [root@main ~]# cat host_vars/servera
    17. aname: httpd
    18. [root@main ~]# cat host_vars/serverb
    19. bname: mod_ssl
    20. [root@main ~]# cat myhttpd.yaml
    21. ---
    22. - name: stop servera httpd
    23. hosts: servera
    24. tasks:
    25.   - name: stop it
    26.     service:
    27.       name: "{{ aname }}"     #在剧本中就可以直接用用定义好的主机变量
    28.       state: stopped
    29. - name: install serverb mod_ssl
    30. hosts: serverb
    31. tasks:
    32.   - name: install it
    33.     yum:
    34.       name: "{{ bname }}"
    35.       state: present
    36. [root@main ~]# ansible-playbook myhttpd.yaml --syntax-check
    37. playbook: myhttpd.yaml
    38. [root@main ~]# ansible-playbook myhttpd.yaml
    39. [root@main ~]# ansible servera -m shell -a 'systemctl status httpd | grep Active'
    40. servera | CHANGED | rc=0 >>
    41.   Active: inactive (dead)
    42. [root@main ~]# ansible serverb -m shell -a 'yum list installed | grep mod_ssl'
    43. serverb | CHANGED | rc=0 >>
    44. mod_ssl.x86_64                       1:2.4.6-99.el7.centos.1         @updates

    六.注册变量

    注册变量主要是使用register来捕获命令的输出,将其保存在一个临时变量中,便于进行特定操作。

    如下例,将"id su"的结果注册为"su",并使用debug模块输出su的内容,并在playbook执行后的debug结果中判断出该用户是否存在

    1. [root@main ~]# cat iduser.yaml
    2. ---
    3. - name: is su exist
    4. hosts: webservers
    5. tasks:
    6.   - name: test su
    7.     shell: id su
    8.     register: su
    9.     ignore_errors: yes   #便于测试,忽略错误
    10.   - name: echo it
    11.     debug:
    12.       msg: "{{ su }}"
    13. [root@main ~]# ansible-playbook iduser.yaml
    14. PLAY [is su exist] ******************************************************************************************************************************
    15. TASK [Gathering Facts] **************************************************************************************************************************
    16. ok: [servera]
    17. ok: [serverb]
    18. TASK [test su] **********************************************************************************************************************************
    19. changed: [servera]
    20. changed: [serverb]
    21. TASK [echo it] **********************************************************************************************************************************
    22. ok: [servera] => {
    23.   "msg": {
    24.       "changed": true,
    25.       "cmd": "id su",
    26.       "delta": "0:00:00.004109",
    27.       "end": "2023-10-17 19:05:47.215481",
    28.       "failed": false,
    29.       "rc": 0,   #为0表示存在,非0不存在
    30.       "start": "2023-10-17 19:05:47.211372",
    31.       "stderr": "",
    32.       "stderr_lines": [],
    33.       "stdout": "uid=1000(su) gid=1000(su) groups=1000(su)",   #有会输出该用户的详细信息,没有会提示不存在此用户
    34.       "stdout_lines": [
    35.           "uid=1000(su) gid=1000(su) groups=1000(su)"
    36.       ]
    37.   }
    38. }
    39. ok: [serverb] => {
    40.   "msg": {
    41.       "changed": true,
    42.       "cmd": "id su",
    43.       "delta": "0:00:00.004695",
    44.       "end": "2023-10-17 19:05:47.220915",
    45.       "failed": false,
    46.       "rc": 0,
    47.       "start": "2023-10-17 19:05:47.216220",
    48.       "stderr": "",
    49.       "stderr_lines": [],
    50.       "stdout": "uid=1000(su) gid=1000(su) groups=1000(su)",
    51.       "stdout_lines": [
    52.           "uid=1000(su) gid=1000(su) groups=1000(su)"
    53.       ]
    54.   }
    55. }
    56. PLAY RECAP **************************************************************************************************************************************
    57. servera                   : ok=3   changed=1   unreachable=0   failed=0   skipped=0   rescued=0   ignored=0  
    58. serverb                   : ok=3   changed=1   unreachable=0   failed=0   skipped=0   rescued=0   ignored=0  

    七.vars_prompt交互变量

    用于交互提示用户输入值

    1.参数解析

    prompt表示对用户的提示信息

    private表示用户在输入时是否隐藏输入的信息

    default表示如果用户没有输入,则此项的默认值

    2.简单交互案例

    1. [root@main ~]# cat register.yaml
    2. ---
    3. - hosts: webservers
    4. vars_prompt:
    5.   - name: "one"
    6.     prompt: "请输入第一个值"
    7.     private: no
    8.   - name: "two"
    9.     prompt: "请输入第二个值"
    10.     #default: 'hello'
    11.     private: yes
    12. tasks:
    13.   - name: dis one value
    14.     debug: msg="{{one}}"
    15.   - name: dis two value
    16.     debug: msg="{{two}}"
    17. #测试结果
    18. [root@main ~]# ansible-playbook register.yaml
    19. 请输入第一个值: nihao
    20. 请输入第二个值:             #private为yes,此处我输入时会隐藏信息
    21. PLAY [webservers] *******************************************************************************************************************************
    22. TASK [Gathering Facts] **************************************************************************************************************************
    23. ok: [servera]
    24. ok: [serverb]
    25. TASK [dis one value] ****************************************************************************************************************************
    26. ok: [servera] => {
    27.   "msg": "nihao"
    28. }
    29. ok: [serverb] => {
    30.   "msg": "nihao"
    31. }
    32. TASK [dis two value] ****************************************************************************************************************************
    33. ok: [servera] => {       #显示输入的信息
    34.   "msg": "hello"
    35. }
    36. ok: [serverb] => {
    37.   "msg": "hello"
    38. }
    39. PLAY RECAP **************************************************************************************************************************************
    40. servera                   : ok=3   changed=0   unreachable=0   failed=0   skipped=0   rescued=0   ignored=0  
    41. serverb                   : ok=3   changed=0   unreachable=0   failed=0   skipped=0   rescued=0   ignored=0  

    3.创建用户和密码示例

    (1)encrypt

    可以指定在密码处可以指定使用sha512对密码进行哈希加密

    (2)confirm

    可以设置重复确认密码,两次密码不符合会报“* VALUES ENTERED DO NOT MATCH ”

    1. [root@main ~]# cat register1.yaml
    2. ---
    3. - hosts: webservers
    4. vars_prompt:
    5.   - name: "name"
    6.     prompt: "enter user_name"
    7.     private: no
    8.   - name: "passwd"
    9.     prompt: "enter user_passwd"
    10.     private: yes
    11.     #encrypt: "sha512_crypt"  
    12.     #confirm: yes          
    13. tasks:
    14.   - name: create him
    15.     user:
    16.       name: "{{ name }}"
    17.       password: "{{ passwd }}"
    18. [root@main ~]# ansible-playbook register1.yaml
    19. enter user_name: sulibao
    20. enter user_passwd:
    21. [WARNING]: Found variable using reserved name: name
    22. PLAY [webservers] *******************************************************************************************************************************
    23. TASK [Gathering Facts] **************************************************************************************************************************
    24. ok: [serverb]
    25. ok: [servera]
    26. TASK [create him] *******************************************************************************************************************************
    27. [WARNING]: The input password appears not to have been hashed. The 'password' argument must be encrypted for this module to work properly.
    28. changed: [serverb]
    29. changed: [servera]
    30. PLAY RECAP **************************************************************************************************************************************
    31. servera                   : ok=2   changed=1   unreachable=0   failed=0   skipped=0   rescued=0   ignored=0  
    32. serverb                   : ok=2   changed=1   unreachable=0   failed=0   skipped=0   rescued=0   ignored=0  
    33. [root@main ~]# ansible webservers -a 'id sulibao'
    34. serverb | CHANGED | rc=0 >>
    35. uid=1001(sulibao) gid=1001(sulibao) groups=1001(sulibao)
    36. servera | CHANGED | rc=0 >>
    37. uid=1001(sulibao) gid=1001(sulibao) groups=1001(sulibao)
    38. #未加密的密码
    39. [root@main ~]# ansible webservers -m shell -a 'cat /etc/shadow | grep sulibao'
    40. serverb | CHANGED | rc=0 >>
    41. sulibao:ansible:19647:0:99999:7:::
    42. servera | CHANGED | rc=0 >>
    43. sulibao:ansible:19647:0:99999:7:::
    44. #加密后
    45. [root@main ~]# ansible webservers -m shell -a 'cat /etc/shadow | grep li'
    46. serverb | CHANGED | rc=0 >>
    47. sulibao:ansible:19647:0:99999:7:::
    48. li:$6$U0qiY4DnzK8AWcBe$rIFmtpCr.1qU3sxtv90U2bRaZbxgqj1PK9UV4wp6W8zWXigHTfcfuFjJ0AvCZMb0Xe75juLlarm94xNZUnoCX.:19647:0:99999:7:::
    49. servera | CHANGED | rc=0 >>
    50. sulibao:ansible:19647:0:99999:7:::
    51. li:$6$U0qiY4DnzK8AWcBe$rIFmtpCr.1qU3sxtv90U2bRaZbxgqj1PK9UV4wp6W8zWXigHTfcfuFjJ0AvCZMb0Xe75juLlarm94xNZUnoCX.:19647:0:99999:7:::

    八.引用变量

    1.引用简单定义的变量

    1. [root@main ~]# cat myvar1.yaml
    2. packages:               #类似于定义了一个列表形式的变量
    3. - rpcbind
    4. - openssl
    5. [root@main ~]# cat httpd1.yaml
    6. ---
    7. - name: install rpcbind openssl
    8. hosts: webservers
    9. tasks:
    10.   - name: install them
    11.     yum:
    12.       name: "{{ packages }}"   #就直接通过“ "{{变量名}}" ”来引用
    13.       state: present
    14. vars_files:
    15.   - myvar1.yaml

    2.引用较为复杂定义的变量

    1. [root@main ~]# cat myvar2.yaml
    2. su:           #定义了一个层层嵌套的变量
    3. name:
    4.   tname: sulibao
    5.   fname: libaosu
    6. [root@main ~]# cat echo.yaml
    7. ---
    8. - hosts: webservers
    9. tasks:
    10.   - name: echo something
    11.     debug:
    12.       msg: "{{ su.name.fname }}"         #需要使用嵌套定义的变量时,需要使用"."或者"[]"来表示一层一层地引用
    13.       #msg: "{{ su['name']['fname'] }}"
    14. vars_files:
    15.   - myvar2.yaml
    16. #运行查看结果
    17. [root@main ~]# ansible-playbook echo.yaml
    18. PLAY [webservers] *******************************************************************************************************************************
    19. TASK [Gathering Facts] **************************************************************************************************************************
    20. ok: [serverb]
    21. ok: [servera]
    22. TASK [echo something] ***************************************************************************************************************************
    23. ok: [servera] => {
    24.   "msg": "libaosu"
    25. }
    26. ok: [serverb] => {
    27.   "msg": "libaosu"
    28. }
    29. PLAY RECAP **************************************************************************************************************************************
    30. servera                   : ok=2   changed=0   unreachable=0   failed=0   skipped=0   rescued=0   ignored=0  
    31. serverb                   : ok=2   changed=0   unreachable=0   failed=0   skipped=0   rescued=0   ignored=0  

     

     

     

     

     

  • 相关阅读:
    UNet网络制作
    基于springboot在线考试报名系统毕业设计源码031706
    UE5:如何解决背景图片被拉伸的问题?
    Java抽象类快速入门
    18张图,我发现了国庆节的赚钱效应...
    LQ0045 煤球数目【迭代】
    pip 安装 livetest 失败
    Javascript知识【JS-Math对象&JS-DOM对象】
    而今迈步从头越|nacos逼我在mac上重新安装java8与环境变量的配置
    如何获取美团的热门商品和服务
  • 原文地址:https://blog.csdn.net/weixin_64334766/article/details/133893115