ansible的helloWorld

ansible 127.0.0.1 -m ping

通过类似helloWorld开始了解ansible的命令,上述命令是调用ansible的ping模块,ping 127.0.0.1这个地址。

再看另一条命令,-a 选项,代表-a选项用于传递模块所需要使用的参数

ansible testA -m fetch -a “src=/etc/fstab dest=/testdir/ansible/”

总结:

  • ansible 表示执行ansible命令

  • -m选项用于调用指定的模块

  • -a 选项用于传递模块所需要使用的参数

ansible 实用命令

  • 列出ansible所支持的模块 ansible-doc -l
  • 查看某个模块的详细参数及释义 ansible-doc -s 模块名称 ,比如想查看fetch模块的参数 ansible-doc -s fetch

ansible常用模块

  • copy模块: 从主控机把文件复制到被控主机上
  • file模块:可以帮助我们完成一些对文件的基本操作,比如,创建文件或目录、删除文件或目录、修改文件权限等。
  • lineinfile模块: 可以借助lineinfile模块,确保”某一行文本”存在于指定的文件中,或者确保从文件中删除指定的”文本”(即确保指定的文本不存在于文件中),还可以根据正则表达式,替换”某一行文本”。

playbook

上面的命令都是使用命令行方式挨个输入的,ansible提供了playbook剧本的方式可以执行多个任务。上面的ping写成playbook的如下

---
# 测试ansible脚本

- name: start ping
  hosts: consul
  tags:
    - test_ping_consul
  tasks:
    - name: ping consul
      ping:

name表示该任务名称,标记用。

hosts 是需要控制的机器,上述consul是在inventory.ini中配置好的(需要包含被控机地址、账户密码等)如下

[consul]
10.10.8.173 ansible_ssh_user="juzix" ansible_ssh_pass="123456" ansible_sudo_pass="123456"

tags 如果在一个playbook中写了多个task,而运行时又只想运行其中的某一个任务时,可以在脚本调用时通过参数指定要执行的那个tag如 ansible-playbook --tags=test_ping_consul test.yml

tasks表示要执行的任务,其中ping表示调用ansible的ping模块

playbook语法检查

ansible-playbook --syntax-check /testdir/ansible/test.yml

模拟运行

ansible-playbook --check test.yml

内置变量

解释参见 https://www.zsythink.net/archives/2715

  • ansible_version
  • hostvars
  • inventory_hostname
  • inventory_hostname_short
  • play_hosts
  • groups:通过groups内置变量可以获取到清单中”所有分组”的”分组信息”(inventory.ini中的分组,如[via][carrier][data]
  • group_names
  • inventory_dir

循环处理

with_items

”with_items”关键字会把返回的列表信息自动处理,将每一条信息单独放在一个名为”item”的变量中,我们只要获取到名为”item”变量的变量值,即可循环的获取到列表中的每一条信息.如:

---
- hosts: test70
  remote_user: root
  gather_facts: no
  tasks:
  - debug:
      msg: "{{item}}"
    with_items: "{{groups.ungrouped}}"

上例中,我们使用的是返回值中的信息,那么我们能不能自定义一个列表,然后循环使用列表中的值呢?必须能的,示例如下

---
- hosts: test70
  remote_user: root
  gather_facts: no
  tasks:
  - debug:
      msg: "{{item}}"
    with_items:
    - 1
    - 2
    - 3

或者我们换一种写法,如下写法与上述写法的效果完全相同

---
- hosts: test70
  remote_user: root
  gather_facts: no
  tasks:
  - debug:
      msg: "{{item}}"
    with_items: [ 1, 2, 3 ]

条件判断

when

在大多数语言中条件判断都是通过if关键字,但是在ansible中是使用when作为条件判断。而且这里需要注意的是,这里的ansible_distributionb变量是没有加大括号的 {{}},这是因为在when关键字中引用变量时,变量名不需要加”{{ }}”

---
- hosts: test70
  remote_user: root
  tasks:
  - debug:
      msg: "System release is centos"
    when: ansible_distribution == "CentOS"

上面的语句也比较好理解,即:当ansible_distribution == "CentOS" 的时候执行上面的debug模块,否则不执行。

过滤器

---
- hosts: test70
  remote_user: root
  gather_facts: no
  vars:
    testvar: 1a2b3c
  tasks:
  - debug:
      msg: "{{ testvar | upper }}"

如上例所示,testvar变量的值中包含三个小写字母,在使用debug模块输出这个变量的值时,我们使用了一个管道符,将testvar变量传递给了一个名为”upper”的东西,”upper”就是一个”过滤器”,执行上例playbook后你会发现,testvar中的所有小写字母都被变成了大写。

过滤器大部分是基于的是jinja2的语法,有些是ansible自己独有的,有关jinjia2的过滤器可以参见 jinjia2过滤器

可以简单理解为一些函数调用,而不是的意思,虽然大多数时候会放在when语句中,如:

    - name: Set data center address
      uri: 
        url: http://{{consul_leader_ip}}:{{consul_leader_port}}/v1/kv/metis/dataCenter_ip_port
        method: PUT
        body: "{{storage_ip}}_{{storage_port}}"
      when: 
        - ansible_host == consul_leader_ip 
        - enable_deploy_consul|default(false)
        - 404 == dataCenter_ip_port_content.status

其中的 enable_deploy_consul|default(false) 表示当enable_deploy_consul变量null时则取默认值false否则,取enable_deploy_consul变量本身的值。

jinja2模板

相当于freemarker、thymeleaf之类的只不过是python里面用来写模板文件的。使用模板可以快速完成程序配置文件的编写,比如:

# 调度服务相关配置文件模板
datadir: {{carrier_data_dir}}
verbosity: debug

# 调试模块
pprof: true
pprof-port: {{carrier_pprof_port}}
pprof-addr: {{carrier_pprof_ip}}
debug: true

# p2p 模块
# tls-cert: {{carrier_tls_cert}}
# tls-key: {{carrier_tls_key}}
# TLS方式,RSA证书 , gmtls国密 证书则为gmtls
p2p-encrypt-channel: gmtls
# tls根证书路径
p2p-tls-ca-cert: {{carrier_tls_rsa_root_crt}}
# tls私钥路径
p2p-tls-priv-key: {{carrier_tls_rsa_node_key}}
# tls证书路径
p2p-tls-cert: {{carrier_tls_rsa_node_crt}}
# 国密跟根证书路径
p2p-gm-ca-cert: {{carrier_gmtls_root_crt}}
# 国密签名证书路径
p2p-gm-sign-cert: {{carrier_gmtls_node_sign_crt}}
# 国密签名私钥路径
p2p-gm-sign-priv-key: {{carrier_gmtls_node_sign_key}}
# 国密加密证书路径
p2p-gm-encode-cert: {{carrier_gmtls_node_encode_cert}}
# 国密加密证书私钥路径
p2p-gm-encode-priv-key: {{carrier_gmtls_node_encode_key}}

disable-grpc-gateway: false
rpc-host: {{carrier_rpc_ip}}
rpc-port: {{carrier_rpc_port}}
grpc-gateway-host: {{carrier_grpc_gateway_ip}}
grpc-gateway-port: {{carrier_grpc_gateway_port}}
enable-debug-rpc-endpoints: true
no-discovery: true
bootstrap-node: []
p2p-udp-port: {{carrier_p2p_udp_port}}
p2p-tcp-port: {{carrier_p2p_tcp_port}}
p2p-local-ip: {{carrier_p2p_listen_ip}}
p2p-host-ip: {{carrier_external_ip}}
p2p-priv-key: {{carrier_p2p_private_key}}

# 注册中心信息
discovery-server-ip: {{consul_leader_ip}}
discovery-server-port: {{consul_leader_port}}

写完模板文件之后通过调用ansible的template即可生成对应的配置文件如:

template表示调用template模块

- name: "Generate carrier.yml configuration file based on carrier.yml.j2 template file"
  template:
    src: "carrier.yml.j2"
    dest: "{{ deploy_dir }}/carrier/config/carrier.yml"
    mode: 0600
    backup: yes

jinja2模板文件条件控制语句

在jinja2中,使用”{% %}”对控制语句进行包含,比如”if”控制语句、”for”循环控制语句等 都需要包含在”{% %}”中

  • If
{% if testnum > 3 %}
greater than 3
{% endif %}
  • If else

    {% if 条件一 %}
    ...
    {% elif 条件二 %}
    ...
    {% elif 条件N %}
    ...
    {% endif %}
    
  • for循环

    {% for i in [3,1,7,8,2] -%}
    {{ i }}
    {%- endfor %}
    
posted on 2022-05-11 10:46  falcon_fei  阅读(106)  评论(0)    收藏  举报